Bug 1857386 [wpt PR 42383] - Update wpt metadata, a=testonly
[gecko.git] / netwerk / test / unit / test_http3_server.js
blob3daf9cfa3cbdbd1119b28878e58ce721b06d0dfe
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/. */
5 "use strict";
7 let h2Port;
8 let h3Port;
9 let trrServer;
11 const certOverrideService = Cc[
12   "@mozilla.org/security/certoverride;1"
13 ].getService(Ci.nsICertOverrideService);
14 const { TestUtils } = ChromeUtils.importESModule(
15   "resource://testing-common/TestUtils.sys.mjs"
18 add_setup(async function setup() {
19   h2Port = Services.env.get("MOZHTTP2_PORT");
20   Assert.notEqual(h2Port, null);
21   Assert.notEqual(h2Port, "");
23   h3Port = Services.env.get("MOZHTTP3_PORT_PROXY");
24   Assert.notEqual(h3Port, null);
25   Assert.notEqual(h3Port, "");
27   trr_test_setup();
29   Services.prefs.setBoolPref("network.dns.upgrade_with_https_rr", true);
30   Services.prefs.setBoolPref("network.dns.use_https_rr_as_altsvc", true);
32   registerCleanupFunction(async () => {
33     trr_clear_prefs();
34     Services.prefs.clearUserPref("network.dns.upgrade_with_https_rr");
35     Services.prefs.clearUserPref("network.dns.use_https_rr_as_altsvc");
36     Services.prefs.clearUserPref("network.dns.disablePrefetch");
37     await trrServer.stop();
38   });
40   if (mozinfo.socketprocess_networking) {
41     Services.dns;
42     await TestUtils.waitForCondition(() => Services.io.socketProcessLaunched);
43   }
44 });
46 function makeChan(url) {
47   let chan = NetUtil.newChannel({
48     uri: url,
49     loadUsingSystemPrincipal: true,
50     contentPolicyType: Ci.nsIContentPolicy.TYPE_DOCUMENT,
51   }).QueryInterface(Ci.nsIHttpChannel);
52   return chan;
55 function channelOpenPromise(chan, flags) {
56   return new Promise(resolve => {
57     function finish(req, buffer) {
58       certOverrideService.setDisableAllSecurityChecksAndLetAttackersInterceptMyData(
59         false
60       );
61       resolve([req, buffer]);
62     }
63     let internal = chan.QueryInterface(Ci.nsIHttpChannelInternal);
64     internal.setWaitForHTTPSSVCRecord();
65     certOverrideService.setDisableAllSecurityChecksAndLetAttackersInterceptMyData(
66       true
67     );
68     chan.asyncOpen(new ChannelListener(finish, null, flags));
69   });
72 // Use NodeHTTPServer to create an HTTP server and test if the Http/3 server
73 // can act as a reverse proxy.
74 add_task(async function testHttp3ServerAsReverseProxy() {
75   trrServer = new TRRServer();
76   await trrServer.start();
77   Services.dns.clearCache(true);
78   Services.prefs.setIntPref("network.trr.mode", 3);
79   Services.prefs.setCharPref(
80     "network.trr.uri",
81     `https://foo.example.com:${trrServer.port()}/dns-query`
82   );
84   await trrServer.registerDoHAnswers("test.h3_example.com", "HTTPS", {
85     answers: [
86       {
87         name: "test.h3_example.com",
88         ttl: 55,
89         type: "HTTPS",
90         flush: false,
91         data: {
92           priority: 1,
93           name: "test.h3_example.com",
94           values: [
95             { key: "alpn", value: "h3-29" },
96             { key: "port", value: h3Port },
97           ],
98         },
99       },
100     ],
101   });
103   await trrServer.registerDoHAnswers("test.h3_example.com", "A", {
104     answers: [
105       {
106         name: "test.h3_example.com",
107         ttl: 55,
108         type: "A",
109         flush: false,
110         data: "127.0.0.1",
111       },
112     ],
113   });
115   await new TRRDNSListener("test.h3_example.com", {
116     type: Ci.nsIDNSService.RESOLVE_TYPE_HTTPSSVC,
117   });
119   let server = new NodeHTTPServer();
120   await server.start();
121   registerCleanupFunction(async () => {
122     await server.stop();
123   });
125   await server.registerPathHandler("/test", (req, resp) => {
126     if (req.method === "GET") {
127       resp.writeHead(200);
128       resp.end("got GET request");
129     } else if (req.method === "POST") {
130       let received = "";
131       req.on("data", function receivePostData(chunk) {
132         received += chunk.toString();
133       });
134       req.on("end", function finishPost() {
135         resp.writeHead(200);
136         resp.end(received);
137       });
138     }
139   });
141   // Tell the Http/3 server which port to forward requests.
142   let chan = makeChan(`https://test.h3_example.com/port?${server.port()}`);
143   await channelOpenPromise(chan, CL_ALLOW_UNKNOWN_CL);
145   // Test GET method.
146   chan = makeChan(`https://test.h3_example.com/test`);
147   let [req, buf] = await channelOpenPromise(chan, CL_ALLOW_UNKNOWN_CL);
148   Assert.equal(req.protocolVersion, "h3-29");
149   Assert.equal(buf, "got GET request");
151   var stream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
152     Ci.nsIStringInputStream
153   );
154   stream.data = "b".repeat(500);
156   // Test POST method.
157   chan = makeChan(`https://test.h3_example.com/test`);
158   chan
159     .QueryInterface(Ci.nsIUploadChannel)
160     .setUploadStream(stream, "text/plain", stream.available());
161   chan.requestMethod = "POST";
163   [req, buf] = await channelOpenPromise(chan, CL_ALLOW_UNKNOWN_CL);
164   Assert.equal(req.protocolVersion, "h3-29");
165   Assert.equal(buf, stream.data);
167   await trrServer.stop();