From bbd217f334475cd83eaaf24cda71100d4db0efb0 Mon Sep 17 00:00:00 2001 From: John Christopher Anderson Date: Fri, 30 Jan 2009 01:40:38 +0000 Subject: POST to create docs returns a Location header. fixes COUCHDB-8 git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@739133 13f79535-47bb-0310-9956-ffa450edef68 --- share/www/script/couch_tests.js | 12 ++++++++++++ src/couchdb/couch_httpd_db.erl | 8 +++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/share/www/script/couch_tests.js b/share/www/script/couch_tests.js index a6c47a7d..89a979b4 100644 --- a/share/www/script/couch_tests.js +++ b/share/www/script/couch_tests.js @@ -140,6 +140,18 @@ var tests = { // make sure we can still open T(db.open(existingDoc._id, {rev: existingDoc._rev}) != null); + + // test that the POST response has a Location header + var xhr = CouchDB.request("POST", "/test_suite_db", { + body: JSON.stringify({"foo":"bar"}) + }); + var resp = JSON.parse(xhr.responseText); + T(resp.ok); + var loc = xhr.getResponseHeader("Location"); + T(loc, "should have a Location header"); + var locs = loc.split('/'); + T(locs[4] == resp.id); + T(locs[3] == "test_suite_db"); }, delayed_commits: function(debug) { diff --git a/src/couchdb/couch_httpd_db.erl b/src/couchdb/couch_httpd_db.erl index 2cb4c403..3a8abaf3 100644 --- a/src/couchdb/couch_httpd_db.erl +++ b/src/couchdb/couch_httpd_db.erl @@ -18,7 +18,7 @@ -import(couch_httpd, [send_json/2,send_json/3,send_json/4,send_method_not_allowed/2, start_json_response/2,send_chunk/2,end_json_response/1, - start_chunked_response/3]). + start_chunked_response/3, absolute_uri/2]). -record(doc_query_args, { options = [], @@ -76,11 +76,13 @@ db_req(#httpd{method='GET',path_parts=[_DbName]}=Req, Db) -> {ok, DbInfo} = couch_db:get_db_info(Db), send_json(Req, {DbInfo}); -db_req(#httpd{method='POST',path_parts=[_DbName]}=Req, Db) -> +db_req(#httpd{method='POST',path_parts=[DbName]}=Req, Db) -> Doc = couch_doc:from_json_obj(couch_httpd:json_body(Req)), DocId = couch_util:new_uuid(), {ok, NewRev} = couch_db:update_doc(Db, Doc#doc{id=DocId, revs=[]}, []), - send_json(Req, 201, {[ + DocUrl = absolute_uri(Req, + binary_to_list(<<"/",DbName/binary,"/",DocId/binary>>)), + send_json(Req, 201, [{"Location", DocUrl}], {[ {ok, true}, {id, DocId}, {rev, NewRev} -- cgit v1.2.3