From 678cd66689ad9ea2f5c47f41af6bf3b9ae0a3c59 Mon Sep 17 00:00:00 2001 From: Robert Newson Date: Thu, 19 Aug 2010 08:55:10 +0000 Subject: Support Range header for all attachments, even without compaction upgrade. It's just less efficient. git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@987084 13f79535-47bb-0310-9956-ffa450edef68 --- src/couchdb/couch_httpd_db.erl | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) (limited to 'src/couchdb/couch_httpd_db.erl') diff --git a/src/couchdb/couch_httpd_db.erl b/src/couchdb/couch_httpd_db.erl index ab14a7d1..b0fbe8de 100644 --- a/src/couchdb/couch_httpd_db.erl +++ b/src/couchdb/couch_httpd_db.erl @@ -883,7 +883,8 @@ db_attachment_req(#httpd{method='GET',mochi_req=MochiReq}=Req, Db, DocId, FileNa Headers = [ {"ETag", Etag}, {"Cache-Control", "must-revalidate"}, - {"Content-Type", binary_to_list(Type)} + {"Content-Type", binary_to_list(Type)}, + {"Accept-Ranges", "bytes"} ] ++ case ReqAcceptsAttEnc of true -> [{"Content-Encoding", atom_to_list(Enc)}]; @@ -925,22 +926,13 @@ db_attachment_req(#httpd{method='GET',mochi_req=MochiReq}=Req, Db, DocId, FileNa AttFun(Att, fun(Seg, _) -> send_chunk(Resp, Seg) end, {ok, Resp}), last_chunk(Resp); _ -> - #att{data={_,StreamInfo}} = Att, %% layering violation - SupportsRange = case StreamInfo of - [{_,_}|_] -> true; - _ -> false - end, Ranges = MochiReq:get(range), HasSingleRange = case Ranges of [_] -> true; _ -> false end, - Headers1 = case SupportsRange of - false ->[{<<"Accept-Ranges">>, <<"none">>}] ++ Headers; - true -> [{<<"Accept-Ranges">>, <<"bytes">>}] ++ Headers - end, if - Enc == identity andalso SupportsRange == true andalso HasSingleRange == true -> + Enc == identity andalso HasSingleRange == true -> [{From, To}] = Ranges, {From1, To1} = case {From, To} of {none, To} -> @@ -956,13 +948,13 @@ db_attachment_req(#httpd{method='GET',mochi_req=MochiReq}=Req, Db, DocId, FileNa true -> ok end, - Headers2 = [{<<"Content-Range">>, + Headers1 = [{<<"Content-Range">>, ?l2b(io_lib:format("bytes ~B-~B/~B", [From1, To1, Len]))}] - ++ Headers1, - {ok, Resp} = start_response_length(Req, 206, Headers2, To1 - From1 + 1), + ++ Headers, + {ok, Resp} = start_response_length(Req, 206, Headers1, To1 - From1 + 1), couch_doc:range_att_foldl(Att, From1, To1 + 1, fun(Seg, _) -> send(Resp, Seg) end, {ok, Resp}); true -> - {ok, Resp} = start_response_length(Req, 200, Headers1, Len), + {ok, Resp} = start_response_length(Req, 200, Headers, Len), AttFun(Att, fun(Seg, _) -> send(Resp, Seg) end, {ok, Resp}) end end -- cgit v1.2.3