1 use reqwest::{RequestBuilder, StatusCode};
2 use serde_json::Value;
3 use smbcloud_model::error_codes::{ErrorCode, ErrorResponse};
4 use smbcloud_network::network::{check_internet_connection, parse_error_response};
5
6 /// Like `smbcloud_network::network::request`, but for endpoints that reply
7 /// with an empty body (e.g. `DELETE` returning `204 No Content`). The generic
8 /// `request` only treats `200`/`201` as success and then tries to parse the
9 /// body as JSON, so it fails on a bare `204`.
10 pub(crate) async fn request_empty(builder: RequestBuilder) -> Result<(), ErrorResponse> {
11 if !check_internet_connection().await {
12 return Err(ErrorResponse::Error {
13 error_code: ErrorCode::NetworkError,
14 message: "No internet connection. Please check your network settings and try again."
15 .to_string(),
16 });
17 }
18
19 let response = builder.send().await.map_err(|_| ErrorResponse::Error {
20 error_code: ErrorCode::NetworkError,
21 message: ErrorCode::NetworkError.message(None).to_string(),
22 })?;
23
24 match response.status() {
25 StatusCode::OK | StatusCode::CREATED | StatusCode::NO_CONTENT => Ok(()),
26 _ => match parse_error_response::<Value>(response).await {
27 Ok(_) => Err(ErrorResponse::Error {
28 error_code: ErrorCode::ParseError,
29 message: ErrorCode::ParseError.message(None).to_string(),
30 }),
31 Err(error_response) => Err(error_response),
32 },
33 }
34 }