[
https://issues.apache.org/jira/browse/COUCHDB-583?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12783744#action_12783744
]
Filipe Manana commented on COUCHDB-583:
---------------------------------------
Using a filter like mime type for deciding whether or not to store the
attachments in the "gziped" form seems a good idea to me. mod_gzip has that
kind of filter for deciding whether a response is gziped or not. An example of
mod_gzip config:
mod_gzip_item_include mime ^text/html$
mod_gzip_item_include mime ^text/plain$
mod_gzip_item_include mime ^httpd/unix-directory$
I do like that approach, but since I am a newbie with Couch's
code/implementation, I don't know if storing the attachments directly in gziped
form will break anything else. couch_stream could compress attachment data when
receiving it and write each compressed block to disk.
Then, when requesting an attachment download, the client would have to send the
header "Accept-Encoding: gzip" in order to get the compressed data. If it
doesn't send that header, we would send him the attachment in the uncompressed
form.
I volunteer for implementing it if you agree.
cheers
> adding ?compression=(gzip|deflate) optional parameter to the attachment
> download API
> ------------------------------------------------------------------------------------
>
> Key: COUCHDB-583
> URL: https://issues.apache.org/jira/browse/COUCHDB-583
> Project: CouchDB
> Issue Type: New Feature
> Components: HTTP Interface
> Environment: CouchDB trunk revision 885240
> Reporter: Filipe Manana
> Attachments: jira-couchdb-583-1st-try-trunk.patch,
> jira-couchdb-583-2nd-try-trunk.patch
>
> Original Estimate: 24h
> Remaining Estimate: 24h
>
> The following new feature is added in the patch following this ticket
> creation.
> A new optional http query parameter "compression" is added to the attachments
> API.
> This parameter can have one of the values: "gzip" or "deflate".
> When asking for an attachment (GET http request), if the query parameter
> "compression" is found, CouchDB will send the attachment compressed to the
> client (and sets the header Content-Encoding with gzip or deflate).
> Further, it adds a new config option "treshold_for_chunking_comp_responses"
> (httpd section) that specifies an attachment length threshold. If an
> attachment has a length >= than this threshold, the http response will be
> chunked (besides compressed).
> Note that using non chunked compressed body responses requires storing all
> the compressed blocks in memory and then sending each one to the client. This
> is a necessary "evil", as we only know the length of the compressed body
> after compressing all the body, and we need to set the "Content-Length"
> header for non chunked responses. By sending chunked responses, we can send
> each compressed block immediately, without accumulating all of them in memory.
> Examples:
> $ curl http://localhost:5984/testdb/testdoc1/readme.txt?compression=gzip
> $ curl http://localhost:5984/testdb/testdoc1/readme.txt?compression=deflate
> $ curl http://localhost:5984/testdb/testdoc1/readme.txt # attachment will
> not be compressed
> $ curl http://localhost:5984/testdb/testdoc1/readme.txt?compression=rar #
> will give a 500 error code
> Etap test case included.
> Feedback would be very welcome.
> cheers
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.