forked from mirrors/gecko-dev
Backed out changeset 7796a0d39f43 (bug 1818828) for xpcshell failures at test_simple_conn.js CLOSED TREE
This commit is contained in:
parent
f98405beb0
commit
22f22e507d
5 changed files with 14 additions and 395 deletions
|
|
@ -1,129 +0,0 @@
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
// Some basic WebTransport tests for:
|
|
||||||
// * session rejection and redirection
|
|
||||||
// * session and stream creation
|
|
||||||
// * reading from incoming streams (uni)
|
|
||||||
//
|
|
||||||
// keep eslint happy until it knows about WebTransport
|
|
||||||
/* global WebTransport:false */
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var h3Port;
|
|
||||||
var host;
|
|
||||||
|
|
||||||
registerCleanupFunction(async () => {
|
|
||||||
Services.prefs.clearUserPref("network.dns.localDomains");
|
|
||||||
Services.prefs.clearUserPref("network.webtransport.enabled");
|
|
||||||
Services.prefs.clearUserPref("network.webtransport.datagrams.enabled");
|
|
||||||
Services.prefs.clearUserPref("network.webtransport.redirect.enabled");
|
|
||||||
});
|
|
||||||
|
|
||||||
var { NetUtil } = ChromeUtils.import("resource://gre/modules/NetUtil.jsm");
|
|
||||||
|
|
||||||
function readFile(file) {
|
|
||||||
let fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
|
|
||||||
Ci.nsIFileInputStream
|
|
||||||
);
|
|
||||||
fstream.init(file, -1, 0, 0);
|
|
||||||
let data = NetUtil.readInputStreamToString(fstream, fstream.available());
|
|
||||||
fstream.close();
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
function addCertFromFile(certdb, filename, trustString) {
|
|
||||||
let certFile = do_get_file(filename, false);
|
|
||||||
let pem = readFile(certFile)
|
|
||||||
.replace(/-----BEGIN CERTIFICATE-----/, "")
|
|
||||||
.replace(/-----END CERTIFICATE-----/, "")
|
|
||||||
.replace(/[\r\n]/g, "");
|
|
||||||
certdb.addCertFromBase64(pem, trustString);
|
|
||||||
}
|
|
||||||
|
|
||||||
add_setup(async function setup() {
|
|
||||||
Services.prefs.setCharPref("network.dns.localDomains", "foo.example.com");
|
|
||||||
Services.prefs.setBoolPref("network.webtransport.enabled", true);
|
|
||||||
Services.prefs.setBoolPref("network.webtransport.datagrams.enabled", true);
|
|
||||||
Services.prefs.setBoolPref("network.webtransport.redirect.enabled", true);
|
|
||||||
|
|
||||||
h3Port = Services.env.get("MOZHTTP3_PORT");
|
|
||||||
Assert.notEqual(h3Port, null);
|
|
||||||
Assert.notEqual(h3Port, "");
|
|
||||||
host = "foo.example.com:" + h3Port;
|
|
||||||
do_get_profile();
|
|
||||||
|
|
||||||
let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(
|
|
||||||
Ci.nsIX509CertDB
|
|
||||||
);
|
|
||||||
// `../unit/` so that unit_ipc tests can use as well
|
|
||||||
addCertFromFile(
|
|
||||||
certdb,
|
|
||||||
"../../../../netwerk/test/unit/http2-ca.pem",
|
|
||||||
"CTu,u,u"
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
add_task(async function test_webtransport_create() {
|
|
||||||
const wt = new WebTransport("https://" + host + "/success");
|
|
||||||
await wt.ready;
|
|
||||||
wt.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
add_task(async function test_redirect_wt() {
|
|
||||||
let wt = new WebTransport("https://" + host + "/redirect");
|
|
||||||
const e1 = await wt.ready.catch(e => e);
|
|
||||||
const e2 = await wt.closed.catch(e => e);
|
|
||||||
|
|
||||||
Assert.equal(e1, "WebTransportError: WebTransport connection rejected");
|
|
||||||
Assert.equal(e2, "WebTransportError: WebTransport connection rejected");
|
|
||||||
});
|
|
||||||
|
|
||||||
add_task(async function test_reject_wt() {
|
|
||||||
let wt = new WebTransport("https://" + host + "/reject");
|
|
||||||
const e1 = await wt.ready.catch(e => e);
|
|
||||||
const e2 = await wt.closed.catch(e => e);
|
|
||||||
Assert.equal(e1, "WebTransportError: WebTransport connection rejected");
|
|
||||||
Assert.equal(e2, "WebTransportError: WebTransport connection rejected");
|
|
||||||
});
|
|
||||||
|
|
||||||
add_task(async function test_immediate_server_close() {
|
|
||||||
let wt = new WebTransport("https://" + host + "/closeafter0ms");
|
|
||||||
await wt.ready;
|
|
||||||
await wt.closed;
|
|
||||||
Assert.ok(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
add_task(async function test_delayed_server_close() {
|
|
||||||
let wt = new WebTransport("https://" + host + "/closeafter100ms");
|
|
||||||
await wt.ready;
|
|
||||||
await wt.closed;
|
|
||||||
Assert.ok(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
add_task(async function test_wt_stream_create_bidi() {
|
|
||||||
let wt = new WebTransport("https://" + host + "/success");
|
|
||||||
await wt.ready;
|
|
||||||
|
|
||||||
let bds = await wt.createBidirectionalStream();
|
|
||||||
await bds.writable.close();
|
|
||||||
await bds.readable.cancel();
|
|
||||||
Assert.notEqual(bds, null);
|
|
||||||
wt.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
add_task(async function test_wt_stream_create_uni() {
|
|
||||||
let wt = new WebTransport("https://" + host + "/success");
|
|
||||||
await wt.ready;
|
|
||||||
|
|
||||||
let uds = await wt.createUnidirectionalStream();
|
|
||||||
Assert.notEqual(uds, null);
|
|
||||||
await uds.close();
|
|
||||||
wt.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
// TODO: datagram test
|
|
||||||
// TODO: getStats tests
|
|
||||||
// TODO: fix the crash discussed in bug 1822154
|
|
||||||
|
|
@ -1,168 +0,0 @@
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
// keep eslint happy until it knows about WebTransport
|
|
||||||
/* global WebTransport:false */
|
|
||||||
/* global TextDecoderStream:false */
|
|
||||||
|
|
||||||
// Using multiple files to reduce racing
|
|
||||||
// This file tests reading/writing to incoming/outgoing streams (uni & bidi)
|
|
||||||
//
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var h3Port;
|
|
||||||
var host;
|
|
||||||
|
|
||||||
registerCleanupFunction(async () => {
|
|
||||||
Services.prefs.clearUserPref("network.dns.localDomains");
|
|
||||||
Services.prefs.clearUserPref("network.webtransport.enabled");
|
|
||||||
Services.prefs.clearUserPref("network.webtransport.datagrams.enabled");
|
|
||||||
Services.prefs.clearUserPref("network.webtransport.redirect.enabled");
|
|
||||||
});
|
|
||||||
|
|
||||||
var { NetUtil } = ChromeUtils.import("resource://gre/modules/NetUtil.jsm");
|
|
||||||
|
|
||||||
function readFile(file) {
|
|
||||||
let fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
|
|
||||||
Ci.nsIFileInputStream
|
|
||||||
);
|
|
||||||
fstream.init(file, -1, 0, 0);
|
|
||||||
let data = NetUtil.readInputStreamToString(fstream, fstream.available());
|
|
||||||
fstream.close();
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
function addCertFromFile(certdb, filename, trustString) {
|
|
||||||
let certFile = do_get_file(filename, false);
|
|
||||||
let pem = readFile(certFile)
|
|
||||||
.replace(/-----BEGIN CERTIFICATE-----/, "")
|
|
||||||
.replace(/-----END CERTIFICATE-----/, "")
|
|
||||||
.replace(/[\r\n]/g, "");
|
|
||||||
certdb.addCertFromBase64(pem, trustString);
|
|
||||||
}
|
|
||||||
|
|
||||||
add_setup(async function setup() {
|
|
||||||
Services.prefs.setCharPref("network.dns.localDomains", "foo.example.com");
|
|
||||||
Services.prefs.setBoolPref("network.webtransport.enabled", true);
|
|
||||||
Services.prefs.setBoolPref("network.webtransport.datagrams.enabled", true);
|
|
||||||
Services.prefs.setBoolPref("network.webtransport.redirect.enabled", true);
|
|
||||||
|
|
||||||
h3Port = Services.env.get("MOZHTTP3_PORT");
|
|
||||||
Assert.notEqual(h3Port, null);
|
|
||||||
Assert.notEqual(h3Port, "");
|
|
||||||
host = "foo.example.com:" + h3Port;
|
|
||||||
do_get_profile();
|
|
||||||
|
|
||||||
let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(
|
|
||||||
Ci.nsIX509CertDB
|
|
||||||
);
|
|
||||||
// `../unit/` so that unit_ipc tests can use as well
|
|
||||||
addCertFromFile(
|
|
||||||
certdb,
|
|
||||||
"../../../../netwerk/test/unit/http2-ca.pem",
|
|
||||||
"CTu,u,u"
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Read all chunks from |readable_stream|, decode chunks to a utf-8 string, then
|
|
||||||
// return the string. (borrowed from wpt tests)
|
|
||||||
async function read_stream_as_string(readable_stream) {
|
|
||||||
const decoder = new TextDecoderStream();
|
|
||||||
const decode_stream = readable_stream.pipeThrough(decoder);
|
|
||||||
const reader = decode_stream.getReader();
|
|
||||||
|
|
||||||
let chunks = "";
|
|
||||||
while (true) {
|
|
||||||
const { value: chunk, done } = await reader.read();
|
|
||||||
if (done) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
chunks += chunk;
|
|
||||||
}
|
|
||||||
reader.releaseLock();
|
|
||||||
return chunks;
|
|
||||||
}
|
|
||||||
|
|
||||||
add_task(async function test_wt_incoming_unidi_stream() {
|
|
||||||
// trigger stream creation server side and default echo
|
|
||||||
let wt = new WebTransport(
|
|
||||||
"https://" + host + "/create_unidi_stream_and_hello"
|
|
||||||
);
|
|
||||||
await wt.ready;
|
|
||||||
|
|
||||||
const streams = await wt.incomingUnidirectionalStreams;
|
|
||||||
const stream_reader = streams.getReader();
|
|
||||||
const { value: recv_stream } = await stream_reader.read();
|
|
||||||
let str = await read_stream_as_string(recv_stream);
|
|
||||||
stream_reader.releaseLock();
|
|
||||||
Assert.equal(str, "qwerty");
|
|
||||||
|
|
||||||
wt.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
add_task(async function test_wt_incoming_and_outgoing_unidi_stream() {
|
|
||||||
// create the client's incoming stream from the server side
|
|
||||||
// we need it to listen to the echo back
|
|
||||||
let wt = new WebTransport("https://" + host + "/create_unidi_stream");
|
|
||||||
await wt.ready;
|
|
||||||
|
|
||||||
// send hello to server
|
|
||||||
let expected = "uni_hello";
|
|
||||||
let writableStream = await wt.createUnidirectionalStream(); // only triggers NewStream OnWrite
|
|
||||||
let wsDefaultWriter = writableStream.getWriter();
|
|
||||||
await wsDefaultWriter.ready;
|
|
||||||
let data = new TextEncoder().encode(expected);
|
|
||||||
await wsDefaultWriter.write(data); // triggers Http3ServerEvent::Data
|
|
||||||
await wsDefaultWriter.close();
|
|
||||||
wsDefaultWriter.releaseLock();
|
|
||||||
|
|
||||||
// read the echo
|
|
||||||
const streams = await wt.incomingUnidirectionalStreams;
|
|
||||||
const stream_reader = streams.getReader();
|
|
||||||
const { value: recv_stream } = await stream_reader.read();
|
|
||||||
let str = await read_stream_as_string(recv_stream);
|
|
||||||
Assert.equal(str, expected);
|
|
||||||
stream_reader.releaseLock();
|
|
||||||
await recv_stream.closed;
|
|
||||||
|
|
||||||
wt.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
add_task(async function test_wt_outgoing_bidi_stream() {
|
|
||||||
let wt = new WebTransport("https://" + host + "/success");
|
|
||||||
await wt.ready;
|
|
||||||
|
|
||||||
// write to server
|
|
||||||
let wtbds = await wt.createBidirectionalStream();
|
|
||||||
let writableStream = wtbds.writable;
|
|
||||||
let wsDefaultWriter = writableStream.getWriter();
|
|
||||||
await wsDefaultWriter.ready;
|
|
||||||
let expected = "xyzhello";
|
|
||||||
let data = new TextEncoder().encode(expected);
|
|
||||||
await wsDefaultWriter.write(data);
|
|
||||||
await wsDefaultWriter.close();
|
|
||||||
wsDefaultWriter.releaseLock();
|
|
||||||
|
|
||||||
// string goes through server and is echoed back here
|
|
||||||
const str = await read_stream_as_string(wtbds.readable);
|
|
||||||
Assert.equal(str, expected);
|
|
||||||
|
|
||||||
wt.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
add_task(async function test_wt_incoming_bidi_stream() {
|
|
||||||
let wt = new WebTransport(
|
|
||||||
"https://" + host + "/create_bidi_stream_and_hello"
|
|
||||||
);
|
|
||||||
// await wt.ready; // causes occasional hang on release --verify
|
|
||||||
|
|
||||||
const stream_reader = wt.incomingBidirectionalStreams.getReader();
|
|
||||||
const { value: bidi_stream } = await stream_reader.read();
|
|
||||||
stream_reader.releaseLock();
|
|
||||||
|
|
||||||
const str = await read_stream_as_string(bidi_stream.readable);
|
|
||||||
Assert.equal(str, "asdfg");
|
|
||||||
|
|
||||||
wt.close();
|
|
||||||
});
|
|
||||||
|
|
@ -9,15 +9,3 @@
|
||||||
skip-if =
|
skip-if =
|
||||||
os == 'android' || socketprocess_networking
|
os == 'android' || socketprocess_networking
|
||||||
os == 'win' && msix # https://bugzilla.mozilla.org/show_bug.cgi?id=1807925
|
os == 'win' && msix # https://bugzilla.mozilla.org/show_bug.cgi?id=1807925
|
||||||
[test_simple_conn.js]
|
|
||||||
skip-if =
|
|
||||||
os == 'android'
|
|
||||||
socketprocess_networking
|
|
||||||
os == 'win' && msix # https://bugzilla.mozilla.org/show_bug.cgi?id=1807925
|
|
||||||
run-sequentially = http3server
|
|
||||||
[test_simple_stream.js]
|
|
||||||
skip-if =
|
|
||||||
os == 'android'
|
|
||||||
socketprocess_networking
|
|
||||||
os == 'win' && msix # https://bugzilla.mozilla.org/show_bug.cgi?id=1807925
|
|
||||||
run-sequentially = http3server
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ use neqo_http3::{
|
||||||
Error, Http3OrWebTransportStream, Http3Parameters, Http3Server, Http3ServerEvent,
|
Error, Http3OrWebTransportStream, Http3Parameters, Http3Server, Http3ServerEvent,
|
||||||
WebTransportRequest, WebTransportServerEvent, WebTransportSessionAcceptAction,
|
WebTransportRequest, WebTransportServerEvent, WebTransportSessionAcceptAction,
|
||||||
};
|
};
|
||||||
use neqo_transport::server::{Server, ActiveConnectionRef};
|
use neqo_transport::server::Server;
|
||||||
use neqo_transport::{
|
use neqo_transport::{
|
||||||
ConnectionEvent, ConnectionParameters, Output, RandomConnectionIdGenerator, StreamId,
|
ConnectionEvent, ConnectionParameters, Output, RandomConnectionIdGenerator, StreamId,
|
||||||
StreamType,
|
StreamType,
|
||||||
|
|
@ -81,10 +81,8 @@ struct Http3TestServer {
|
||||||
responses: HashMap<Http3OrWebTransportStream, Vec<u8>>,
|
responses: HashMap<Http3OrWebTransportStream, Vec<u8>>,
|
||||||
current_connection_hash: u64,
|
current_connection_hash: u64,
|
||||||
sessions_to_close: HashMap<Instant, Vec<WebTransportRequest>>,
|
sessions_to_close: HashMap<Instant, Vec<WebTransportRequest>>,
|
||||||
sessions_to_create_stream: Vec<(WebTransportRequest, StreamType, bool)>,
|
sessions_to_create_stream: Vec<(WebTransportRequest, StreamType)>,
|
||||||
webtransport_bidi_stream: HashSet<Http3OrWebTransportStream>,
|
webtransport_bidi_stream: HashSet<Http3OrWebTransportStream>,
|
||||||
wt_unidi_conn_to_stream: HashMap<ActiveConnectionRef, Http3OrWebTransportStream>,
|
|
||||||
wt_unidi_echo_back: HashMap<Http3OrWebTransportStream, Http3OrWebTransportStream>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ::std::fmt::Display for Http3TestServer {
|
impl ::std::fmt::Display for Http3TestServer {
|
||||||
|
|
@ -103,8 +101,6 @@ impl Http3TestServer {
|
||||||
sessions_to_close: HashMap::new(),
|
sessions_to_close: HashMap::new(),
|
||||||
sessions_to_create_stream: Vec::new(),
|
sessions_to_create_stream: Vec::new(),
|
||||||
webtransport_bidi_stream: HashSet::new(),
|
webtransport_bidi_stream: HashSet::new(),
|
||||||
wt_unidi_conn_to_stream: HashMap::new(),
|
|
||||||
wt_unidi_echo_back: HashMap::new(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -166,25 +162,10 @@ impl Http3TestServer {
|
||||||
let mut session = tuple.0;
|
let mut session = tuple.0;
|
||||||
let mut wt_server_stream = session.create_stream(tuple.1).unwrap();
|
let mut wt_server_stream = session.create_stream(tuple.1).unwrap();
|
||||||
if tuple.1 == StreamType::UniDi {
|
if tuple.1 == StreamType::UniDi {
|
||||||
if tuple.2 {
|
let content = b"0123456789".to_vec();
|
||||||
wt_server_stream.send_data(b"qwerty").unwrap();
|
wt_server_stream.send_data(&content).unwrap();
|
||||||
wt_server_stream.stream_close_send().unwrap();
|
|
||||||
} else {
|
|
||||||
// relaying Http3ServerEvent::Data to uni streams
|
|
||||||
// slows down netwerk/test/unit/test_webtransport_simple.js
|
|
||||||
// to the point of failure. Only do so when necessary.
|
|
||||||
self.wt_unidi_conn_to_stream.insert(wt_server_stream.conn.clone(), wt_server_stream);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if tuple.2 {
|
self.webtransport_bidi_stream.insert(wt_server_stream);
|
||||||
wt_server_stream.send_data(b"asdfg").unwrap();
|
|
||||||
wt_server_stream.stream_close_send().unwrap();
|
|
||||||
wt_server_stream
|
|
||||||
.stream_stop_sending(Error::HttpNoError.code())
|
|
||||||
.unwrap();
|
|
||||||
} else {
|
|
||||||
self.webtransport_bidi_stream.insert(wt_server_stream);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -397,21 +378,10 @@ impl HttpServer for Http3TestServer {
|
||||||
data,
|
data,
|
||||||
fin,
|
fin,
|
||||||
} => {
|
} => {
|
||||||
// echo bidirectional input back to client
|
|
||||||
if self.webtransport_bidi_stream.contains(&stream) {
|
if self.webtransport_bidi_stream.contains(&stream) {
|
||||||
self.new_response(stream, data);
|
self.new_response(stream, data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// echo unidirectional input to back to client
|
|
||||||
// need to close or we hang
|
|
||||||
if self.wt_unidi_echo_back.contains_key(&stream) {
|
|
||||||
let mut echo_back = self.wt_unidi_echo_back.remove(&stream).unwrap();
|
|
||||||
echo_back.send_data(&data).unwrap();
|
|
||||||
echo_back.stream_close_send().unwrap();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(r) = self.posts.get_mut(&stream) {
|
if let Some(r) = self.posts.get_mut(&stream) {
|
||||||
*r += data.len();
|
*r += data.len();
|
||||||
}
|
}
|
||||||
|
|
@ -487,11 +457,6 @@ impl HttpServer for Http3TestServer {
|
||||||
session
|
session
|
||||||
.response(&WebTransportSessionAcceptAction::Accept)
|
.response(&WebTransportSessionAcceptAction::Accept)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let now = Instant::now();
|
|
||||||
if !self.sessions_to_close.contains_key(&now) {
|
|
||||||
self.sessions_to_close.insert(now, Vec::new());
|
|
||||||
}
|
|
||||||
self.sessions_to_close.get_mut(&now).unwrap().push(session);
|
|
||||||
} else if path == "/closeafter100ms" {
|
} else if path == "/closeafter100ms" {
|
||||||
session
|
session
|
||||||
.response(&WebTransportSessionAcceptAction::Accept)
|
.response(&WebTransportSessionAcceptAction::Accept)
|
||||||
|
|
@ -508,39 +473,14 @@ impl HttpServer for Http3TestServer {
|
||||||
session
|
session
|
||||||
.response(&WebTransportSessionAcceptAction::Accept)
|
.response(&WebTransportSessionAcceptAction::Accept)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
self.sessions_to_create_stream.push((
|
self.sessions_to_create_stream
|
||||||
session,
|
.push((session, StreamType::UniDi));
|
||||||
StreamType::UniDi,
|
|
||||||
false,
|
|
||||||
));
|
|
||||||
} else if path == "/create_unidi_stream_and_hello" {
|
|
||||||
session
|
|
||||||
.response(&WebTransportSessionAcceptAction::Accept)
|
|
||||||
.unwrap();
|
|
||||||
self.sessions_to_create_stream.push((
|
|
||||||
session,
|
|
||||||
StreamType::UniDi,
|
|
||||||
true,
|
|
||||||
));
|
|
||||||
} else if path == "/create_bidi_stream" {
|
} else if path == "/create_bidi_stream" {
|
||||||
session
|
session
|
||||||
.response(&WebTransportSessionAcceptAction::Accept)
|
.response(&WebTransportSessionAcceptAction::Accept)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
self.sessions_to_create_stream.push((
|
self.sessions_to_create_stream
|
||||||
session,
|
.push((session, StreamType::BiDi));
|
||||||
StreamType::BiDi,
|
|
||||||
false,
|
|
||||||
));
|
|
||||||
} else if path == "/create_bidi_stream_and_hello" {
|
|
||||||
self.webtransport_bidi_stream.clear();
|
|
||||||
session
|
|
||||||
.response(&WebTransportSessionAcceptAction::Accept)
|
|
||||||
.unwrap();
|
|
||||||
self.sessions_to_create_stream.push((
|
|
||||||
session,
|
|
||||||
StreamType::BiDi,
|
|
||||||
true,
|
|
||||||
));
|
|
||||||
} else {
|
} else {
|
||||||
session
|
session
|
||||||
.response(&WebTransportSessionAcceptAction::Accept)
|
.response(&WebTransportSessionAcceptAction::Accept)
|
||||||
|
|
@ -568,20 +508,8 @@ impl HttpServer for Http3TestServer {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Http3ServerEvent::WebTransport(WebTransportServerEvent::NewStream(stream)) => {
|
Http3ServerEvent::WebTransport(WebTransportServerEvent::NewStream(stream)) => {
|
||||||
// new stream could be from client-outgoing unidirectional
|
|
||||||
// or bidirectional
|
|
||||||
if !stream.stream_info.is_http() {
|
if !stream.stream_info.is_http() {
|
||||||
if stream.stream_id().is_bidi() {
|
self.webtransport_bidi_stream.insert(stream);
|
||||||
self.webtransport_bidi_stream.insert(stream);
|
|
||||||
} else {
|
|
||||||
// Newly created stream happens on same connection
|
|
||||||
// as the stream creation for client's incoming stream.
|
|
||||||
// Link the streams with map for echo back
|
|
||||||
if self.wt_unidi_conn_to_stream.contains_key(&stream.conn) {
|
|
||||||
let s = self.wt_unidi_conn_to_stream.remove(&stream.conn).unwrap();
|
|
||||||
self.wt_unidi_echo_back.insert(stream, s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Http3ServerEvent::WebTransport(WebTransportServerEvent::Datagram {
|
Http3ServerEvent::WebTransport(WebTransportServerEvent::Datagram {
|
||||||
|
|
|
||||||
|
|
@ -180,11 +180,11 @@ async function test_closed(path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
add_task(async function test_closed_0ms() {
|
add_task(async function test_closed_0ms() {
|
||||||
await test_closed("/closeafter0ms");
|
test_closed("/closeafter0ms");
|
||||||
});
|
});
|
||||||
|
|
||||||
add_task(async function test_closed_100ms() {
|
add_task(async function test_closed_100ms() {
|
||||||
await test_closed("/closeafter100ms");
|
test_closed("/closeafter100ms");
|
||||||
});
|
});
|
||||||
|
|
||||||
add_task(async function test_wt_stream_create() {
|
add_task(async function test_wt_stream_create() {
|
||||||
|
|
@ -266,7 +266,7 @@ add_task(async function test_wt_receive_stream_and_stats() {
|
||||||
listener.streamAvailable = resolve;
|
listener.streamAvailable = resolve;
|
||||||
});
|
});
|
||||||
webTransport.asyncConnect(
|
webTransport.asyncConnect(
|
||||||
NetUtil.newURI(`https://${host}/create_unidi_stream_and_hello`),
|
NetUtil.newURI(`https://${host}/create_unidi_stream`),
|
||||||
Services.scriptSecurityManager.getSystemPrincipal(),
|
Services.scriptSecurityManager.getSystemPrincipal(),
|
||||||
Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
|
Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
|
||||||
listener
|
listener
|
||||||
|
|
@ -285,7 +285,7 @@ add_task(async function test_wt_receive_stream_and_stats() {
|
||||||
});
|
});
|
||||||
|
|
||||||
info("data: " + data);
|
info("data: " + data);
|
||||||
Assert.equal(data, "qwerty");
|
Assert.equal(data, "0123456789");
|
||||||
|
|
||||||
let stats = await receiveStreamStatsPromise(stream);
|
let stats = await receiveStreamStatsPromise(stream);
|
||||||
Assert.equal(stats.bytesReceived, data.length);
|
Assert.equal(stats.bytesReceived, data.length);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue