You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by xu...@apache.org on 2024/01/04 06:21:20 UTC
(incubator-opendal) 01/01: fix(core): Handling content encoding correctly
This is an automated email from the ASF dual-hosted git repository.
xuanwo pushed a commit to branch fix-content-encoding
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git
commit 94e9a9f79c33f8cb03440fcedfc89f9d07b6672d
Author: Xuanwo <gi...@xuanwo.io>
AuthorDate: Thu Jan 4 14:21:02 2024 +0800
fix(core): Handling content encoding correctly
Signed-off-by: Xuanwo <gi...@xuanwo.io>
---
core/src/raw/http_util/client.rs | 9 ++++++---
core/src/raw/http_util/header.rs | 7 ++++++-
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/core/src/raw/http_util/client.rs b/core/src/raw/http_util/client.rs
index 3bd7e826cd..94cbd1dd39 100644
--- a/core/src/raw/http_util/client.rs
+++ b/core/src/raw/http_util/client.rs
@@ -28,6 +28,7 @@ use http::Response;
use super::body::IncomingAsyncBody;
use super::parse_content_length;
use super::AsyncBody;
+use crate::raw::http_util::header::parse_content_encoding;
use crate::raw::*;
use crate::Error;
use crate::ErrorKind;
@@ -167,11 +168,13 @@ impl HttpClient {
})?;
// Get content length from header so that we can check it.
- // If the request method is HEAD, we will ignore this.
- let content_length = if is_head {
+ //
+ // - If the request method is HEAD, we will ignore content length.
+ // - If response contains content_encoding, we should omit it's content length.
+ let content_length = if is_head || parse_content_encoding(resp.headers())?.is_some() {
None
} else {
- parse_content_length(resp.headers()).expect("response content length must be valid")
+ parse_content_length(resp.headers())?
};
let mut hr = Response::builder()
diff --git a/core/src/raw/http_util/header.rs b/core/src/raw/http_util/header.rs
index f266f7c0c4..ec28113a70 100644
--- a/core/src/raw/http_util/header.rs
+++ b/core/src/raw/http_util/header.rs
@@ -19,7 +19,6 @@ use base64::engine::general_purpose;
use base64::Engine;
use chrono::DateTime;
use chrono::Utc;
-use http::header::CACHE_CONTROL;
use http::header::CONTENT_DISPOSITION;
use http::header::CONTENT_LENGTH;
use http::header::CONTENT_RANGE;
@@ -27,6 +26,7 @@ use http::header::CONTENT_TYPE;
use http::header::ETAG;
use http::header::LAST_MODIFIED;
use http::header::LOCATION;
+use http::header::{CACHE_CONTROL, CONTENT_ENCODING};
use http::HeaderValue;
use http::{HeaderMap, HeaderName};
use md5::Digest;
@@ -77,6 +77,11 @@ pub fn parse_content_type(headers: &HeaderMap) -> Result<Option<&str>> {
parse_header_to_str(headers, CONTENT_TYPE)
}
+/// Parse content encoding from header map.
+pub fn parse_content_encoding(headers: &HeaderMap) -> Result<Option<&str>> {
+ parse_header_to_str(headers, CONTENT_ENCODING)
+}
+
/// Parse content range from header map.
pub fn parse_content_range(headers: &HeaderMap) -> Result<Option<BytesContentRange>> {
parse_header_to_str(headers, CONTENT_RANGE)?