test_trr_extended_error.js (7438B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 trr_test_setup(); 8 registerCleanupFunction(async () => { 9 trr_clear_prefs(); 10 }); 11 12 function makeChan(url) { 13 let chan = NetUtil.newChannel({ 14 uri: url, 15 loadUsingSystemPrincipal: true, 16 }).QueryInterface(Ci.nsIHttpChannel); 17 return chan; 18 } 19 20 function channelOpenPromise(chan) { 21 return new Promise(resolve => { 22 function finish(req, buffer) { 23 resolve([req, buffer]); 24 } 25 chan.asyncOpen(new ChannelListener(finish)); 26 }); 27 } 28 29 let trrServer; 30 add_task(async function setup() { 31 trrServer = new TRRServer(); 32 registerCleanupFunction(async () => { 33 await trrServer.stop(); 34 }); 35 await trrServer.start(); 36 dump(`port = ${trrServer.port()}\n`); 37 let chan = makeChan(`https://localhost:${trrServer.port()}/test?bla=some`); 38 let [, resp] = await channelOpenPromise(chan); 39 equal(resp, "<h1> 404 Path not found: /test</h1>"); 40 41 Services.dns.clearCache(true); 42 Services.prefs.setIntPref("network.trr.mode", 2); 43 Services.prefs.setCharPref( 44 "network.trr.uri", 45 `https://foo.example.com:${trrServer.port()}/dns-query` 46 ); 47 }); 48 49 add_task(async function test_extended_error_1() { 50 await trrServer.registerDoHAnswers("something.foo", "A", { 51 answers: [ 52 { 53 name: "something.foo", 54 ttl: 55, 55 type: "A", 56 flush: false, 57 data: "1.2.3.4", 58 }, 59 ], 60 }); 61 62 await new TRRDNSListener("something.foo", { expectedAnswer: "1.2.3.4" }); 63 64 await trrServer.registerDoHAnswers("a.foo", "A", { 65 answers: [], 66 additionals: [ 67 { 68 name: ".", 69 type: "OPT", 70 class: "IN", 71 options: [ 72 { 73 code: "EDNS_ERROR", 74 extended_error: 17, // Filtered 75 text: "DNSSec bogus", 76 }, 77 ], 78 }, 79 ], 80 flags: 2, // SERVFAIL 81 }); 82 83 // Check that we don't fall back to DNS 84 let { inStatus } = await new TRRDNSListener("a.foo", { 85 expectedSuccess: false, 86 }); 87 Assert.ok( 88 !Components.isSuccessCode(inStatus), 89 `${inStatus} should be an error code` 90 ); 91 }); 92 93 add_task(async function test_extended_error_filtered() { 94 await trrServer.registerDoHAnswers("b.foo", "A", { 95 answers: [], 96 additionals: [ 97 { 98 name: ".", 99 type: "OPT", 100 class: "IN", 101 options: [ 102 { 103 code: "EDNS_ERROR", 104 extended_error: 17, // Filtered 105 text: "Filtered", 106 }, 107 ], 108 }, 109 ], 110 }); 111 112 // Check that we don't fall back to DNS 113 let { inStatus } = await new TRRDNSListener("b.foo", { 114 expectedSuccess: false, 115 }); 116 Assert.ok( 117 !Components.isSuccessCode(inStatus), 118 `${inStatus} should be an error code` 119 ); 120 }); 121 122 add_task(async function test_extended_error_not_ready() { 123 await trrServer.registerDoHAnswers("c.foo", "A", { 124 answers: [], 125 additionals: [ 126 { 127 name: ".", 128 type: "OPT", 129 class: "IN", 130 options: [ 131 { 132 code: "EDNS_ERROR", 133 extended_error: 14, // Not ready 134 text: "Not ready", 135 }, 136 ], 137 }, 138 ], 139 }); 140 141 // For this code it's OK to fallback 142 await new TRRDNSListener("c.foo", { expectedAnswer: "127.0.0.1" }); 143 }); 144 145 add_task(async function ipv6_answer_and_delayed_ipv4_error() { 146 // AAAA comes back immediately. 147 // A EDNS_ERROR comes back later, with a delay 148 await trrServer.registerDoHAnswers("delay1.com", "AAAA", { 149 answers: [ 150 { 151 name: "delay1.com", 152 ttl: 55, 153 type: "AAAA", 154 flush: false, 155 data: "::a:b:c:d", 156 }, 157 ], 158 }); 159 await trrServer.registerDoHAnswers("delay1.com", "A", { 160 answers: [], 161 additionals: [ 162 { 163 name: ".", 164 type: "OPT", 165 class: "IN", 166 options: [ 167 { 168 code: "EDNS_ERROR", 169 extended_error: 17, // Filtered 170 text: "Filtered", 171 }, 172 ], 173 }, 174 ], 175 delay: 200, 176 }); 177 178 // Check that we don't fall back to DNS 179 await new TRRDNSListener("delay1.com", { expectedAnswer: "::a:b:c:d" }); 180 }); 181 182 add_task(async function ipv4_error_and_delayed_ipv6_answer() { 183 // AAAA comes back immediately delay 184 // A EDNS_ERROR comes back immediately 185 await trrServer.registerDoHAnswers("delay2.com", "AAAA", { 186 answers: [ 187 { 188 name: "delay2.com", 189 ttl: 55, 190 type: "AAAA", 191 flush: false, 192 data: "::a:b:c:d", 193 }, 194 ], 195 delay: 200, 196 }); 197 await trrServer.registerDoHAnswers("delay2.com", "A", { 198 answers: [], 199 additionals: [ 200 { 201 name: ".", 202 type: "OPT", 203 class: "IN", 204 options: [ 205 { 206 code: "EDNS_ERROR", 207 extended_error: 17, // Filtered 208 text: "Filtered", 209 }, 210 ], 211 }, 212 ], 213 }); 214 215 // Check that we don't fall back to DNS 216 await new TRRDNSListener("delay2.com", { expectedAnswer: "::a:b:c:d" }); 217 }); 218 219 add_task(async function ipv4_answer_and_delayed_ipv6_error() { 220 // A comes back immediately. 221 // AAAA EDNS_ERROR comes back later, with a delay 222 await trrServer.registerDoHAnswers("delay3.com", "A", { 223 answers: [ 224 { 225 name: "delay3.com", 226 ttl: 55, 227 type: "A", 228 flush: false, 229 data: "1.2.3.4", 230 }, 231 ], 232 }); 233 await trrServer.registerDoHAnswers("delay3.com", "AAAA", { 234 answers: [], 235 additionals: [ 236 { 237 name: ".", 238 type: "OPT", 239 class: "IN", 240 options: [ 241 { 242 code: "EDNS_ERROR", 243 extended_error: 17, // Filtered 244 text: "Filtered", 245 }, 246 ], 247 }, 248 ], 249 delay: 200, 250 }); 251 252 // Check that we don't fall back to DNS 253 await new TRRDNSListener("delay3.com", { expectedAnswer: "1.2.3.4" }); 254 }); 255 256 add_task(async function delayed_ipv4_answer_and_ipv6_error() { 257 // A comes back with delay. 258 // AAAA EDNS_ERROR comes immediately 259 await trrServer.registerDoHAnswers("delay4.com", "A", { 260 answers: [ 261 { 262 name: "delay4.com", 263 ttl: 55, 264 type: "A", 265 flush: false, 266 data: "1.2.3.4", 267 }, 268 ], 269 delay: 200, 270 }); 271 await trrServer.registerDoHAnswers("delay4.com", "AAAA", { 272 answers: [], 273 additionals: [ 274 { 275 name: ".", 276 type: "OPT", 277 class: "IN", 278 options: [ 279 { 280 code: "EDNS_ERROR", 281 extended_error: 17, // Filtered 282 text: "Filtered", 283 }, 284 ], 285 }, 286 ], 287 }); 288 289 // Check that we don't fall back to DNS 290 await new TRRDNSListener("delay4.com", { expectedAnswer: "1.2.3.4" }); 291 }); 292 293 add_task(async function test_only_ipv4_extended_error() { 294 Services.prefs.setBoolPref("network.dns.disableIPv6", true); 295 await trrServer.registerDoHAnswers("only.com", "A", { 296 answers: [], 297 additionals: [ 298 { 299 name: ".", 300 type: "OPT", 301 class: "IN", 302 options: [ 303 { 304 code: "EDNS_ERROR", 305 extended_error: 17, // Filtered 306 text: "Filtered", 307 }, 308 ], 309 }, 310 ], 311 }); 312 let { inStatus } = await new TRRDNSListener("only.com", { 313 expectedSuccess: false, 314 }); 315 Assert.ok( 316 !Components.isSuccessCode(inStatus), 317 `${inStatus} should be an error code` 318 ); 319 });