ITpandaffm opened a new issue, #7656:
URL: https://github.com/apache/opendal/issues/7656

   ### Feature Description
   
   
     The `services-oss` backend should support `OpWrite::content_encoding()` 
for write operations.
   
     `OpWrite::content_encoding()` already exists in OpenDAL, and other object 
storage backends such as S3 and GCS support writing objects
     with `Content-Encoding` metadata. OSS currently does not advertise 
`write_with_content_encoding`, and the header is not forwarded when
     writing objects.
   
     Expected usage:
   
     ```rust
     op.write_with("path/to/cfg.json", compressed_bytes)
         .content_type("application/json; charset=utf-8")
         .content_encoding("gzip")
         .cache_control("public, max-age=60")
         .await?;
   
     After upload, op.stat("path/to/cfg.json").await?.content_encoding() should 
return Some("gzip"), and OSS/CDN responses should preserve
     Content-Encoding: gzip.
   
   ### Problem and Solution
   
     In our application, we generate a `cfg.json`, gzip-compress it, and upload 
it to Aliyun OSS so that it can be served through CDN with
     transparent decompression.
   
     When using OpenDAL OSS, the uploaded object does not preserve the 
`Content-Encoding: gzip` metadata. The CDN/browser then receives
     gzip-compressed bytes without the response header needed for transparent 
decompression.
   
     We had to bypass OpenDAL for this upload path and send a native OSS `PUT` 
request with OSS v4 signing to explicitly set:
   
     ```text
     Content-Type: application/json; charset=utf-8
     Content-Encoding: gzip
     Cache-Control: public, max-age=60
   ```
   
   
     This workaround is functional, but it duplicates OSS signing logic outside 
OpenDAL and makes the abstraction leaky.
   
     The proposed solution is to wire the existing write option into the OSS 
backend:
   
     1. Set write_with_content_encoding: true in the OSS capability table.
     2. Forward args.content_encoding() in OSS PutObject / AppendObject 
metadata headers.
     3. Forward content_encoding when initiating multipart uploads, since OSS 
object metadata should be set on InitiateMultipartUpload.
   
   
   ### Additional Context
   
     ```markdown
     This is consistent with existing content-encoding support in other object 
storage backends.
   
     A minimal reproduction looks like:
   ```
   
     ```rust
     use opendal::{services::Oss, Operator};
   
     #[tokio::main]
     async fn main() -> opendal::Result<()> {
         let op: Operator = Operator::new(
             Oss::default()
                 .endpoint("https://oss-cn-hangzhou.aliyuncs.com";)
                 .bucket("my-bucket"),
         )?
         .finish();
   
         op.write_with("cfg.json", gzip_bytes())
             .content_type("application/json; charset=utf-8")
             .content_encoding("gzip")
             .cache_control("public, max-age=60")
             .await?;
   
         let meta = op.stat("cfg.json").await?;
         assert_eq!(meta.content_encoding(), Some("gzip"));
   
         Ok(())
     }
   ```
   
     Currently, OSS does not advertise write_with_content_encoding, and 
Content-Encoding is not forwarded in OSS write requests.
   
     I have a patch ready and am willing to contribute it.
   
   ### Are you willing to contribute to the development of this feature?
   
   - [x] Yes, I am willing to contribute to the development of this feature.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to