Skip to content

Commit

Permalink
Make sure attachments get compressed when their MIME type lists param…
Browse files Browse the repository at this point in the history
…eters

Closes COUCHDB-996.


git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@1052031 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
fdmanana committed Dec 22, 2010
1 parent 41007ee commit 15941e6
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 2 deletions.
3 changes: 2 additions & 1 deletion src/couchdb/couch_util.erl
Expand Up @@ -398,7 +398,8 @@ compressible_att_type(MimeType) ->
),
lists:any(
fun(TypeExp) ->
Regexp = ["^\\s*", re:replace(TypeExp, "\\*", ".*"), "\\s*$"],
Regexp = ["^\\s*", re:replace(TypeExp, "\\*", ".*"),
"(?:\\s*;.*?)?\\s*", $$],
re:run(MimeType, Regexp, [caseless]) =/= nomatch
end,
[T || T <- TypeExpList, T /= []]
Expand Down
54 changes: 53 additions & 1 deletion test/etap/140-attachment-comp.t
Expand Up @@ -22,7 +22,7 @@ test_db_name() ->
main(_) ->
test_util:init_code_path(),

etap:plan(78),
etap:plan(86),
case (catch test()) of
ok ->
etap:end_tests();
Expand Down Expand Up @@ -75,6 +75,8 @@ test() ->
"compress"
),

test_compressible_type_with_parameters(),

timer:sleep(3000), % to avoid mochiweb socket closed exceptions
couch_server:delete(test_db_name(), []),
couch_server_sup:stop(),
Expand Down Expand Up @@ -702,6 +704,56 @@ test_create_already_compressed_att_with_invalid_content_encoding(
),
ok.

test_compressible_type_with_parameters() ->
{ok, {{_, Code, _}, _Headers, _Body}} = http:request(
put,
{db_url() ++ "/testdoc5/readme.txt", [],
"text/plain; charset=UTF-8", test_text_data()},
[],
[{sync, true}]),
etap:is(Code, 201, "Created text attachment with MIME type "
"'text/plain; charset=UTF-8' using the standalone api"),
{ok, {{_, Code2, _}, Headers2, Body}} = http:request(
get,
{db_url() ++ "/testdoc5/readme.txt", [{"Accept-Encoding", "gzip"}]},
[],
[{sync, true}]),
etap:is(Code2, 200, "HTTP response code is 200"),
Gziped = lists:member({"content-encoding", "gzip"}, Headers2),
etap:is(Gziped, true, "received body is gziped"),
Uncompressed = binary_to_list(zlib:gunzip(list_to_binary(Body))),
etap:is(Uncompressed, test_text_data(), "received data is gzipped"),
{ok, {{_, Code3, _}, _Headers3, Body3}} = http:request(
get,
{db_url() ++ "/testdoc5?att_encoding_info=true", []},
[],
[{sync, true}]),
etap:is(Code3, 200, "HTTP response code is 200"),
Json = couch_util:json_decode(Body3),
{TextAttJson} = couch_util:get_nested_json_value(
Json,
[<<"_attachments">>, <<"readme.txt">>]
),
TextAttLength = couch_util:get_value(<<"length">>, TextAttJson),
etap:is(
TextAttLength,
length(test_text_data()),
"text attachment stub length matches the uncompressed length"
),
TextAttEncoding = couch_util:get_value(<<"encoding">>, TextAttJson),
etap:is(
TextAttEncoding,
<<"gzip">>,
"text attachment stub has the encoding field set to gzip"
),
TextAttEncLength = couch_util:get_value(<<"encoded_length">>, TextAttJson),
etap:is(
TextAttEncLength,
iolist_size(zlib:gzip(test_text_data())),
"text attachment stub encoded_length matches the compressed length"
),
ok.

test_png_data() ->
{ok, Data} = file:read_file(
test_util:source_file("share/www/image/logo.png")
Expand Down

0 comments on commit 15941e6

Please sign in to comment.