@@ -713,17 +713,29 @@ func (proxy *Proxy) processIncomingQuery(
713713 // Initialize plugin state
714714 pluginsState := NewPluginsState (proxy , clientProto , clientAddr , serverProto , start )
715715
716- // Get server info and initialize parameters
717- serverName := "-"
718- needsEDNS0Padding := false
719- serverInfo := proxy .serversInfo .getOne ()
720- if serverInfo != nil {
721- serverName = serverInfo .Name
722- needsEDNS0Padding = (serverInfo .Proto == stamps .StampProtoTypeDoH || serverInfo .Proto == stamps .StampProtoTypeTLS )
723- }
724-
725- // Apply query plugins
726- query , _ = pluginsState .ApplyQueryPlugins (& proxy .pluginsGlobals , query , needsEDNS0Padding )
716+ var serverInfo * ServerInfo
717+ var serverName string = "-"
718+
719+ // Apply query plugins with lazy server selection
720+ query , _ = pluginsState .ApplyQueryPlugins (
721+ & proxy .pluginsGlobals ,
722+ query ,
723+ func () (* ServerInfo , bool ) {
724+ // Only get server info once when actually needed
725+ if serverInfo == nil {
726+ serverInfo = proxy .serversInfo .getOne ()
727+ if serverInfo != nil {
728+ serverName = serverInfo .Name
729+ }
730+ }
731+ if serverInfo == nil {
732+ return nil , false
733+ }
734+ needsPadding := (serverInfo .Proto == stamps .StampProtoTypeDoH ||
735+ serverInfo .Proto == stamps .StampProtoTypeTLS )
736+ return serverInfo , needsPadding
737+ },
738+ )
727739 if ! validateQuery (query ) {
728740 return response
729741 }
@@ -753,29 +765,37 @@ func (proxy *Proxy) processIncomingQuery(
753765 }
754766
755767 // Process query with a DNS server if there's no cached response
756- if len (response ) == 0 && serverInfo != nil {
757- pluginsState .serverName = serverName
768+ // Note: if serverInfo is still nil here, we need to get it
769+ if len (response ) == 0 {
770+ if serverInfo == nil {
771+ serverInfo = proxy .serversInfo .getOne ()
772+ if serverInfo != nil {
773+ serverName = serverInfo .Name
774+ }
775+ }
776+ if serverInfo != nil {
777+ pluginsState .serverName = serverName
758778
759- // Exchange DNS request with the server
760- exchangeResponse , err := handleDNSExchange (proxy , serverInfo , & pluginsState , query , serverProto )
779+ exchangeResponse , err := handleDNSExchange (proxy , serverInfo , & pluginsState , query , serverProto )
761780
762- // Update server statistics for WP2 strategy
763- success := (err == nil && exchangeResponse != nil )
764- proxy .serversInfo .updateServerStats (serverName , success )
781+ // Update server statistics for WP2 strategy
782+ success := (err == nil && exchangeResponse != nil )
783+ proxy .serversInfo .updateServerStats (serverName , success )
765784
766- if err != nil || exchangeResponse == nil {
767- return response
768- }
785+ if err != nil || exchangeResponse == nil {
786+ return response
787+ }
769788
770- response = exchangeResponse
789+ response = exchangeResponse
771790
772- // Process the response through plugins
773- processedResponse , err := processPlugins (proxy , & pluginsState , query , serverInfo , response )
774- if err != nil {
775- return response
776- }
791+ // Process the response through plugins
792+ processedResponse , err := processPlugins (proxy , & pluginsState , query , serverInfo , response )
793+ if err != nil {
794+ return response
795+ }
777796
778- response = processedResponse
797+ response = processedResponse
798+ }
779799 }
780800
781801 // Validate the response before sending
0 commit comments