diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 893cb8d6c..ee2876fce 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -8,3 +8,5 @@ v0.91.0 - Log more details on gRPC failure - Log backtraces on panic + +- Node: Support H2 when using `localTestServer` mode for Net connections. diff --git a/node/ts/Native.ts b/node/ts/Native.ts index bc41d53c9..126e7587f 100644 --- a/node/ts/Native.ts +++ b/node/ts/Native.ts @@ -687,7 +687,7 @@ type NativeFunctions = { TESTING_CdsiLookupResponseConvert: (asyncRuntime: Wrapper) => CancellablePromise; TESTING_CdsiLookupErrorConvert: (errorDescription: string) => void; TESTING_ServerMessageAck_Create: () => ServerMessageAck; - TESTING_ConnectionManager_newLocalOverride: (userAgent: string, chatPort: number, cdsiPort: number, svr2Port: number, svrBPort: number, rootCertificateDer: Uint8Array) => ConnectionManager; + TESTING_ConnectionManager_newLocalOverride: (userAgent: string, chatPort: number, cdsiPort: number, svr2Port: number, svrBPort: number, rootCertificateDer: Uint8Array, httpVersion: number) => ConnectionManager; TESTING_ConnectionManager_isUsingProxy: (manager: Wrapper) => number; TESTING_CreateOTP: (username: string, secret: Uint8Array) => string; TESTING_CreateOTPFromBase64: (username: string, secret: string) => string; diff --git a/node/ts/net.ts b/node/ts/net.ts index a18570936..9a3a80e97 100644 --- a/node/ts/net.ts +++ b/node/ts/net.ts @@ -111,6 +111,7 @@ export type NetConstructorOptions = Readonly< TESTING_localServer_svr2Port: number; TESTING_localServer_svrBPort: number; TESTING_localServer_rootCertificateDer: Uint8Array; + TESTING_localServer_httpVersion?: 1 | 2; } >; @@ -164,7 +165,8 @@ export class Net { options.TESTING_localServer_cdsiPort, options.TESTING_localServer_svr2Port, options.TESTING_localServer_svrBPort, - options.TESTING_localServer_rootCertificateDer + options.TESTING_localServer_rootCertificateDer, + options.TESTING_localServer_httpVersion ?? 1 ) ); } else { diff --git a/rust/bridge/shared/testing/src/net.rs b/rust/bridge/shared/testing/src/net.rs index 2bffeb4bf..fd893cc48 100644 --- a/rust/bridge/shared/testing/src/net.rs +++ b/rust/bridge/shared/testing/src/net.rs @@ -12,6 +12,7 @@ use libsignal_bridge_types::net::{BuildVariant, ConnectionManager, TokioAsyncCon use libsignal_core::E164; use libsignal_net::cdsi::{CdsiProtocolError, LookupError, LookupResponse, LookupResponseEntry}; use libsignal_net::infra::errors::RetryLater; +use libsignal_net::infra::route::HttpVersion; use libsignal_net::infra::ws::attested::AttestedProtocolError; use libsignal_protocol::{Aci, Pni}; use nonzero_ext::nonzero; @@ -150,6 +151,7 @@ fn TESTING_ConnectionManager_newLocalOverride( svr2Port: AsType, svrBPort: AsType, rootCertificateDer: &[u8], + http_version: u8, ) -> ConnectionManager { let ports = net_env::LocalhostEnvPortConfig { chat_port: chatPort.into_inner(), @@ -157,8 +159,13 @@ fn TESTING_ConnectionManager_newLocalOverride( svr2_port: svr2Port.into_inner(), svrb_port: svrBPort.into_inner(), }; + let http_version = match http_version { + 1 => HttpVersion::Http1_1, + 2 => HttpVersion::Http2, + _ => panic!("invalid HTTP version {http_version}"), + }; - let env = net_env::localhost_test_env_with_ports(ports, rootCertificateDer); + let env = net_env::localhost_test_env_with_ports(ports, rootCertificateDer, http_version); ConnectionManager::new_from_static_environment( env, userAgent.as_str(), diff --git a/rust/bridge/shared/testing/src/net_env.rs b/rust/bridge/shared/testing/src/net_env.rs index 8cd856984..9d3b0c5ec 100644 --- a/rust/bridge/shared/testing/src/net_env.rs +++ b/rust/bridge/shared/testing/src/net_env.rs @@ -21,6 +21,7 @@ fn localhost_test_domain_config_with_port_and_cert( service: ServiceName, port: NonZeroU16, root_certificate_der: &[u8], + http_version: HttpVersion, ) -> DomainConfig { const LOCALHOST_IP_V4: Ipv4Addr = ip_addr!(v4, "127.0.0.1"); DomainConfig { @@ -31,7 +32,7 @@ fn localhost_test_domain_config_with_port_and_cert( hostname: "localhost", port, cert: RootCertificates::FromDer(std::borrow::Cow::Owned(root_certificate_der.to_vec())), - http_version: Some(HttpVersion::Http1_1), + http_version: Some(http_version), min_tls_version: None, confirmation_header_name: None, proxy: None, @@ -80,17 +81,20 @@ const DUMMY_KEYTRANS_CONFIG: KeyTransConfig = KeyTransConfig { pub(crate) fn localhost_test_env_with_ports( ports: LocalhostEnvPortConfig, root_certificate_der: &[u8], + http_version: HttpVersion, ) -> Env<'static> { Env { chat_domain_config: localhost_test_domain_config_with_port_and_cert( ServiceName("chat"), ports.chat_port, root_certificate_der, + http_version, ), experimental_chat_h2_domain_config: localhost_test_domain_config_with_port_and_cert( ServiceName("chat"), ports.chat_port, root_certificate_der, + http_version, ), chat_ws_config: RECOMMENDED_CHAT_WS_CONFIG, cdsi: EnclaveEndpoint { @@ -98,6 +102,7 @@ pub(crate) fn localhost_test_env_with_ports( ServiceName("cdsi"), ports.cdsi_port, root_certificate_der, + http_version, ), ws_config: RECOMMENDED_WS_CONFIG, params: DUMMY_CDSI_ENDPOINT_PARAMS, @@ -107,6 +112,7 @@ pub(crate) fn localhost_test_env_with_ports( ServiceName("svr2"), ports.svr2_port, root_certificate_der, + http_version, ), ws_config: RECOMMENDED_WS_CONFIG, params: DUMMY_SVR2_ENDPOINT_PARAMS, @@ -118,6 +124,7 @@ pub(crate) fn localhost_test_env_with_ports( ServiceName("svrb"), ports.svrb_port, root_certificate_der, + http_version, ), ws_config: RECOMMENDED_WS_CONFIG, params: DUMMY_SVRB_ENDPOINT_PARAMS,