Merge pull request #1290 from hamza1311/ureq

Replace curl with ureq
master
Jesper Håkansson 2 years ago committed by GitHub
commit 03261418ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      .github/workflows/test.yml
  2. 2
      .gitignore
  3. 747
      Cargo.lock
  4. 14
      Cargo.toml
  5. 15
      src/install/krate.rs
  6. 1
      src/lib.rs
  7. 42
      src/manifest/mod.rs
  8. 15
      src/test/webdriver.rs
  9. 19
      src/test/webdriver/chromedriver.rs
  10. 46
      src/test/webdriver/geckodriver.rs
  11. 6
      tests/all/download.rs

@ -52,7 +52,7 @@ jobs:
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('Cargo.lock') }}
- name: Run Tests
run: cargo test --features "strict" --all --locked
run: cargo test --all --locked
env:
RUST_BACKTRACE: 1

2
.gitignore vendored

@ -5,3 +5,5 @@ tests/bin
/build-installer
docs/book
docs/installer
.idea

747
Cargo.lock generated

File diff suppressed because it is too large Load Diff

@ -17,15 +17,12 @@ binary-install = "0.1.0"
cargo_metadata = "0.15.2"
chrono = "0.4.23"
console = "0.15.5"
curl = "0.4.44"
dialoguer = "0.10.3"
env_logger = { version = "0.10.0", default-features = false }
glob = "0.3.1"
human-panic = "1.0.3"
log = "0.4.17"
openssl = { version = '0.10.48', optional = true }
parking_lot = "0.12.1"
reqwest = { version = "0.11.14", features = ["blocking"] }
semver = "1.0.16"
serde = "1.0.152"
serde_derive = "1.0.152"
@ -35,6 +32,7 @@ siphasher = "0.3.10"
strsim = "0.10.0"
structopt = "0.3.26"
toml = "0.5.11"
ureq = { version = "2.6.2", features = ["json"] }
walkdir = "2.3.2"
which = "4.4.0"
@ -45,13 +43,3 @@ predicates = "2.1.5"
serial_test = "1.0.0"
tempfile = "3.3.0"
[features]
# OpenSSL is vendored by default, can use system OpenSSL through feature flag.
default = ['openssl/vendored']
# Treat compiler warnings as a build error.
# This only runs in CI by default
strict = ['openssl/vendored']
sys-openssl = ['openssl']
# Keeping feature for users already using this feature flag
vendored-openssl = ['openssl/vendored']

@ -1,6 +1,5 @@
use crate::install::Tool;
use anyhow::Result;
use reqwest::header::USER_AGENT;
use serde::Deserialize;
const VERSION: Option<&str> = option_env!("CARGO_PKG_VERSION");
@ -18,16 +17,14 @@ pub struct KrateResponse {
impl Krate {
pub fn new(name: &Tool) -> Result<Krate> {
let krate_address = format!("https://crates.io/api/v1/crates/{}", name);
let client = reqwest::blocking::Client::new();
let res = client
.get(&krate_address)
.header(
USER_AGENT,
format!("wasm-pack/{}", VERSION.unwrap_or("unknown")),
let res = ureq::get(&krate_address)
.set(
"user-agent",
&format!("wasm-pack/{}", VERSION.unwrap_or("unknown")),
)
.send()?;
.call()?;
let kr: KrateResponse = serde_json::from_str(&res.text()?)?;
let kr: KrateResponse = res.into_json()?;
Ok(kr.krate)
}
}

@ -19,7 +19,6 @@ extern crate serde_json;
extern crate structopt;
extern crate binary_install;
extern crate chrono;
extern crate curl;
extern crate dialoguer;
extern crate log;
extern crate toml;

@ -20,7 +20,6 @@ use crate::PBAR;
use cargo_metadata::Metadata;
use chrono::offset;
use chrono::DateTime;
use curl::easy;
use serde::{self, Deserialize};
use serde_json;
use std::collections::BTreeSet;
@ -120,15 +119,6 @@ struct CargoWasmPackProfileWasmBindgen {
dwarf_debug_info: Option<bool>,
}
struct Collector(Vec<u8>);
impl easy::Handler for Collector {
fn write(&mut self, data: &[u8]) -> Result<usize, easy::WriteError> {
self.0.extend_from_slice(data);
Ok(data.len())
}
}
/// Struct for storing information received from crates.io
#[derive(Deserialize, Debug)]
pub struct Crate {
@ -233,26 +223,24 @@ impl Crate {
/// Call to the crates.io api and return the latest version of `wasm-pack`
fn check_wasm_pack_latest_version() -> Result<Crate> {
let url = "https://crates.io/api/v1/crates/wasm-pack";
let mut easy = easy::Easy2::new(Collector(Vec::new()));
easy.useragent(&format!(
"wasm-pack/{} ({})",
WASM_PACK_VERSION.unwrap_or_else(|| "unknown"),
WASM_PACK_REPO_URL
))?;
easy.url(url)?;
easy.get(true)?;
easy.perform()?;
let status_code = easy.response_code()?;
let agent = ureq::builder()
.user_agent(&format!(
"wasm-pack/{} ({})",
WASM_PACK_VERSION.unwrap_or_else(|| "unknown"),
WASM_PACK_REPO_URL
))
.build();
let resp = agent
.get(url)
.call()
.context("failed to get wasm-pack version")?;
let status_code = resp.status();
if 200 <= status_code && status_code < 300 {
let contents = easy.get_ref();
let result = String::from_utf8_lossy(&contents.0);
let json = resp.into_json()?;
Ok(serde_json::from_str(result.into_owned().as_str())?)
Ok(json)
} else {
bail!(
"Received a bad HTTP status code ({}) when checking for newer wasm-pack version at: {}",

@ -34,18 +34,3 @@ fn get_and_notify(
None => Ok(None),
}
}
struct Collector(Vec<u8>);
impl Collector {
pub fn take_content(&mut self) -> Vec<u8> {
std::mem::take(&mut self.0)
}
}
impl curl::easy::Handler for Collector {
fn write(&mut self, data: &[u8]) -> Result<usize, curl::easy::WriteError> {
self.0.extend_from_slice(data);
Ok(data.len())
}
}

@ -1,4 +1,4 @@
use super::{get_and_notify, Collector};
use super::get_and_notify;
use crate::install::InstallMode;
use crate::stamps;
use crate::target;
@ -117,17 +117,12 @@ fn should_load_chromedriver_version_from_stamp(json: &serde_json::Value) -> bool
}
fn fetch_chromedriver_version() -> Result<String> {
let mut handle = curl::easy::Easy2::new(Collector(Vec::new()));
handle
.url("https://chromedriver.storage.googleapis.com/LATEST_RELEASE")
.context("URL to fetch chromedriver's LATEST_RELEASE is invalid")?;
handle
.perform()
.context("fetching of chromedriver's LATEST_RELEASE failed")?;
let content = handle.get_mut().take_content();
let version =
String::from_utf8(content).context("chromedriver's LATEST_RELEASE is not valid UTF-8")?;
let version = ureq::get("https://chromedriver.storage.googleapis.com/LATEST_RELEASE")
.call()
.context("fetching of chromedriver's LATEST_RELEASE failed")?
.into_string()
.context("converting chromedriver version response to string failed")?;
Ok(version)
}

@ -1,4 +1,4 @@
use super::{get_and_notify, Collector};
use super::get_and_notify;
use crate::install::InstallMode;
use crate::stamps;
use crate::target;
@ -77,11 +77,8 @@ pub fn install_geckodriver(cache: &Cache, installation_allowed: bool) -> Result<
/// - it should be relatively safe because each `geckodriver` supports many `Firefox` versions:
/// https://firefox-source-docs.mozilla.org/testing/geckodriver/Support.html#supported-platforms
fn get_geckodriver_url(target: &str, ext: &str) -> String {
let fetch_and_save_version = || {
fetch_latest_geckodriver_tag_json()
.and_then(get_version_from_json)
.and_then(save_geckodriver_version)
};
let fetch_and_save_version =
|| fetch_latest_geckodriver_tag_json().and_then(save_geckodriver_version);
let geckodriver_version = if target::WINDOWS {
log::info!(
@ -142,37 +139,18 @@ fn should_load_geckodriver_version_from_stamp(json: &serde_json::Value) -> bool
}
fn fetch_latest_geckodriver_tag_json() -> Result<String> {
let mut headers = curl::easy::List::new();
headers
.append("Accept: application/json")
.context("cannot fetch geckodriver's latest release data - appending header failed")?;
let mut handle = curl::easy::Easy2::new(Collector(Vec::new()));
handle
.url("https://github.com/mozilla/geckodriver/releases/latest")
.context("URL to fetch geckodriver's latest release data is invalid")?;
handle
.http_headers(headers)
.context("cannot fetch geckodriver's latest release data - setting headers failed")?;
// We will be redirected from the `latest` placeholder to the specific tag name.
handle
.follow_location(true)
.context("cannot fetch geckodriver's latest release data - enabling redirects failed")?;
handle
.perform()
.context("fetching of geckodriver's latest release data failed")?;
let content = handle.get_mut().take_content();
let version = String::from_utf8(content)
.context("geckodriver's latest release data is not valid UTF-8")?;
Ok(version)
let content: serde_json::Value =
ureq::get("https://github.com/mozilla/geckodriver/releases/latest")
.set("Accept", "application/json")
.call()
.context("fetching of geckodriver's latest release data failed")?
.into_json()?;
get_version_from_json(content)
}
/// JSON example: `{"id":15227534,"tag_name":"v0.24.0","update_url":"/mozzila...`
fn get_version_from_json(json: impl AsRef<str>) -> Result<String> {
let json: serde_json::Value = serde_json::from_str(json.as_ref())
.context("geckodriver's latest release data is not valid JSON")?;
fn get_version_from_json(json: serde_json::Value) -> Result<String> {
json.get("tag_name")
.and_then(|tag_name| tag_name.as_str().map(ToOwned::to_owned))
.ok_or_else(|| anyhow!("cannot get `tag_name` from geckodriver's latest release data"))

@ -84,10 +84,10 @@ fn all_latest_tool_download_urls_valid() {
// For all valid tool, arch & os combinations,
// error out when any of them is a 404 or similar
if let Ok(url) = install::prebuilt_url_for(&tool, "0.2.82", &arch, &os) {
let client = reqwest::blocking::Client::new();
// Use HTTP HEAD instead of GET to avoid fetching lots of stuff
let res = client.head(&url).send().unwrap();
if res.status().is_client_error() {
let res = ureq::head(&url).call().unwrap();
let status = res.status();
if 500 > status && status >= 400 {
errors.push(format!(
"Can't download URL {} for {} on {}: {}",
url,

Loading…
Cancel
Save