summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls <emils@mullvad.net>2021-12-20 12:24:53 +0000
committerEmīls <emils@mullvad.net>2022-01-03 15:45:16 +0000
commit26c20eba8674eacb5af26295a56dce5206b5b2ac (patch)
tree2e18c3d9668feb490dd9adeb3b76473e8b44af86
parenta39dd104fd863c917ae9475c0d4dfc9a6777b96e (diff)
downloadmullvadvpn-26c20eba8674eacb5af26295a56dce5206b5b2ac.tar.xz
mullvadvpn-26c20eba8674eacb5af26295a56dce5206b5b2ac.zip
Always allow 2XX responses from the API
-rw-r--r--mullvad-rpc/src/lib.rs26
-rw-r--r--mullvad-rpc/src/rest.rs32
2 files changed, 35 insertions, 23 deletions
diff --git a/mullvad-rpc/src/lib.rs b/mullvad-rpc/src/lib.rs
index fd487b7d85..2b9551ddb4 100644
--- a/mullvad-rpc/src/lib.rs
+++ b/mullvad-rpc/src/lib.rs
@@ -304,7 +304,7 @@ impl AccountsProxy {
"/v1/me",
Method::GET,
Some(account),
- StatusCode::OK,
+ &[StatusCode::OK],
);
async move {
let account: AccountResponse = rest::deserialize_body(response.await?).await?;
@@ -320,7 +320,7 @@ impl AccountsProxy {
"/v1/accounts",
Method::POST,
None,
- StatusCode::CREATED,
+ &[StatusCode::CREATED],
);
async move {
@@ -348,7 +348,7 @@ impl AccountsProxy {
"/v1/submit-voucher",
&submission,
Some(account_token),
- StatusCode::OK,
+ &[StatusCode::OK],
);
async move { rest::deserialize_body(response.await?).await }
@@ -370,7 +370,7 @@ impl AccountsProxy {
"/v1/www-auth-token",
Method::POST,
Some(account),
- StatusCode::OK,
+ &[StatusCode::OK],
);
async move {
@@ -419,7 +419,7 @@ impl ProblemReportProxy {
"/v1/problem-report",
&report,
None,
- StatusCode::NO_CONTENT,
+ &[StatusCode::NO_CONTENT],
);
async move {
@@ -463,7 +463,7 @@ impl AppVersionProxy {
request.add_header("M-Platform-Version", &platform_version)?;
let response = service.request(request).await?;
- let parsed_response = rest::parse_rest_response(response, StatusCode::OK).await?;
+ let parsed_response = rest::parse_rest_response(response, &[StatusCode::OK]).await?;
rest::deserialize_body(parsed_response).await
}
}
@@ -504,8 +504,10 @@ impl WireguardKeyProxy {
}
request.set_auth(Some(account_token))?;
let response = service.request(request).await?;
- rest::deserialize_body(rest::parse_rest_response(response, StatusCode::CREATED).await?)
- .await
+ rest::deserialize_body(
+ rest::parse_rest_response(response, &[StatusCode::CREATED]).await?,
+ )
+ .await
}
}
@@ -530,7 +532,7 @@ impl WireguardKeyProxy {
&"/v1/replace-wireguard-key",
&body,
Some(account_token),
- StatusCode::CREATED,
+ [StatusCode::CREATED, StatusCode::OK].as_slice(),
)
.await?;
@@ -553,7 +555,7 @@ impl WireguardKeyProxy {
),
Method::GET,
Some(account_token),
- StatusCode::OK,
+ &[StatusCode::OK],
)
.await?;
@@ -575,7 +577,7 @@ impl WireguardKeyProxy {
),
Method::DELETE,
Some(account_token),
- StatusCode::NO_CONTENT,
+ &[StatusCode::NO_CONTENT],
);
async move {
let _ = future.await?;
@@ -603,7 +605,7 @@ impl ApiProxy {
"/v1/api-addrs",
Method::GET,
None,
- StatusCode::OK,
+ &[StatusCode::OK],
)
.await?;
diff --git a/mullvad-rpc/src/rest.rs b/mullvad-rpc/src/rest.rs
index 4ea31ca256..00ea973dd3 100644
--- a/mullvad-rpc/src/rest.rs
+++ b/mullvad-rpc/src/rest.rs
@@ -512,14 +512,14 @@ pub fn get_request<T: serde::de::DeserializeOwned>(
service: RequestServiceHandle,
uri: &str,
auth: Option<String>,
- expected_status: hyper::StatusCode,
-) -> impl Future<Output = Result<Response>> {
+ expected_statuses: &'static [hyper::StatusCode],
+) -> impl Future<Output = Result<Response>> + 'static {
let request = factory.get(uri);
async move {
let mut request = request?;
request.set_auth(auth)?;
let response = service.request(request).await?;
- parse_rest_response(response, expected_status).await
+ parse_rest_response(response, expected_statuses).await
}
}
@@ -529,7 +529,7 @@ pub fn send_request(
uri: &str,
method: Method,
auth: Option<String>,
- expected_status: hyper::StatusCode,
+ expected_statuses: &'static [hyper::StatusCode],
) -> impl Future<Output = Result<Response>> {
let request = factory.request(uri, method);
@@ -537,7 +537,7 @@ pub fn send_request(
let mut request = request?;
request.set_auth(auth)?;
let response = service.request(request).await?;
- parse_rest_response(response, expected_status).await
+ parse_rest_response(response, expected_statuses).await
}
}
@@ -547,14 +547,14 @@ pub fn post_request_with_json<B: serde::Serialize>(
uri: &str,
body: &B,
auth: Option<String>,
- expected_status: hyper::StatusCode,
+ expected_statuses: &'static [hyper::StatusCode],
) -> impl Future<Output = Result<Response>> {
let request = factory.post_json(uri, body);
async move {
let mut request = request?;
request.set_auth(auth)?;
let response = service.request(request).await?;
- parse_rest_response(response, expected_status).await
+ parse_rest_response(response, expected_statuses).await
}
}
@@ -576,11 +576,21 @@ pub async fn deserialize_body<T: serde::de::DeserializeOwned>(mut response: Resp
pub async fn parse_rest_response(
response: Response,
- expected_status: hyper::StatusCode,
+ expected_statuses: &'static [hyper::StatusCode],
) -> Result<Response> {
- let status = response.status();
- if status != expected_status {
- return handle_error_response(response).await;
+ if !expected_statuses.contains(&response.status()) {
+ log::error!(
+ "Unexpected HTTP status code {}, expected codes [{}]",
+ response.status(),
+ expected_statuses
+ .iter()
+ .map(ToString::to_string)
+ .collect::<Vec<_>>()
+ .join(",")
+ );
+ if !response.status().is_success() {
+ return handle_error_response(response).await;
+ }
}
Ok(response)