@@ -1129,6 +1129,7 @@ func _fetchODoHTargetInfo(proxy *Proxy, name string, stamp stamps.ServerStamp, i
11291129 }
11301130
11311131 workingConfigs := make ([]ODoHTargetConfig , 0 )
1132+ var lastProbeErr error
11321133 rand .Shuffle (len (odohTargetConfigs ), func (i , j int ) {
11331134 odohTargetConfigs [i ], odohTargetConfigs [j ] = odohTargetConfigs [j ], odohTargetConfigs [i ]
11341135 })
@@ -1137,13 +1138,23 @@ func _fetchODoHTargetInfo(proxy *Proxy, name string, stamp stamps.ServerStamp, i
11371138
11381139 odohQuery , err := odohTargetConfig .encryptQuery (dohTestPacket (0xcafe ).Data )
11391140 if err != nil {
1141+ lastProbeErr = fmt .Errorf ("failed to encrypt ODoH probe: %w" , err )
11401142 continue
11411143 }
11421144
11431145 useGet := false
1144- if _ , _ , _ , _ , err := proxy .xTransport .ObliviousDoHQuery (useGet , url , odohQuery .odohMessage , proxy .timeout ); err != nil {
1146+ _ , postStatusCode , _ , _ , postErr := proxy .xTransport .ObliviousDoHQuery (useGet , url , odohQuery .odohMessage , proxy .timeout )
1147+ if postErr != nil {
11451148 useGet = true
1146- if _ , _ , _ , _ , err := proxy .xTransport .ObliviousDoHQuery (useGet , url , odohQuery .odohMessage , proxy .timeout ); err != nil {
1149+ _ , getStatusCode , _ , _ , getErr := proxy .xTransport .ObliviousDoHQuery (useGet , url , odohQuery .odohMessage , proxy .timeout )
1150+ if getErr != nil {
1151+ lastProbeErr = fmt .Errorf (
1152+ "ODoH relay probe via POST and GET failed: POST HTTP status %d: %w; GET HTTP status %d: %w" ,
1153+ postStatusCode ,
1154+ postErr ,
1155+ getStatusCode ,
1156+ getErr ,
1157+ )
11471158 continue
11481159 }
11491160 dlog .Debugf ("Server [%s] doesn't appear to support POST; falling back to GET requests" , name )
@@ -1152,6 +1163,7 @@ func _fetchODoHTargetInfo(proxy *Proxy, name string, stamp stamps.ServerStamp, i
11521163 queryMsg := dohNXTestPacket (0xcafe )
11531164 odohQuery , err = odohTargetConfig .encryptQuery (queryMsg .Data )
11541165 if err != nil {
1166+ lastProbeErr = fmt .Errorf ("failed to encrypt ODoH DNS probe: %w" , err )
11551167 continue
11561168 }
11571169
@@ -1162,14 +1174,20 @@ func _fetchODoHTargetInfo(proxy *Proxy, name string, stamp stamps.ServerStamp, i
11621174 proxy .timeout ,
11631175 )
11641176 if err != nil {
1177+ lastProbeErr = fmt .Errorf ("ODoH DNS probe failed with HTTP status %d: %w" , responseCode , err )
11651178 continue
11661179 }
11671180 if responseCode == 401 {
1168- return ServerInfo {}, fmt .Errorf ("Configuration changed during a probe" )
1181+ return ServerInfo {}, fmt .Errorf ("configuration changed during ODoH probe" )
1182+ }
1183+ if responseCode < 200 || responseCode >= 300 {
1184+ lastProbeErr = fmt .Errorf ("ODoH DNS probe returned HTTP status %d" , responseCode )
1185+ continue
11691186 }
11701187 serverResponse , err := odohQuery .decryptResponse (responseBody )
11711188 if err != nil {
11721189 dlog .Warnf ("Unable to decrypt response from [%v]: [%v]" , name , err )
1190+ lastProbeErr = fmt .Errorf ("failed to decrypt ODoH DNS probe response: %w" , err )
11731191 continue
11741192 }
11751193 workingConfigs = append (workingConfigs , odohTargetConfig )
@@ -1259,7 +1277,10 @@ func _fetchODoHTargetInfo(proxy *Proxy, name string, stamp stamps.ServerStamp, i
12591277 odohTargetConfigs : workingConfigs ,
12601278 }, nil
12611279 }
1262- return ServerInfo {}, fmt .Errorf ("No valid network configuration for [%v]" , name )
1280+ if lastProbeErr != nil {
1281+ return ServerInfo {}, fmt .Errorf ("ODoH initialization probe failed for [%v]: %w" , name , lastProbeErr )
1282+ }
1283+ return ServerInfo {}, fmt .Errorf ("no valid ODoH configuration for [%v]" , name )
12631284}
12641285
12651286func fetchODoHTargetInfo (proxy * Proxy , name string , stamp stamps.ServerStamp , isNew bool ) (ServerInfo , error ) {
@@ -1270,7 +1291,9 @@ func fetchODoHTargetInfo(proxy *Proxy, name string, stamp stamps.ServerStamp, is
12701291 if err == nil {
12711292 break
12721293 }
1273- dlog .Infof ("Trying to fetch the [%v] configuration again" , name )
1294+ if i < 2 {
1295+ dlog .Infof ("Retrying ODoH initialization for [%v] after failure: [%v]" , name , err )
1296+ }
12741297 }
12751298 return serverInfo , err
12761299}
0 commit comments