diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/couchdb/Makefile.am | 4 | ||||
-rw-r--r-- | src/couchdb/couch_httpd_show.erl (renamed from src/couchdb/couch_httpd_form.erl) | 50 | ||||
-rw-r--r-- | src/couchdb/couch_query_servers.erl | 7 |
3 files changed, 34 insertions, 27 deletions
diff --git a/src/couchdb/Makefile.am b/src/couchdb/Makefile.am index 7fb2ec68..8e280c70 100644 --- a/src/couchdb/Makefile.am +++ b/src/couchdb/Makefile.am @@ -55,7 +55,7 @@ source_files = \ couch_httpd.erl \ couch_httpd_db.erl \ couch_httpd_external.erl \ - couch_httpd_form.erl \ + couch_httpd_show.erl \ couch_httpd_view.erl \ couch_httpd_misc_handlers.erl \ couch_key_tree.erl \ @@ -91,7 +91,7 @@ compiled_files = \ couch_httpd.beam \ couch_httpd_db.beam \ couch_httpd_external.beam \ - couch_httpd_form.beam \ + couch_httpd_show.beam \ couch_httpd_view.beam \ couch_httpd_misc_handlers.beam \ couch_key_tree.beam \ diff --git a/src/couchdb/couch_httpd_form.erl b/src/couchdb/couch_httpd_show.erl index f4fa2c18..d4b4997b 100644 --- a/src/couchdb/couch_httpd_form.erl +++ b/src/couchdb/couch_httpd_show.erl @@ -10,9 +10,9 @@ % License for the specific language governing permissions and limitations under % the License. --module(couch_httpd_form). +-module(couch_httpd_show). --export([handle_form_req/2]). +-export([handle_doc_show_req/2]). -include("couch_db.hrl"). @@ -22,7 +22,7 @@ start_json_response/2,send_chunk/2,end_json_response/1, start_chunked_response/3, send_error/4]). -handle_form_req(#httpd{method='GET',path_parts=[_, _, DesignName, FormName, Docid]}=Req, Db) -> +handle_doc_show_req(#httpd{method='GET',path_parts=[_, _, DesignName, ShowName, Docid]}=Req, Db) -> DesignId = <<"_design/", DesignName/binary>>, % Anyway we can dry up this error handling? case (catch couch_httpd_db:couch_doc_open(Db, DesignId, [], [])) of @@ -33,40 +33,46 @@ handle_form_req(#httpd{method='GET',path_parts=[_, _, DesignName, FormName, Doci DesignDoc -> #doc{body={Props}} = DesignDoc, Lang = proplists:get_value(<<"language">>, Props, <<"javascript">>), - case proplists:get_value(<<"forms">>, Props, nil) of - {Forms} -> - case proplists:get_value(FormName, Forms, nil) of + case proplists:get_value(<<"show">>, Props, nil) of + {DocAndViews} -> + case proplists:get_value(<<"docs">>, DocAndViews, nil) of nil -> - throw({not_found, missing_form}); - FormSrc -> - case (catch couch_httpd_db:couch_doc_open(Db, Docid, [], [])) of - {not_found, missing} -> - throw({not_found, missing}); - {not_found, deleted} -> - throw({not_found, deleted}); - Doc -> - % ok we have everythign we need. let's make it happen. - send_form_response(Lang, FormSrc, Doc, Req, Db) + throw({not_found, missing_show_docs}); + {DocShows} -> + case proplists:get_value(ShowName, DocShows, nil) of + nil -> + throw({not_found, missing_show_doc_function}); + ShowSrc -> + case (catch couch_httpd_db:couch_doc_open( + Db, Docid, [], [])) of + {not_found, missing} -> + throw({not_found, missing}); + {not_found, deleted} -> + throw({not_found, deleted}); + Doc -> + % ok we have everythign we need. let's make it happen. + send_doc_show_response(Lang, ShowSrc, Doc, Req, Db) + end end end; nil -> - throw({not_found, missing_form}) + throw({not_found, missing_show}) end end; -handle_form_req(#httpd{method='GET'}=Req, _Db) -> +handle_doc_show_req(#httpd{method='GET'}=Req, _Db) -> send_error(Req, 404, <<"form_error">>, <<"Invalid path.">>); -handle_form_req(Req, _Db) -> +handle_doc_show_req(Req, _Db) -> send_method_not_allowed(Req, "GET,HEAD"). -send_form_response(Lang, FormSrc, #doc{revs=[DocRev|_]}=Doc, #httpd{mochi_req=MReq}=Req, Db) -> +send_doc_show_response(Lang, ShowSrc, #doc{revs=[DocRev|_]}=Doc, #httpd{mochi_req=MReq}=Req, Db) -> % make a term with etag-effecting Req components, but not always changing ones. Headers = MReq:get(headers), Hlist = mochiweb_headers:to_list(Headers), Accept = proplists:get_value('Accept', Hlist), - <<SigInt:128/integer>> = erlang:md5(term_to_binary({Lang, FormSrc, DocRev, Accept})), + <<SigInt:128/integer>> = erlang:md5(term_to_binary({Lang, ShowSrc, DocRev, Accept})), CurrentEtag = list_to_binary("\"" ++ lists:flatten(io_lib:format("form_~.36B",[SigInt])) ++ "\""), EtagsToMatch = string:tokens( couch_httpd:header_value(Req, "If-None-Match", ""), ", "), @@ -77,7 +83,7 @@ send_form_response(Lang, FormSrc, #doc{revs=[DocRev|_]}=Doc, #httpd{mochi_req=MR couch_httpd:send_response(Req, 304, [{"Etag", CurrentEtag}], <<>>); false -> % Run the external form renderer. - {JsonResponse} = couch_query_servers:render_doc_form(Lang, FormSrc, Doc, Req, Db), + {JsonResponse} = couch_query_servers:render_doc_show(Lang, ShowSrc, Doc, Req, Db), % Here we embark on the delicate task of replacing or creating the % headers on the JsonResponse object. We need to control the Etag and % Vary headers. If the external function controls the Etag, we'd have to diff --git a/src/couchdb/couch_query_servers.erl b/src/couchdb/couch_query_servers.erl index c4ed5c8b..8d473381 100644 --- a/src/couchdb/couch_query_servers.erl +++ b/src/couchdb/couch_query_servers.erl @@ -17,7 +17,7 @@ -export([init/1, terminate/2, handle_call/3, handle_cast/2, handle_info/2,code_change/3,stop/0]). -export([start_doc_map/2, map_docs/2, stop_doc_map/1]). --export([reduce/3, rereduce/3,validate_doc_update/5,render_doc_form/5]). +-export([reduce/3, rereduce/3,validate_doc_update/5,render_doc_show/5]). % -export([test/0]). -include("couch_db.hrl"). @@ -122,11 +122,12 @@ validate_doc_update(Lang, FunSrc, EditDoc, DiskDoc, Ctx) -> ok = ret_os_process(Lang, Pid) end. -render_doc_form(Lang, FormSrc, Doc, Req, Db) -> +render_doc_show(Lang, ShowSrc, Doc, Req, Db) -> Pid = get_os_process(Lang), JsonDoc = couch_doc:to_json_obj(Doc, [revs]), JsonReq = couch_httpd_external:json_req_obj(Req, Db), - try couch_os_process:prompt(Pid, [<<"form">>, FormSrc, JsonDoc, JsonReq]) of + try couch_os_process:prompt(Pid, + [<<"show_doc">>, ShowSrc, JsonDoc, JsonReq]) of FormResp -> FormResp after |