You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by cm...@apache.org on 2008/04/05 00:42:39 UTC
svn commit: r644977 -
/incubator/couchdb/branches/mochiweb/src/couchdb/couch_httpd.erl
Author: cmlenz
Date: Fri Apr 4 15:42:36 2008
New Revision: 644977
URL: http://svn.apache.org/viewvc?rev=644977&view=rev
Log:
mochiweb branch: add attachment support, fix db_info.
Modified:
incubator/couchdb/branches/mochiweb/src/couchdb/couch_httpd.erl
Modified: incubator/couchdb/branches/mochiweb/src/couchdb/couch_httpd.erl
URL: http://svn.apache.org/viewvc/incubator/couchdb/branches/mochiweb/src/couchdb/couch_httpd.erl?rev=644977&r1=644976&r2=644977&view=diff
==============================================================================
--- incubator/couchdb/branches/mochiweb/src/couchdb/couch_httpd.erl (original)
+++ incubator/couchdb/branches/mochiweb/src/couchdb/couch_httpd.erl Fri Apr 4 15:42:36 2008
@@ -156,11 +156,7 @@
handle_db_request(Req, 'GET', {DbName, Db, []}) ->
{ok, DbInfo} = couch_db:get_db_info(Db),
- send_json(Req, {obj, [
- {"db_name", DbName},
- {"doc_count", proplists:get_value(doc_count, DbInfo)},
- {"update_seq", proplists:get_value(last_update_seq, DbInfo)}
- ]});
+ send_json(Req, {obj, [{db_name, DbName} | DbInfo]});
handle_db_request(Req, 'POST', {_DbName, Db, []}) ->
% TODO: Etag handling
@@ -371,9 +367,15 @@
% Document request handlers
-handle_db_request(Req, Method, {DbName, Db, [Resource]}) ->
- DocId = mochiweb_util:unquote(Resource),
- handle_doc_request(Req, Method, DbName, Db, DocId).
+handle_db_request(Req, Method, {DbName, Db, [DocId]}) ->
+ UnquotedDocId = mochiweb_util:unquote(DocId),
+ handle_doc_request(Req, Method, DbName, Db, UnquotedDocId);
+
+handle_db_request(Req, Method, {DbName, Db, [DocId, FileName]}) ->
+ UnquotedDocId = mochiweb_util:unquote(DocId),
+ UnquotedFileName = mochiweb_util:unquote(FileName),
+ handle_attachment_request(Req, Method, DbName, Db, UnquotedDocId,
+ UnquotedFileName).
handle_doc_request(Req, 'DELETE', _DbName, Db, DocId) ->
% TODO: Etag handling
@@ -460,6 +462,34 @@
handle_doc_request(_Req, _Method, _DbName, _Db, _DocId) ->
throw({method_not_allowed, "DELETE,GET,HEAD,PUT"}).
+
+% Attachment request handlers
+
+handle_attachment_request(Req, 'GET', _DbName, Db, DocId, FileName) ->
+ case couch_db:open_doc(Db, DocId, []) of
+ {ok, #doc{attachments=Attachments}} ->
+ case proplists:get_value(FileName, Attachments) of
+ undefined ->
+ throw({not_found, missing});
+ {Type, Bin} ->
+ Resp = Req:respond({200, [
+ {"content-type", Type},
+ {"content-length", integer_to_list(couch_doc:bin_size(Bin))}
+ ], chunked}),
+ couch_doc:bin_foldl(Bin,
+ fun(BinSegment, []) ->
+ Resp:write_chunk(BinSegment)
+ end,
+ []
+ ),
+ Resp:write_chunk("")
+ end;
+ Error ->
+ throw(Error)
+ end;
+
+handle_attachment_request(_Req, _Method, _DbName, _Db, _DocId, _FileName) ->
+ throw({method_not_allowed, "GET,HEAD"}).
% View request handling internals