diff options
| author | Emīls <emils@mullvad.net> | 2021-12-20 12:24:53 +0000 |
|---|---|---|
| committer | Emīls <emils@mullvad.net> | 2022-01-03 15:45:16 +0000 |
| commit | 26c20eba8674eacb5af26295a56dce5206b5b2ac (patch) | |
| tree | 2e18c3d9668feb490dd9adeb3b76473e8b44af86 | |
| parent | a39dd104fd863c917ae9475c0d4dfc9a6777b96e (diff) | |
| download | mullvadvpn-26c20eba8674eacb5af26295a56dce5206b5b2ac.tar.xz mullvadvpn-26c20eba8674eacb5af26295a56dce5206b5b2ac.zip | |
Always allow 2XX responses from the API
| -rw-r--r-- | mullvad-rpc/src/lib.rs | 26 | ||||
| -rw-r--r-- | mullvad-rpc/src/rest.rs | 32 |
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) |
