Backed out changeset b71c8c052463 (bug 1943846) for causing mass failures. CLOSED...
[gecko.git] / netwerk / test / unit / test_http3_server.js
blobb9f98eb4f40e444c22121f7a3e42c50a0534e4ab
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);
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
61 resolve([req, buffer]);
63 certOverrideService.setDisableAllSecurityChecksAndLetAttackersInterceptMyData(
64 true
66 chan.asyncOpen(new ChannelListener(finish, null, flags));
67 });
70 // Use NodeHTTPServer to create an HTTP server and test if the Http/3 server
71 // can act as a reverse proxy.
72 add_task(async function testHttp3ServerAsReverseProxy() {
73 trrServer = new TRRServer();
74 await trrServer.start();
75 Services.dns.clearCache(true);
76 Services.prefs.setIntPref("network.trr.mode", 3);
77 Services.prefs.setCharPref(
78 "network.trr.uri",
79 `https://foo.example.com:${trrServer.port()}/dns-query`
82 await trrServer.registerDoHAnswers("test.h3_example.com", "HTTPS", {
83 answers: [
85 name: "test.h3_example.com",
86 ttl: 55,
87 type: "HTTPS",
88 flush: false,
89 data: {
90 priority: 1,
91 name: "test.h3_example.com",
92 values: [
93 { key: "alpn", value: "h3" },
94 { key: "port", value: h3Port },
99 });
101 await trrServer.registerDoHAnswers("test.h3_example.com", "A", {
102 answers: [
104 name: "test.h3_example.com",
105 ttl: 55,
106 type: "A",
107 flush: false,
108 data: "127.0.0.1",
113 await new TRRDNSListener("test.h3_example.com", {
114 type: Ci.nsIDNSService.RESOLVE_TYPE_HTTPSSVC,
117 let server = new NodeHTTPServer();
118 await server.start();
119 registerCleanupFunction(async () => {
120 await server.stop();
123 await server.registerPathHandler("/test", (req, resp) => {
124 if (req.method === "GET") {
125 resp.writeHead(200);
126 resp.end("got GET request");
127 } else if (req.method === "POST") {
128 let received = "";
129 req.on("data", function receivePostData(chunk) {
130 received += chunk.toString();
132 req.on("end", function finishPost() {
133 resp.writeHead(200);
134 resp.end(received);
139 // Tell the Http/3 server which port to forward requests.
140 let chan = makeChan(`https://test.h3_example.com/port?${server.port()}`);
141 await channelOpenPromise(chan, CL_ALLOW_UNKNOWN_CL);
143 // Test GET method.
144 chan = makeChan(`https://test.h3_example.com/test`);
145 let [req, buf] = await channelOpenPromise(chan, CL_ALLOW_UNKNOWN_CL);
146 Assert.equal(req.protocolVersion, "h3");
147 Assert.equal(buf, "got GET request");
149 var stream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
150 Ci.nsIStringInputStream
152 stream.setByteStringData("b".repeat(500));
154 // Test POST method.
155 chan = makeChan(`https://test.h3_example.com/test`);
156 chan
157 .QueryInterface(Ci.nsIUploadChannel)
158 .setUploadStream(stream, "text/plain", stream.available());
159 chan.requestMethod = "POST";
161 [req, buf] = await channelOpenPromise(chan, CL_ALLOW_UNKNOWN_CL);
162 Assert.equal(req.protocolVersion, "h3");
163 Assert.equal(buf, stream.data);
165 await trrServer.stop();