Skip to content

Commit

Permalink
refactor: make parse http error code public (#511)
Browse files Browse the repository at this point in the history
* [refactor]: make parse http error code public

1. now all http related service use public parse_http_error_code
   function
2. update gitignore

Signed-off-by: ClSlaid <cailue@bupt.edu.cn>

* Refactor: cargo fmt

Signed-off-by: ClSlaid <cailue@bupt.edu.cn>

* refactor: rename parse_http_error_code

rename parse_http_error_code to parse_error_status_code

Signed-off-by: ClSlaid <cailue@bupt.edu.cn>

Signed-off-by: ClSlaid <cailue@bupt.edu.cn>
  • Loading branch information
ClSlaid committed Aug 11, 2022
1 parent 4f26b73 commit 624a63f
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 60 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# IDE and editor
.vscode
.idea

**/target
/Cargo.lock

Expand Down
13 changes: 13 additions & 0 deletions src/http_util/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,19 @@ pub fn parse_error_kind(err: &isahc::Error) -> ErrorKind {
}
}

/// parse_error_status_code will parse HTTP status code into `ErrorKind`
pub fn parse_error_status_code(code: StatusCode) -> ErrorKind {
match code {
StatusCode::NOT_FOUND => ErrorKind::NotFound,
StatusCode::FORBIDDEN => ErrorKind::PermissionDenied,
StatusCode::INTERNAL_SERVER_ERROR
| StatusCode::BAD_GATEWAY
| StatusCode::SERVICE_UNAVAILABLE
| StatusCode::GATEWAY_TIMEOUT => ErrorKind::Interrupted,
_ => ErrorKind::Other,
}
}

/// parse_error_response will try to read and parse error response.
pub fn parse_error_response(
op: &'static str,
Expand Down
1 change: 1 addition & 0 deletions src/http_util/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,4 @@ pub use uri::percent_encode_path;
mod error;
pub use error::parse_error_kind;
pub use error::parse_error_response;
pub use error::parse_error_status_code;
30 changes: 12 additions & 18 deletions src/services/azblob/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ use std::fmt::Debug;
use std::fmt::Formatter;
use std::fmt::Write;
use std::io::Error;
use std::io::ErrorKind;
use std::io::Result;
use std::mem;
use std::sync::Arc;
Expand All @@ -45,6 +44,7 @@ use crate::http_util::new_http_channel;
use crate::http_util::parse_content_length;
use crate::http_util::parse_error_kind as parse_http_error_kind;
use crate::http_util::parse_error_response;
use crate::http_util::parse_error_status_code;
use crate::http_util::parse_etag;
use crate::http_util::parse_last_modified;
use crate::http_util::percent_encode_path;
Expand Down Expand Up @@ -326,7 +326,9 @@ impl Accessor for Backend {
Ok(())
}
_ => {
let err = parse_error_response("create", args.path(), parse_error_kind, resp).await;
let err =
parse_error_response("create", args.path(), parse_error_status_code, resp)
.await;
warn!("object {} create: {:?}", args.path(), err);
Err(err)
}
Expand Down Expand Up @@ -358,7 +360,8 @@ impl Accessor for Backend {
Ok(Box::new(resp.into_body()))
}
_ => {
let err = parse_error_response("read", args.path(), parse_error_kind, resp).await;
let err =
parse_error_response("read", args.path(), parse_error_status_code, resp).await;
warn!("object {} read: {:?}", args.path(), err);
Err(err)
}
Expand All @@ -379,7 +382,7 @@ impl Accessor for Backend {
tx,
self.client.send_async(req),
HashSet::from([StatusCode::CREATED, StatusCode::OK]),
parse_error_kind,
parse_error_status_code,
);

Ok(Box::new(bs))
Expand Down Expand Up @@ -442,7 +445,8 @@ impl Accessor for Backend {
Ok(m)
}
_ => {
let err = parse_error_response("stat", args.path(), parse_error_kind, resp).await;
let err =
parse_error_response("stat", args.path(), parse_error_status_code, resp).await;
warn!("object {} stat: {:?}", args.path(), err);
Err(err)
}
Expand All @@ -463,7 +467,9 @@ impl Accessor for Backend {
Ok(())
}
_ => {
let err = parse_error_response("delete", args.path(), parse_error_kind, resp).await;
let err =
parse_error_response("delete", args.path(), parse_error_status_code, resp)
.await;
warn!("object {} delete: {:?}", args.path(), err);
Err(err)
}
Expand Down Expand Up @@ -703,15 +709,3 @@ impl Backend {
})
}
}

pub fn parse_error_kind(code: StatusCode) -> ErrorKind {
match code {
StatusCode::NOT_FOUND => ErrorKind::NotFound,
StatusCode::FORBIDDEN => ErrorKind::PermissionDenied,
StatusCode::INTERNAL_SERVER_ERROR
| StatusCode::BAD_GATEWAY
| StatusCode::SERVICE_UNAVAILABLE
| StatusCode::GATEWAY_TIMEOUT => ErrorKind::Interrupted,
_ => ErrorKind::Other,
}
}
12 changes: 8 additions & 4 deletions src/services/azblob/dir_stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ use super::Backend;
use crate::error::other;
use crate::error::ObjectError;
use crate::http_util::parse_error_response;
use crate::services::azblob::backend::parse_error_kind;
use crate::http_util::parse_error_status_code;
use crate::DirEntry;
use crate::ObjectMode;

Expand Down Expand Up @@ -76,9 +76,13 @@ impl futures::Stream for DirStream {
let mut resp = backend.list_blobs(&path, &next_marker).await?;

if resp.status() != http::StatusCode::OK {
return Err(
parse_error_response("list", &path, parse_error_kind, resp).await
);
return Err(parse_error_response(
"list",
&path,
parse_error_status_code,
resp,
)
.await);
}

let bs = resp
Expand Down
31 changes: 14 additions & 17 deletions src/services/http/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ use crate::http_util::parse_content_length;
use crate::http_util::parse_content_md5;
use crate::http_util::parse_error_kind as parse_http_error_kind;
use crate::http_util::parse_error_response;
use crate::http_util::parse_error_status_code;
use crate::http_util::parse_etag;
use crate::http_util::parse_last_modified;
use crate::http_util::percent_encode_path;
Expand Down Expand Up @@ -322,7 +323,9 @@ impl Accessor for Backend {
Ok(())
}
_ => {
let err = parse_error_response("create", args.path(), parse_error_kind, resp).await;
let err =
parse_error_response("create", args.path(), parse_error_status_code, resp)
.await;
warn!("object {} create: {:?}", args.path(), err);
Err(err)
}
Expand Down Expand Up @@ -357,7 +360,9 @@ impl Accessor for Backend {

Ok(Box::new(resp.into_body()))
}
_ => Err(parse_error_response("read", args.path(), parse_error_kind, resp).await),
_ => {
Err(parse_error_response("read", args.path(), parse_error_status_code, resp).await)
}
}
}

Expand All @@ -374,7 +379,7 @@ impl Accessor for Backend {
tx,
self.client.send_async(req),
HashSet::from([StatusCode::CREATED, StatusCode::OK]),
parse_error_kind,
parse_error_status_code,
);

self.insert_path(&self.get_index_path(args.path()));
Expand Down Expand Up @@ -441,7 +446,9 @@ impl Accessor for Backend {
debug!("object {} stat finished", &p);
Ok(m)
}
_ => Err(parse_error_response("stat", args.path(), parse_error_kind, resp).await),
_ => {
Err(parse_error_response("stat", args.path(), parse_error_status_code, resp).await)
}
}
}

Expand All @@ -458,7 +465,9 @@ impl Accessor for Backend {
Ok(())
}
_ => {
let err = parse_error_response("delete", args.path(), parse_error_kind, resp).await;
let err =
parse_error_response("delete", args.path(), parse_error_status_code, resp)
.await;
warn!("object {} delete: {:?}", args.path(), err);
Err(err)
}
Expand Down Expand Up @@ -674,18 +683,6 @@ impl futures::Stream for DirStream {
}
}

fn parse_error_kind(code: StatusCode) -> ErrorKind {
match code {
StatusCode::NOT_FOUND => ErrorKind::NotFound,
StatusCode::FORBIDDEN => ErrorKind::PermissionDenied,
StatusCode::INTERNAL_SERVER_ERROR
| StatusCode::BAD_GATEWAY
| StatusCode::SERVICE_UNAVAILABLE
| StatusCode::GATEWAY_TIMEOUT => ErrorKind::Interrupted,
_ => ErrorKind::Other,
}
}

#[cfg(test)]
mod tests {
use anyhow::Result;
Expand Down
29 changes: 12 additions & 17 deletions src/services/s3/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ use crate::http_util::new_http_channel;
use crate::http_util::parse_content_length;
use crate::http_util::parse_error_kind as parse_http_error_kind;
use crate::http_util::parse_error_response;
use crate::http_util::parse_error_status_code;
use crate::http_util::parse_etag;
use crate::http_util::parse_last_modified;
use crate::http_util::percent_encode_path;
Expand Down Expand Up @@ -1136,7 +1137,9 @@ impl Accessor for Backend {
Ok(())
}
_ => {
let err = parse_error_response("create", args.path(), parse_error_kind, resp).await;
let err =
parse_error_response("create", args.path(), parse_error_status_code, resp)
.await;
warn!("object {} create: {:?}", args.path(), err);
Err(err)
}
Expand Down Expand Up @@ -1175,7 +1178,8 @@ impl Accessor for Backend {
Ok(Box::new(resp.into_body()))
}
_ => {
let err = parse_error_response("read", args.path(), parse_error_kind, resp).await;
let err =
parse_error_response("read", args.path(), parse_error_status_code, resp).await;
warn!("object {} read: {:?}", args.path(), err);
Err(err)
}
Expand All @@ -1196,7 +1200,7 @@ impl Accessor for Backend {
tx,
self.client.send_async(req),
HashSet::from([StatusCode::CREATED, StatusCode::OK]),
parse_error_kind,
parse_error_status_code,
);

Ok(Box::new(bs))
Expand Down Expand Up @@ -1260,7 +1264,8 @@ impl Accessor for Backend {
Ok(m)
}
_ => {
let err = parse_error_response("stat", args.path(), parse_error_kind, resp).await;
let err =
parse_error_response("stat", args.path(), parse_error_status_code, resp).await;
warn!("object {} stat: {:?}", args.path(), err);
Err(err)
}
Expand All @@ -1282,7 +1287,9 @@ impl Accessor for Backend {
Ok(())
}
_ => {
let err = parse_error_response("delete", args.path(), parse_error_kind, resp).await;
let err =
parse_error_response("delete", args.path(), parse_error_status_code, resp)
.await;
warn!("object {} delete: {:?}", args.path(), err);
Err(err)
}
Expand Down Expand Up @@ -1596,18 +1603,6 @@ impl Backend {
}
}

pub(crate) fn parse_error_kind(code: StatusCode) -> ErrorKind {
match code {
StatusCode::NOT_FOUND => ErrorKind::NotFound,
StatusCode::FORBIDDEN => ErrorKind::PermissionDenied,
StatusCode::INTERNAL_SERVER_ERROR
| StatusCode::BAD_GATEWAY
| StatusCode::SERVICE_UNAVAILABLE
| StatusCode::GATEWAY_TIMEOUT => ErrorKind::Interrupted,
_ => ErrorKind::Other,
}
}

#[cfg(test)]
mod tests {
use itertools::iproduct;
Expand Down
12 changes: 8 additions & 4 deletions src/services/s3/dir_stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ use super::Backend;
use crate::error::other;
use crate::error::ObjectError;
use crate::http_util::parse_error_response;
use crate::services::s3::backend::parse_error_kind;
use crate::http_util::parse_error_status_code;
use crate::DirEntry;
use crate::ObjectMode;

Expand Down Expand Up @@ -78,9 +78,13 @@ impl futures::Stream for DirStream {
let mut resp = backend.list_objects(&path, &token).await?;

if resp.status() != http::StatusCode::OK {
return Err(
parse_error_response("list", &path, parse_error_kind, resp).await
);
return Err(parse_error_response(
"list",
&path,
parse_error_status_code,
resp,
)
.await);
}

let bs = resp.bytes().await.map_err(|e| {
Expand Down

1 comment on commit 624a63f

@github-actions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deploy preview for opendal ready!

✅ Preview
https://opendal-68pvip6t9-databend.vercel.app

Built with commit 624a63f.
This pull request is being automatically deployed with vercel-action

Please sign in to comment.