Skip to content

Commit ae3aebf

Browse files
committed
[rust] Create Selenium Manager HTTP client on first use and explain TLS certificate errors
1 parent e21558f commit ae3aebf

10 files changed

Lines changed: 174 additions & 112 deletions

File tree

‎rust/src/chrome.rs‎

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ use crate::metadata::{
2727
};
2828
use crate::{
2929
BETA, DASH_DASH_VERSION, DEV, NIGHTLY, OFFLINE_REQUEST_ERR_MSG, REG_VERSION_ARG, STABLE,
30-
SeleniumManager, UNAVAILABLE_DOWNLOAD_WITH_MIN_VERSION_ERR_MSG, create_http_client,
31-
format_four_args,
30+
SeleniumManager, UNAVAILABLE_DOWNLOAD_WITH_MIN_VERSION_ERR_MSG, format_four_args,
3231
};
3332
use anyhow::Error;
3433
use anyhow::anyhow;
@@ -38,6 +37,7 @@ use std::collections::HashMap;
3837
use std::option::Option;
3938
use std::path::{Path, PathBuf};
4039
use std::process::Command;
40+
use std::sync::OnceLock;
4141
use std::sync::mpsc;
4242
use std::sync::mpsc::{Receiver, Sender};
4343

@@ -74,7 +74,7 @@ pub struct ChromeManager {
7474
pub browser_name: &'static str,
7575
pub driver_name: &'static str,
7676
pub config: ManagerConfig,
77-
pub http_client: Client,
77+
pub http_client: OnceLock<Client>,
7878
pub log: Logger,
7979
pub tx: Sender<String>,
8080
pub rx: Receiver<String>,
@@ -88,14 +88,11 @@ impl ChromeManager {
8888
let browser_name = CHROME_NAME;
8989
let driver_name = CHROMEDRIVER_NAME;
9090
let config = ManagerConfig::default(browser_name, driver_name);
91-
let default_timeout = config.timeout.to_owned();
92-
let default_proxy = &config.proxy;
93-
let default_insecure = config.insecure;
9491
let (tx, rx): (Sender<String>, Receiver<String>) = mpsc::channel();
9592
Ok(Box::new(ChromeManager {
9693
browser_name,
9794
driver_name,
98-
http_client: create_http_client(default_timeout, default_proxy, default_insecure)?,
95+
http_client: OnceLock::new(),
9996
config,
10097
log: Logger::new(),
10198
tx,
@@ -157,7 +154,7 @@ impl ChromeManager {
157154
"Reading {} version from {}",
158155
&self.driver_name, driver_url
159156
));
160-
read_version_from_link(self.get_http_client(), driver_url, self.get_logger())
157+
read_version_from_link(self.get_http_client()?, driver_url, self.get_logger())
161158
}
162159

163160
fn request_versions_from_online<T>(&self, driver_url: &str) -> Result<T, Error>
@@ -166,7 +163,7 @@ impl ChromeManager {
166163
{
167164
self.log
168165
.debug(format!("Discovering versions from {}", driver_url));
169-
parse_json_from_url::<T>(self.get_http_client(), driver_url)
166+
parse_json_from_url::<T>(self.get_http_client()?, driver_url)
170167
}
171168

172169
fn request_latest_driver_version_from_online(&mut self) -> Result<String, Error> {
@@ -311,12 +308,12 @@ impl SeleniumManager for ChromeManager {
311308
first_existing_path(CHROME_KNOWN_DIRS, CHROME_KNOWN_NAMES)
312309
}
313310

314-
fn get_http_client(&self) -> &Client {
311+
fn get_http_client_cell(&self) -> &OnceLock<Client> {
315312
&self.http_client
316313
}
317314

318-
fn set_http_client(&mut self, http_client: Client) {
319-
self.http_client = http_client;
315+
fn get_http_client_cell_mut(&mut self) -> &mut OnceLock<Client> {
316+
&mut self.http_client
320317
}
321318

322319
fn get_browser_path_map(&self) -> HashMap<BrowserPath, &str> {

‎rust/src/edge.rs‎

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use crate::metadata::{
2727
use crate::{
2828
BETA, DASH_DASH_VERSION, DEV, ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, Logger, NIGHTLY,
2929
OFFLINE_REQUEST_ERR_MSG, REG_PV_ARG, REG_VERSION_ARG, STABLE, SeleniumManager,
30-
create_http_client, get_binary_extension, path_to_string,
30+
get_binary_extension, path_to_string,
3131
};
3232
use anyhow::Error;
3333
use anyhow::anyhow;
@@ -36,6 +36,7 @@ use serde::{Deserialize, Serialize};
3636
use std::collections::HashMap;
3737
use std::env;
3838
use std::path::{Path, PathBuf};
39+
use std::sync::OnceLock;
3940
use std::sync::mpsc;
4041
use std::sync::mpsc::{Receiver, Sender};
4142

@@ -76,7 +77,7 @@ pub struct EdgeManager {
7677
pub browser_name: &'static str,
7778
pub driver_name: &'static str,
7879
pub config: ManagerConfig,
79-
pub http_client: Client,
80+
pub http_client: OnceLock<Client>,
8081
pub log: Logger,
8182
pub tx: Sender<String>,
8283
pub rx: Receiver<String>,
@@ -93,14 +94,11 @@ impl EdgeManager {
9394
let static_browser_name: &str = Box::leak(browser_name.into_boxed_str());
9495
let driver_name = EDGEDRIVER_NAME;
9596
let config = ManagerConfig::default(static_browser_name, driver_name);
96-
let default_timeout = config.timeout.to_owned();
97-
let default_proxy = &config.proxy;
98-
let default_insecure = config.insecure;
9997
let (tx, rx): (Sender<String>, Receiver<String>) = mpsc::channel();
10098
Ok(Box::new(EdgeManager {
10199
browser_name: static_browser_name,
102100
driver_name,
103-
http_client: create_http_client(default_timeout, default_proxy, default_insecure)?,
101+
http_client: OnceLock::new(),
104102
config,
105103
log: Logger::new(),
106104
tx,
@@ -137,12 +135,12 @@ impl SeleniumManager for EdgeManager {
137135
first_existing_path(EDGE_KNOWN_DIRS, EDGE_KNOWN_NAMES)
138136
}
139137

140-
fn get_http_client(&self) -> &Client {
138+
fn get_http_client_cell(&self) -> &OnceLock<Client> {
141139
&self.http_client
142140
}
143141

144-
fn set_http_client(&mut self, http_client: Client) {
145-
self.http_client = http_client;
142+
fn get_http_client_cell_mut(&mut self) -> &mut OnceLock<Client> {
143+
&mut self.http_client
146144
}
147145

148146
fn get_browser_path_map(&self) -> HashMap<BrowserPath, &str> {
@@ -259,7 +257,7 @@ impl SeleniumManager for EdgeManager {
259257
&self.driver_name, latest_stable_url
260258
));
261259
let latest_driver_version = read_version_from_link(
262-
self.get_http_client(),
260+
self.get_http_client()?,
263261
&latest_stable_url,
264262
self.get_logger(),
265263
)?;
@@ -280,8 +278,11 @@ impl SeleniumManager for EdgeManager {
280278
"Reading {} version from {}",
281279
&self.driver_name, driver_url
282280
));
283-
let driver_version =
284-
read_version_from_link(self.get_http_client(), &driver_url, self.get_logger())?;
281+
let driver_version = read_version_from_link(
282+
self.get_http_client()?,
283+
&driver_url,
284+
self.get_logger(),
285+
)?;
285286

286287
let driver_ttl = self.get_ttl();
287288
if should_cache_driver_version(
@@ -420,7 +421,7 @@ impl SeleniumManager for EdgeManager {
420421
));
421422

422423
let edge_products =
423-
parse_json_from_url::<Vec<EdgeProduct>>(self.get_http_client(), &edge_updates_url)?;
424+
parse_json_from_url::<Vec<EdgeProduct>>(self.get_http_client()?, &edge_updates_url)?;
424425

425426
let edge_channel = if self.is_beta(browser_version) {
426427
"Beta"

‎rust/src/electron.rs‎

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@ use crate::metadata::{
2626
};
2727
use crate::{
2828
BETA, CANARY, DEV, ESR, LATEST_RELEASE, Logger, NIGHTLY, OFFLINE_REQUEST_ERR_MSG, STABLE,
29-
SeleniumManager, WINDOWS, create_http_client,
29+
SeleniumManager, WINDOWS,
3030
};
3131
use anyhow::Error;
3232
use reqwest::Client;
3333
use std::collections::HashMap;
3434
use std::path::PathBuf;
35+
use std::sync::OnceLock;
3536
use std::sync::mpsc;
3637
use std::sync::mpsc::{Receiver, Sender};
3738

@@ -82,7 +83,7 @@ pub struct ElectronManager {
8283
pub browser_name: &'static str,
8384
pub driver_name: &'static str,
8485
pub config: ManagerConfig,
85-
pub http_client: Client,
86+
pub http_client: OnceLock<Client>,
8687
pub log: Logger,
8788
pub tx: Sender<String>,
8889
pub rx: Receiver<String>,
@@ -95,14 +96,11 @@ impl ElectronManager {
9596
let browser_name = ELECTRON_NAME;
9697
let driver_name = CHROMEDRIVER_NAME;
9798
let config = ManagerConfig::default(browser_name, driver_name);
98-
let default_timeout = config.timeout.to_owned();
99-
let default_proxy = &config.proxy;
100-
let default_insecure = config.insecure;
10199
let (tx, rx): (Sender<String>, Receiver<String>) = mpsc::channel();
102100
Ok(Box::new(ElectronManager {
103101
browser_name,
104102
driver_name,
105-
http_client: create_http_client(default_timeout, default_proxy, default_insecure)?,
103+
http_client: OnceLock::new(),
106104
config,
107105
log: Logger::new(),
108106
tx,
@@ -122,12 +120,12 @@ impl SeleniumManager for ElectronManager {
122120
vec![self.get_browser_name()]
123121
}
124122

125-
fn get_http_client(&self) -> &Client {
123+
fn get_http_client_cell(&self) -> &OnceLock<Client> {
126124
&self.http_client
127125
}
128126

129-
fn set_http_client(&mut self, http_client: Client) {
130-
self.http_client = http_client;
127+
fn get_http_client_cell_mut(&mut self) -> &mut OnceLock<Client> {
128+
&mut self.http_client
131129
}
132130

133131
fn get_browser_path_map(&self) -> HashMap<BrowserPath, &str> {
@@ -188,8 +186,11 @@ impl SeleniumManager for ElectronManager {
188186
self.get_driver_mirror_url_or_default(DRIVER_URL),
189187
LATEST_RELEASE
190188
);
191-
let driver_version =
192-
read_redirect_from_link(self.get_http_client(), latest_url, self.get_logger())?;
189+
let driver_version = read_redirect_from_link(
190+
self.get_http_client()?,
191+
latest_url,
192+
self.get_logger(),
193+
)?;
193194
let driver_ttl = self.get_ttl();
194195
if driver_ttl > 0 && !major_browser_version.is_empty() && !driver_version.is_empty()
195196
{

‎rust/src/firefox.rs‎

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use crate::metadata::{
2626
};
2727
use crate::{
2828
BETA, DASH_VERSION, DEV, ESR, LATEST_RELEASE, Logger, NIGHTLY, OFFLINE_REQUEST_ERR_MSG, STABLE,
29-
SeleniumManager, create_http_client, format_three_args, format_two_args,
29+
SeleniumManager, format_three_args, format_two_args,
3030
};
3131
use anyhow::Error;
3232
use anyhow::anyhow;
@@ -36,6 +36,7 @@ use serde::Serialize;
3636
use serde_json::Value;
3737
use std::collections::HashMap;
3838
use std::path::{Path, PathBuf};
39+
use std::sync::OnceLock;
3940
use std::sync::mpsc;
4041
use std::sync::mpsc::{Receiver, Sender};
4142

@@ -76,7 +77,7 @@ pub struct FirefoxManager {
7677
pub browser_name: &'static str,
7778
pub driver_name: &'static str,
7879
pub config: ManagerConfig,
79-
pub http_client: Client,
80+
pub http_client: OnceLock<Client>,
8081
pub log: Logger,
8182
pub tx: Sender<String>,
8283
pub rx: Receiver<String>,
@@ -88,14 +89,11 @@ impl FirefoxManager {
8889
let browser_name = FIREFOX_NAME;
8990
let driver_name = GECKODRIVER_NAME;
9091
let config = ManagerConfig::default(browser_name, driver_name);
91-
let default_timeout = config.timeout.to_owned();
92-
let default_proxy = &config.proxy;
93-
let default_insecure = config.insecure;
9492
let (tx, rx): (Sender<String>, Receiver<String>) = mpsc::channel();
9593
Ok(Box::new(FirefoxManager {
9694
browser_name,
9795
driver_name,
98-
http_client: create_http_client(default_timeout, default_proxy, default_insecure)?,
96+
http_client: OnceLock::new(),
9997
config,
10098
log: Logger::new(),
10199
tx,
@@ -112,7 +110,7 @@ impl FirefoxManager {
112110
let browser_version = self.get_browser_version().to_string();
113111
let firefox_versions_url = self.create_firefox_details_url(endpoint);
114112
let firefox_versions =
115-
parse_json_from_url::<Value>(self.get_http_client(), &firefox_versions_url)?;
113+
parse_json_from_url::<Value>(self.get_http_client()?, &firefox_versions_url)?;
116114

117115
let versions_map = firefox_versions.as_object().unwrap();
118116
let filter_key = if browser_version.contains('.') {
@@ -149,12 +147,12 @@ impl SeleniumManager for FirefoxManager {
149147
browser_names
150148
}
151149

152-
fn get_http_client(&self) -> &Client {
150+
fn get_http_client_cell(&self) -> &OnceLock<Client> {
153151
&self.http_client
154152
}
155153

156-
fn set_http_client(&mut self, http_client: Client) {
157-
self.http_client = http_client;
154+
fn get_http_client_cell_mut(&mut self) -> &mut OnceLock<Client> {
155+
&mut self.http_client
158156
}
159157

160158
fn get_browser_path_map(&self) -> HashMap<BrowserPath, &str> {
@@ -244,7 +242,7 @@ impl SeleniumManager for FirefoxManager {
244242
let driver_version_url =
245243
self.get_driver_mirror_versions_url_or_default(DRIVER_VERSIONS_URL);
246244
let driver_version = match parse_json_from_url::<GeckodriverReleases>(
247-
self.get_http_client(),
245+
self.get_http_client()?,
248246
&driver_version_url,
249247
) {
250248
Ok(driver_releases) => {
@@ -292,7 +290,7 @@ impl SeleniumManager for FirefoxManager {
292290
LATEST_RELEASE
293291
);
294292
read_redirect_from_link(
295-
self.get_http_client(),
293+
self.get_http_client()?,
296294
latest_url,
297295
self.get_logger(),
298296
)?
@@ -427,7 +425,7 @@ impl SeleniumManager for FirefoxManager {
427425

428426
let firefox_versions_url = self.create_firefox_details_url(FIREFOX_VERSIONS_ENDPOINT);
429427
let firefox_versions =
430-
parse_json_from_url::<Value>(self.get_http_client(), &firefox_versions_url)?;
428+
parse_json_from_url::<Value>(self.get_http_client()?, &firefox_versions_url)?;
431429
let browser_version = firefox_versions
432430
.get(FIREFOX_STABLE_LABEL)
433431
.unwrap()
@@ -450,7 +448,7 @@ impl SeleniumManager for FirefoxManager {
450448
if self.is_unstable(browser_version) {
451449
let firefox_versions_url = self.create_firefox_details_url(FIREFOX_VERSIONS_ENDPOINT);
452450
let firefox_versions =
453-
parse_json_from_url::<Value>(self.get_http_client(), &firefox_versions_url)?;
451+
parse_json_from_url::<Value>(self.get_http_client()?, &firefox_versions_url)?;
454452
let version_label = if self.is_beta(browser_version) {
455453
FIREFOX_BETA_LABEL
456454
} else if self.is_dev(browser_version) {
@@ -508,7 +506,7 @@ impl SeleniumManager for FirefoxManager {
508506
);
509507
self.get_logger()
510508
.trace(format!("Checking release URL: {}", release_url));
511-
let content = read_content_from_link(self.get_http_client(), &release_url)?;
509+
let content = read_content_from_link(self.get_http_client()?, &release_url)?;
512510
if !content.contains("Not Found") {
513511
return Ok(version.to_string());
514512
}

0 commit comments

Comments
 (0)