Skip to content

Commit 9975823

Browse files
committed
Auto merge of #361 - pietroalbini:unify-http, r=pietroalbini
Move most http handling to utils::http
2 parents a511066 + 4ae5289 commit 9975823

File tree

6 files changed

+43
-50
lines changed

6 files changed

+43
-50
lines changed

src/agent/api.rs

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
use base64;
22
use crates::{Crate, GitHubRepo};
33
use experiments::Experiment;
4-
use http::header::AUTHORIZATION;
5-
use http::header::USER_AGENT;
6-
use http::StatusCode;
4+
use http::{header::AUTHORIZATION, Method, StatusCode};
75
use prelude::*;
8-
use reqwest::{Client, Method, RequestBuilder};
6+
use reqwest::RequestBuilder;
97
use results::TestResult;
108
use serde::de::DeserializeOwned;
119
use server::api_types::{AgentConfig, ApiResponse, CraterToken};
1210
use toolchain::Toolchain;
13-
14-
lazy_static! {
15-
static ref CRATER_USER_AGENT: String =
16-
format!("crater-agent/{}", ::GIT_REVISION.unwrap_or("unknown"));
17-
}
11+
use utils::http;
1812

1913
#[derive(Debug, Fail)]
2014
pub enum AgentApiError {
@@ -68,29 +62,25 @@ impl ResponseExt for ::reqwest::Response {
6862
const RETRY_AFTER: u64 = 5;
6963

7064
pub struct AgentApi {
71-
client: Client,
7265
url: String,
7366
token: String,
7467
}
7568

7669
impl AgentApi {
7770
pub fn new(url: &str, token: &str) -> Self {
7871
AgentApi {
79-
client: Client::new(),
8072
url: url.to_string(),
8173
token: token.to_string(),
8274
}
8375
}
8476

8577
fn build_request(&self, method: Method, url: &str) -> RequestBuilder {
86-
self.client
87-
.request(method, &format!("{}/agent-api/{}", self.url, url))
88-
.header(
89-
AUTHORIZATION,
90-
(CraterToken {
91-
token: self.token.clone(),
92-
}).to_string(),
93-
).header(USER_AGENT, CRATER_USER_AGENT.clone())
78+
http::prepare_sync(method, &format!("{}/agent-api/{}", self.url, url)).header(
79+
AUTHORIZATION,
80+
(CraterToken {
81+
token: self.token.clone(),
82+
}).to_string(),
83+
)
9484
}
9585

9686
fn retry<T, F: Fn(&Self) -> Fallible<T>>(&self, f: F) -> Fallible<T> {

src/crates/sources/github.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ impl List for GitHubList {
3333
fn fetch(&self) -> Fallible<Vec<Crate>> {
3434
info!("loading cached GitHub list from {}", self.source);
3535

36-
let mut resp = ::utils::http::get(&self.source)
36+
let mut resp = ::utils::http::get_sync(&self.source)
3737
.with_context(|_| format!("failed to fetch GitHub crates list from {}", self.source))?;
3838
let mut reader = ::csv::Reader::from_reader(&mut resp);
3939

src/crates/sources/registry.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ fn dl_registry(name: &str, vers: &str, dir: &Path) -> Fallible<()> {
8787
}
8888
info!("downloading crate {}-{} to {}", name, vers, dir.display());
8989
let url = format!("{0}/{1}/{1}-{2}.crate", CRATES_ROOT, name, vers);
90-
let bin = ::utils::http::get(&url).with_context(|_| format!("unable to download {}", url))?;
90+
let bin =
91+
::utils::http::get_sync(&url).with_context(|_| format!("unable to download {}", url))?;
9192

9293
fs::create_dir_all(&dir)?;
9394

src/server/github.rs

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
1-
use http::header::{AUTHORIZATION, USER_AGENT};
1+
use http::header::AUTHORIZATION;
22
use http::Method;
33
use http::StatusCode;
44
use prelude::*;
5-
use reqwest::{Client, RequestBuilder};
5+
use reqwest::RequestBuilder;
66
use server::tokens::Tokens;
77
use std::collections::HashMap;
8-
9-
lazy_static! {
10-
static ref CRATER_USER_AGENT: String =
11-
format!("crater/{}", ::GIT_REVISION.unwrap_or("unknown"));
12-
}
8+
use utils::http;
139

1410
#[derive(Debug, Fail)]
1511
pub enum GitHubError {
@@ -24,14 +20,12 @@ pub enum GitHubError {
2420
#[derive(Clone)]
2521
pub struct GitHubApi {
2622
token: String,
27-
client: Client,
2823
}
2924

3025
impl GitHubApi {
3126
pub fn new(tokens: &Tokens) -> Self {
3227
GitHubApi {
3328
token: tokens.bot.api_token.clone(),
34-
client: Client::new(),
3529
}
3630
}
3731

@@ -42,10 +36,7 @@ impl GitHubApi {
4236
url.to_string()
4337
};
4438

45-
self.client
46-
.request(method, &url)
47-
.header(AUTHORIZATION, format!("token {}", self.token))
48-
.header(USER_AGENT, CRATER_USER_AGENT.clone())
39+
http::prepare_sync(method, &url).header(AUTHORIZATION, format!("token {}", self.token))
4940
}
5041

5142
pub fn username(&self) -> Fallible<String> {

src/tools/rustup.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ impl InstallableTool for Rustup {
4848
::HOST_TARGET,
4949
EXE_SUFFIX
5050
);
51-
let mut resp = ::utils::http::get(&url).with_context(|_| "unable to download rustup")?;
51+
let mut resp =
52+
::utils::http::get_sync(&url).with_context(|_| "unable to download rustup")?;
5253

5354
let tempdir = tempdir()?;
5455
let installer = &tempdir.path().join(format!("rustup-init{}", EXE_SUFFIX));

src/utils/http.rs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
use http::{header::USER_AGENT, Method, StatusCode};
12
use prelude::*;
2-
use reqwest::{Client, ClientBuilder, RedirectPolicy, Response, StatusCode};
3+
use reqwest::{Client, ClientBuilder, RedirectPolicy, RequestBuilder, Response};
34

45
const MAX_REDIRECTS: usize = 4;
56

@@ -15,27 +16,36 @@ pub struct InvalidStatusCode {
1516
}
1617

1718
lazy_static! {
18-
static ref HTTP_CLIENT: Client = setup_client();
19+
static ref HTTP_SYNC_CLIENT: Client = setup_sync_client();
20+
static ref USER_AGENT_CONTENT: String = format!(
21+
"crater/{} ({})",
22+
::GIT_REVISION.unwrap_or("unknown"),
23+
::CRATER_REPO_URL
24+
);
1925
}
2026

21-
fn setup_client() -> Client {
27+
fn setup_sync_client() -> Client {
2228
ClientBuilder::new()
2329
.redirect(RedirectPolicy::limited(MAX_REDIRECTS))
2430
.build()
2531
.unwrap()
2632
}
2733

28-
pub(crate) fn get(url: &str) -> Fallible<Response> {
29-
::utils::try_hard(|| {
30-
let resp = HTTP_CLIENT.get(url).send()?;
34+
pub(crate) fn prepare_sync(method: Method, url: &str) -> RequestBuilder {
35+
HTTP_SYNC_CLIENT
36+
.request(method, url)
37+
.header(USER_AGENT, USER_AGENT_CONTENT.clone())
38+
}
39+
40+
pub(crate) fn get_sync(url: &str) -> Fallible<Response> {
41+
let resp = prepare_sync(Method::GET, url).send()?;
3142

32-
// Return an error if the response wasn't a 200 OK
33-
match resp.status() {
34-
StatusCode::OK => Ok(resp),
35-
status => Err(InvalidStatusCode {
36-
url: url.to_string(),
37-
status,
38-
}.into()),
39-
}
40-
})
43+
// Return an error if the response wasn't a 200 OK
44+
match resp.status() {
45+
StatusCode::OK => Ok(resp),
46+
status => Err(InvalidStatusCode {
47+
url: url.to_string(),
48+
status,
49+
}.into()),
50+
}
4151
}

0 commit comments

Comments
 (0)