diff options
| author | Bug Magnet <marco.nikic@mullvad.net> | 2025-05-08 09:32:52 +0200 |
|---|---|---|
| committer | Bug Magnet <marco.nikic@mullvad.net> | 2025-05-08 09:32:52 +0200 |
| commit | caf05bc110aeb3f6c0b4db9723629818e7e81d99 (patch) | |
| tree | 4a15da846efe1f5fe9bf486d2c35727b1e2d1b31 /mullvad-api | |
| parent | a74a0c0aa3270bb2cf7861f94ad7dc590ed50d22 (diff) | |
| parent | 01660f7d4af6fc539ce938f44f26bdf55337b57a (diff) | |
| download | mullvadvpn-caf05bc110aeb3f6c0b4db9723629818e7e81d99.tar.xz mullvadvpn-caf05bc110aeb3f6c0b4db9723629818e7e81d99.zip | |
Merge branch 'implement-storekit2-api-calls-using-mullvad-api-ios-1158'
Diffstat (limited to 'mullvad-api')
| -rw-r--r-- | mullvad-api/src/lib.rs | 33 | ||||
| -rw-r--r-- | mullvad-api/src/rest.rs | 23 |
2 files changed, 51 insertions, 5 deletions
diff --git a/mullvad-api/src/lib.rs b/mullvad-api/src/lib.rs index fb44b5ba89..d203d4dd04 100644 --- a/mullvad-api/src/lib.rs +++ b/mullvad-api/src/lib.rs @@ -65,6 +65,10 @@ pub const API_IP_CACHE_FILENAME: &str = "api-ip-address.txt"; const ACCOUNTS_URL_PREFIX: &str = "accounts/v1"; const APP_URL_PREFIX: &str = "app/v1"; + +#[cfg(target_os = "ios")] +const APPLE_PAYMENT_URL_PREFIX: &str = "payments/apple/v2"; + #[cfg(target_os = "android")] const GOOGLE_PAYMENTS_URL_PREFIX: &str = "payments/google-play/v1"; @@ -599,6 +603,35 @@ impl AccountsProxy { } } + #[cfg(target_os = "ios")] + pub async fn init_storekit_payment( + &self, + account: AccountNumber, + ) -> Result<rest::Response<Incoming>, rest::Error> { + let request = self + .handle + .factory + .post(&format!("{APPLE_PAYMENT_URL_PREFIX}/init"))? + .expected_status(&[StatusCode::OK]) + .account(account)?; + self.handle.service.request(request).await + } + + #[cfg(target_os = "ios")] + pub async fn check_storekit_payment( + &self, + account: AccountNumber, + body: Vec<u8>, + ) -> Result<rest::Response<Incoming>, rest::Error> { + let request = self + .handle + .factory + .post_json_bytes(&format!("{APPLE_PAYMENT_URL_PREFIX}/check"), body)? + .expected_status(&[StatusCode::OK]) + .account(account)?; + self.handle.service.request(request).await + } + #[cfg(target_os = "android")] pub fn init_play_purchase( &mut self, diff --git a/mullvad-api/src/rest.rs b/mullvad-api/src/rest.rs index 94c43392ad..14e37ec29e 100644 --- a/mullvad-api/src/rest.rs +++ b/mullvad-api/src/rest.rs @@ -606,6 +606,10 @@ impl RequestFactory { self.json_request(Method::POST, path, body) } + pub fn post_json_bytes(&self, path: &str, body: Vec<u8>) -> Result<Request<Full<Bytes>>> { + self.json_request_with_bytes(Method::POST, path, body) + } + pub fn put_json<S: serde::Serialize>( &self, path: &str, @@ -618,17 +622,16 @@ impl RequestFactory { self.default_timeout = timeout; self } - fn json_request<S: serde::Serialize>( + fn json_request_with_bytes( &self, method: Method, path: &str, - body: &S, + body: Vec<u8>, ) -> Result<Request<Full<Bytes>>> { let mut request = self.hyper_request(path, method)?; - let json_body = serde_json::to_vec(&body)?; - let body_length = json_body.len(); - *request.body_mut() = Full::new(Bytes::from(json_body)); + let body_length = body.len(); + *request.body_mut() = Full::new(Bytes::from(body)); let headers = request.headers_mut(); headers.insert(header::CONTENT_LENGTH, HeaderValue::from(body_length)); @@ -640,6 +643,16 @@ impl RequestFactory { Ok(Request::new(request, self.token_store.clone()).timeout(self.default_timeout)) } + fn json_request<S: serde::Serialize>( + &self, + method: Method, + path: &str, + body: &S, + ) -> Result<Request<Full<Bytes>>> { + let json_body = serde_json::to_vec(&body)?; + self.json_request_with_bytes(method, path, json_body) + } + fn hyper_request<B: Default>(&self, path: &str, method: Method) -> Result<http::Request<B>> { let uri = self.get_uri(path)?; let request = http::request::Builder::new() |
