Skip to content

Commit 63203c3

Browse files
committed
Improve ODoH diagnostics
1 parent 37920d1 commit 63203c3

2 files changed

Lines changed: 53 additions & 6 deletions

File tree

dnscrypt-proxy/query_processing.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,14 @@ func processODoHQuery(
210210

211211
return response, nil
212212
} else if responseCode == 401 || (responseCode == 200 && len(responseBody) == 0) {
213+
dlog.Warnf(
214+
"ODoH request for [%v] needs a key refresh via [%v]: HTTP status [%d], response length: %d, transport error: [%v]",
215+
serverInfo.Name,
216+
targetURL,
217+
responseCode,
218+
len(responseBody),
219+
err,
220+
)
213221
if responseCode == 200 {
214222
dlog.Warnf("ODoH relay for [%v] is buggy and returns a 200 status code instead of 401 after a key update", serverInfo.Name)
215223
}
@@ -231,7 +239,23 @@ func processODoHQuery(
231239
}
232240
}
233241
} else {
234-
dlog.Warnf("Failed to receive successful response from [%v]", serverInfo.Name)
242+
if err != nil {
243+
dlog.Warnf(
244+
"ODoH request for [%v] failed via [%v]: HTTP status [%d], transport error: [%v]",
245+
serverInfo.Name,
246+
targetURL,
247+
responseCode,
248+
err,
249+
)
250+
} else {
251+
dlog.Warnf(
252+
"ODoH request for [%v] failed via [%v]: HTTP status [%d], response length: %d",
253+
serverInfo.Name,
254+
targetURL,
255+
responseCode,
256+
len(responseBody),
257+
)
258+
}
235259
}
236260

237261
pluginsState.returnCode = PluginsReturnCodeNetworkError

dnscrypt-proxy/serversInfo.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

12651286
func 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

Comments
 (0)