diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-05-01 16:42:05 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-01 16:42:05 -0400 |
commit | 913176313b6869eeb29b8d48e0c8d80227fa6544 (patch) | |
tree | cc0128b36ea9b22207a3dd41a401ae4ecd131e74 /ext/websocket/lib.rs | |
parent | ecc70eb58fd5531f3b93402cf781e93ef2bb4d64 (diff) |
perf: lazily create RootCertStore (#18938)
Diffstat (limited to 'ext/websocket/lib.rs')
-rw-r--r-- | ext/websocket/lib.rs | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/ext/websocket/lib.rs b/ext/websocket/lib.rs index 2ce141fc9..e03a13789 100644 --- a/ext/websocket/lib.rs +++ b/ext/websocket/lib.rs @@ -19,6 +19,7 @@ use deno_core::ZeroCopyBuf; use deno_net::raw::take_network_stream_resource; use deno_net::raw::NetworkStream; use deno_tls::create_client_config; +use deno_tls::RootCertStoreProvider; use http::header::CONNECTION; use http::header::UPGRADE; use http::HeaderName; @@ -54,7 +55,17 @@ use fastwebsockets::WebSocket; mod stream; #[derive(Clone)] -pub struct WsRootStore(pub Option<RootCertStore>); +pub struct WsRootStoreProvider(Option<Arc<dyn RootCertStoreProvider>>); + +impl WsRootStoreProvider { + pub fn get_or_try_init(&self) -> Result<Option<RootCertStore>, AnyError> { + Ok(match &self.0 { + Some(provider) => Some(provider.get_or_try_init()?.clone()), + None => None, + }) + } +} + #[derive(Clone)] pub struct WsUserAgent(pub String); @@ -181,7 +192,10 @@ where .borrow() .try_borrow::<UnsafelyIgnoreCertificateErrors>() .and_then(|it| it.0.clone()); - let root_cert_store = state.borrow().borrow::<WsRootStore>().0.clone(); + let root_cert_store = state + .borrow() + .borrow::<WsRootStoreProvider>() + .get_or_try_init()?; let user_agent = state.borrow().borrow::<WsUserAgent>().0.clone(); let uri: Uri = url.parse()?; let mut request = Request::builder().method(Method::GET).uri( @@ -525,7 +539,7 @@ deno_core::extension!(deno_websocket, esm = [ "01_websocket.js", "02_websocketstream.js" ], options = { user_agent: String, - root_cert_store: Option<RootCertStore>, + root_cert_store_provider: Option<Arc<dyn RootCertStoreProvider>>, unsafely_ignore_certificate_errors: Option<Vec<String>> }, state = |state, options| { @@ -533,7 +547,7 @@ deno_core::extension!(deno_websocket, state.put(UnsafelyIgnoreCertificateErrors( options.unsafely_ignore_certificate_errors, )); - state.put::<WsRootStore>(WsRootStore(options.root_cert_store)); + state.put::<WsRootStoreProvider>(WsRootStoreProvider(options.root_cert_store_provider)); }, ); |