diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/api/s3_get.rs | 11 | ||||
-rw-r--r-- | src/api/s3_put.rs | 33 |
2 files changed, 33 insertions, 11 deletions
diff --git a/src/api/s3_get.rs b/src/api/s3_get.rs index a3a20d49..77939342 100644 --- a/src/api/s3_get.rs +++ b/src/api/s3_get.rs @@ -19,16 +19,21 @@ fn object_headers( let date = UNIX_EPOCH + Duration::from_millis(version.timestamp); let date_str = httpdate::fmt_http_date(date); - Response::builder() + let mut resp = Response::builder() .header( "Content-Type", version_meta.headers.content_type.to_string(), ) - // TODO: other headers .header("Content-Length", format!("{}", version_meta.size)) .header("ETag", version_meta.etag.to_string()) .header("Last-Modified", date_str) - .header("Accept-Ranges", format!("bytes")) + .header("Accept-Ranges", format!("bytes")); + + for (k, v) in version_meta.headers.other.iter() { + resp = resp.header(k, v.to_string()); + } + + resp } pub async fn handle_head( diff --git a/src/api/s3_put.rs b/src/api/s3_put.rs index 9ac7dafd..0a010a82 100644 --- a/src/api/s3_put.rs +++ b/src/api/s3_put.rs @@ -24,10 +24,7 @@ pub async fn handle_put( key: &str, ) -> Result<Response<Body>, Error> { let version_uuid = gen_uuid(); - let headers = ObjectVersionHeaders { - content_type: get_mime_type(&req)?, - other: BTreeMap::new(), // TODO - }; + let headers = get_headers(&req)?; let body = req.into_body(); @@ -221,10 +218,7 @@ pub async fn handle_create_multipart_upload( key: &str, ) -> Result<Response<Body>, Error> { let version_uuid = gen_uuid(); - let headers = ObjectVersionHeaders { - content_type: get_mime_type(&req)?, - other: BTreeMap::new(), // TODO - }; + let headers = get_headers(req)?; let object_version = ObjectVersion { uuid: version_uuid, @@ -444,6 +438,29 @@ fn get_mime_type(req: &Request<Body>) -> Result<String, Error> { .to_string()) } +fn get_headers(req: &Request<Body>) -> Result<ObjectVersionHeaders, Error> { + let content_type = get_mime_type(req)?; + let other_headers = vec![ + hyper::header::CACHE_CONTROL, + hyper::header::CONTENT_DISPOSITION, + hyper::header::CONTENT_ENCODING, + hyper::header::CONTENT_LANGUAGE, + hyper::header::EXPIRES, + ]; + let mut other = BTreeMap::new(); + for h in other_headers.iter() { + if let Some(v) = req.headers().get(h) { + if let Ok(v_str) = v.to_str() { + other.insert(h.to_string(), v_str.to_string()); + } + } + } + Ok(ObjectVersionHeaders { + content_type, + other: BTreeMap::new(), + }) +} + fn uuid_from_str(id: &str) -> Result<UUID, ()> { let id_bin = hex::decode(id).map_err(|_| ())?; if id_bin.len() != 32 { |