summaryrefslogtreecommitdiff
path: root/src/couchdb/couch_doc.erl
diff options
context:
space:
mode:
authorPaul Joseph Davis <davisp@apache.org>2009-04-27 19:41:23 +0000
committerPaul Joseph Davis <davisp@apache.org>2009-04-27 19:41:23 +0000
commitb97ea7c6b7c52430393ec7107674ba23ff57b9d5 (patch)
tree41591439b98ef9c2a91a8a4ef5e4c065b5001287 /src/couchdb/couch_doc.erl
parentf5d752a3c5f1c05962a7b693b54636967bfa7a5d (diff)
Resolves COUCHDB-332 Proper errors for invalid docids.
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@769127 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/couchdb/couch_doc.erl')
-rw-r--r--src/couchdb/couch_doc.erl24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/couchdb/couch_doc.erl b/src/couchdb/couch_doc.erl
index 03cc8906..132c86d0 100644
--- a/src/couchdb/couch_doc.erl
+++ b/src/couchdb/couch_doc.erl
@@ -15,6 +15,7 @@
-export([to_doc_info/1,to_doc_info_path/1,parse_rev/1,parse_revs/1,rev_to_str/1,rev_to_strs/1]).
-export([bin_foldl/3,bin_size/1,bin_to_binary/1,get_validate_doc_fun/1]).
-export([from_json_obj/1,to_json_obj/2,has_stubs/1, merge_stubs/2]).
+-export([validate_docid/1]).
-include("couch_db.hrl").
@@ -143,23 +144,26 @@ parse_revs([Rev | Rest]) ->
[parse_rev(Rev) | parse_revs(Rest)].
-transfer_fields([], #doc{body=Fields}=Doc) ->
- % convert fields back to json object
- Doc#doc{body={lists:reverse(Fields)}};
-
-transfer_fields([{<<"_id">>, Id} | Rest], Doc) when is_binary(Id) ->
+validate_docid(Id) when is_binary(Id) ->
case Id of
<<"_design/", _/binary>> -> ok;
<<"_local/", _/binary>> -> ok;
<<"_", _/binary>> ->
throw({bad_request, <<"Only reserved document ids may start with underscore.">>});
_Else -> ok
- end,
- transfer_fields(Rest, Doc#doc{id=Id});
-
-transfer_fields([{<<"_id">>, Id} | _Rest], _Doc) ->
+ end;
+validate_docid(Id) ->
?LOG_DEBUG("Document id is not a string: ~p", [Id]),
- throw({bad_request, <<"Document id must be a string">>});
+ throw({bad_request, <<"Document id must be a string">>}).
+
+transfer_fields([], #doc{body=Fields}=Doc) ->
+ % convert fields back to json object
+ Doc#doc{body={lists:reverse(Fields)}};
+
+transfer_fields([{<<"_id">>, Id} | Rest], Doc) ->
+ io:format("Transfering docid! ~p~n", [Id]),
+ validate_docid(Id),
+ transfer_fields(Rest, Doc#doc{id=Id});
transfer_fields([{<<"_rev">>, Rev} | Rest], #doc{revs={0, []}}=Doc) ->
{Pos, RevId} = parse_rev(Rev),