From ac0c8c05d14085c5c7f08a4a2cffd7828090738b Mon Sep 17 00:00:00 2001 From: renxingliang Date: Tue, 30 Jul 2019 09:53:54 +0800 Subject: [PATCH] 1.Modify Etag case to adapt to Baidu Cloud Object Storage. 2.Modify the contentlength type to handle files larger than 2G. --- src/aws/s3/s3client.rs | 23 ++++++++++++++++++----- src/aws/s3/writeparse.rs | 4 ++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/aws/s3/s3client.rs b/src/aws/s3/s3client.rs index 0c268ce9..4c210568 100644 --- a/src/aws/s3/s3client.rs +++ b/src/aws/s3/s3client.rs @@ -1264,7 +1264,7 @@ impl S3Client let cache_control = try!(S3Client::::get_value_for_header("Cache-Control".to_string(), response)); let content_length_string = try!(S3Client::::get_value_for_header("Content-Length".to_string(), response)); - let content_length = try!(content_length_string.parse::()); + let content_length = try!(content_length_string.parse::()); let expiration = try!(S3Client::::get_value_for_header("x-amz-expiration".to_string(), response)); let missing_meta_string = try!(S3Client::::get_value_for_header("x-amz-missing-meta".to_string(), response)); @@ -1279,7 +1279,10 @@ impl S3Client let content_type = try!(S3Client::::get_value_for_header("Content-Type".to_string(), response)); let content_language = try!(S3Client::::get_value_for_header("Content-Language".to_string(), response)); let version_id = try!(S3Client::::get_value_for_header("x-amz-version-id".to_string(), response)); - let e_tag = try!(S3Client::::get_value_for_header("ETag".to_string(), response)); + let mut e_tag = try!(S3Client::::get_value_for_header("Etag".to_string(), response)); + if e_tag.is_empty() { + e_tag = try!(S3Client::::get_value_for_header("ETag".to_string(), response)); + } let sse_customer_key_md5 = try!(S3Client::::get_value_for_header("x-amz-server-side-encryption-customer-key-MD5".to_string(), response)); // make the object to return let head_object = HeadObjectOutput { @@ -1346,7 +1349,7 @@ impl S3Client let cache_control = try!(S3Client::::get_value_for_header("Cache-Control".to_string(), response)); let content_length_string = try!(S3Client::::get_value_for_header("Content-Length".to_string(), response)); - let content_length = try!(content_length_string.parse::()); + let content_length = try!(content_length_string.parse::()); let expiration = try!(S3Client::::get_value_for_header("x-amz-expiration".to_string(), response)); let missing_meta_string = try!(S3Client::::get_value_for_header("x-amz-missing-meta".to_string(), response)); @@ -1363,7 +1366,12 @@ impl S3Client let content_type = try!(S3Client::::get_value_for_header("Content-Type".to_string(), response)); let content_language = try!(S3Client::::get_value_for_header("Content-Language".to_string(), response)); let version_id = try!(S3Client::::get_value_for_header("x-amz-version-id".to_string(), response)); - let e_tag = try!(S3Client::::get_value_for_header("ETag".to_string(), response)); + + let mut e_tag = try!(S3Client::::get_value_for_header("ETag".to_string(), response)); + if e_tag.is_empty() { + e_tag = try!(S3Client::::get_value_for_header("Etag".to_string(), response)); + } + let sse_customer_key_md5 = try!(S3Client::::get_value_for_header("x-amz-server-side-encryption-customer-key-MD5".to_string(), response)); @@ -1625,7 +1633,12 @@ impl S3Client match status { 200 => { - match result.headers.get("ETag") { + let mut etag = result.headers.get("ETag"); + if etag == None { + etag = result.headers.get("Etag"); + } + + match etag { Some(ref value) => Ok(value.to_string()), None => Err(S3Error::new("Couldn't find etag in response headers.")), } diff --git a/src/aws/s3/writeparse.rs b/src/aws/s3/writeparse.rs index 57e45a19..136d18ed 100644 --- a/src/aws/s3/writeparse.rs +++ b/src/aws/s3/writeparse.rs @@ -3076,14 +3076,14 @@ impl TransitionStorageClassWriter { } } -pub type ContentLength = i32; +pub type ContentLength = i64; /// Parse `ContentLength` from XML pub struct ContentLengthParser; impl ContentLengthParser { pub fn parse_xml(tag_name: &str, stack: &mut T) -> Result { try!(start_element(tag_name, stack)); - let obj = i32::from_str(try!(characters(stack)).as_ref()).unwrap(); + let obj = i64::from_str(try!(characters(stack)).as_ref()).unwrap(); try!(end_element(tag_name, stack)); Ok(obj) }