Skip to content

Commit f826ac7

Browse files
committed
idk
1 parent 38ec08c commit f826ac7

File tree

5 files changed

+45
-18
lines changed

5 files changed

+45
-18
lines changed

assets/favicon.ico

14.7 KB
Binary file not shown.

src/auth.rs

+12-9
Original file line numberDiff line numberDiff line change
@@ -299,20 +299,23 @@ impl S3Auth for RwLock<ACLAuth> {
299299
if let (Some(perms), Some(token)) = (perms, token) {
300300
if perms.iter().any(|i| i.matches(&operation, bucket, path)) {
301301
if operation == S3Operation::BucketCreate
302-
&& !storage
303-
.is_bucket_exist(bucket)
304-
.await
305-
.map_err(|_| S3AuthError::InvalidBucket)?
306-
&& storage
307-
.is_bucket_exist(&token.origin)
308-
.await
309-
.map_err(|_| S3AuthError::InvalidBucket)?
302+
&& !storage.is_bucket_exist(bucket).await.map_err(|_| {
303+
S3AuthError::InvalidBucket(
304+
"Unexpected: your token origin does not exist".to_string(),
305+
)
306+
})?
307+
&& storage.is_bucket_exist(&token.origin).await.map_err(|_| {
308+
S3AuthError::InvalidBucket("An bucket already exist".to_string())
309+
})?
310310
{
311+
debug!("Now creating new bucket");
311312
let mut write_guard = self.write().await;
312313
return write_guard
313314
.indexdb
314315
.create_bucket_from(bucket, &token.origin)
315-
.map_err(|_| S3AuthError::InvalidBucket);
316+
.map_err(|e| {
317+
S3AuthError::InvalidBucket(format!("Upon create bucket, {}", e))
318+
});
316319
}
317320
let is_valid_origin = {
318321
let read_guard = self.read().await;

src/errors.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ pub enum S3AuthError {
208208
/// Invalid credentials
209209
InvalidCredentials,
210210
/// Invalid bucket
211-
InvalidBucket,
211+
InvalidBucket(String),
212212
/// Token verification failed
213213
TokenVerificationFailed,
214214
/// Missing required token
@@ -266,9 +266,9 @@ impl S3AuthError {
266266
S3ErrorCode::InvalidAccessKeyId,
267267
"The provided credentials are invalid.",
268268
),
269-
Self::InvalidBucket => S3Error::new(
269+
Self::InvalidBucket(str) => S3Error::new(
270270
S3ErrorCode::InvalidBucketName,
271-
"The specified bucket does not exist.",
271+
format!("The specified bucket does not exist. {}", str),
272272
),
273273
Self::TokenVerificationFailed => {
274274
S3Error::new(S3ErrorCode::InvalidToken, "Token verification failed.")

src/service.rs

+10
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ use futures::future::BoxFuture;
3535
use futures::stream::{Stream, StreamExt};
3636
use hyper::body::Bytes;
3737

38+
use hyper::header::HeaderValue;
3839
use tokio::sync::RwLock;
3940
use tracing::{debug, error};
4041

@@ -135,6 +136,15 @@ impl S3Service {
135136
#[cfg(debug_assertions)]
136137
debug!("req = \n{:#?}", req);
137138

139+
if req.uri().path() == "/favicon.ico" {
140+
let favicon = include_bytes!("../assets/favicon.ico");
141+
let mut res = Response::new(Body::from(favicon.to_vec()));
142+
let _ = res
143+
.headers_mut()
144+
.insert(CONTENT_TYPE, HeaderValue::from_static("image/x-icon"));
145+
return Ok(res);
146+
}
147+
138148
if req.uri().path() == "/metrics" {
139149
// Handle metrics endpoint
140150
let metrics = self.metrics().await;

src/storages/fs.rs

+20-6
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,11 @@ impl S3Storage for FileSystem {
665665
debug!("Bucket path: {:?}", bucket_path);
666666

667667
let (search_dir, prefix_filter) =
668-
self.parse_prefix_and_delimiter(&input.prefix, &input.delimiter);
668+
if input.delimiter.is_none() || input.prefix.as_deref().unwrap_or("").is_empty() {
669+
(PathBuf::new(), String::new())
670+
} else {
671+
self.parse_prefix_and_delimiter(&input.prefix, &input.delimiter)
672+
};
669673
let search_path = bucket_path.join(&search_dir);
670674
debug!("Search path: {:?}", search_path);
671675

@@ -681,7 +685,8 @@ impl S3Storage for FileSystem {
681685

682686
let (mut objects, common_prefixes) = trace_try!(
683687
self.list_contents(
684-
input.prefix.is_some(),
688+
input.delimiter.is_some()
689+
&& input.prefix.as_deref().map_or(false, |p| !p.is_empty()),
685690
&bucket_path,
686691
&search_path,
687692
&prefix_filter,
@@ -710,7 +715,9 @@ impl S3Storage for FileSystem {
710715

711716
Ok(ListObjectsOutput {
712717
contents: Some(objects),
713-
common_prefixes: if input.delimiter.is_some() {
718+
common_prefixes: if input.delimiter.is_some()
719+
&& !input.prefix.as_deref().unwrap_or("").is_empty()
720+
{
714721
Some(
715722
common_prefixes
716723
.into_iter()
@@ -738,7 +745,11 @@ impl S3Storage for FileSystem {
738745
debug!("Bucket path: {:?}", bucket_path);
739746

740747
let (search_dir, prefix_filter) =
741-
self.parse_prefix_and_delimiter(&input.prefix, &input.delimiter);
748+
if input.delimiter.is_none() || input.prefix.as_deref().unwrap_or("").is_empty() {
749+
(PathBuf::new(), String::new())
750+
} else {
751+
self.parse_prefix_and_delimiter(&input.prefix, &input.delimiter)
752+
};
742753
let search_path = bucket_path.join(&search_dir);
743754
debug!("Search path: {:?}", search_path);
744755

@@ -755,7 +766,8 @@ impl S3Storage for FileSystem {
755766

756767
let (mut objects, common_prefixes) = trace_try!(
757768
self.list_contents(
758-
input.prefix.is_some(),
769+
input.delimiter.is_some()
770+
&& input.prefix.as_deref().map_or(false, |p| !p.is_empty()),
759771
&bucket_path,
760772
&search_path,
761773
&prefix_filter,
@@ -787,7 +799,9 @@ impl S3Storage for FileSystem {
787799

788800
Ok(ListObjectsV2Output {
789801
contents: Some(objects),
790-
common_prefixes: if input.delimiter.is_some() {
802+
common_prefixes: if input.delimiter.is_some()
803+
&& !input.prefix.as_deref().unwrap_or("").is_empty()
804+
{
791805
Some(
792806
common_prefixes
793807
.iter()

0 commit comments

Comments
 (0)