summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2011-10-20 16:17:22 +0100
committerRobert Newson <rnewson@apache.org>2013-02-07 22:44:44 +0000
commit3b103eb10b115b4b6a8f0c6e31dc92292c0aeb71 (patch)
tree5a583b02287c6b5278e9b9e4f18a01263a34237c
parent9116560e475861f8b8ec671ab91ca6c6b4d132db (diff)
downloadcouchdb-3b103eb10b115b4b6a8f0c6e31dc92292c0aeb71.tar.gz
support JSONP in externals
COUCHDB-1313
-rw-r--r--src/couchdb/couch_db.hrl3
-rw-r--r--src/couchdb/couch_httpd_external.erl18
2 files changed, 13 insertions, 8 deletions
diff --git a/src/couchdb/couch_db.hrl b/src/couchdb/couch_db.hrl
index 42f10ac77..8d7d02095 100644
--- a/src/couchdb/couch_db.hrl
+++ b/src/couchdb/couch_db.hrl
@@ -241,7 +241,8 @@
stop = false,
data = <<>>,
ctype = "application/json",
- headers = []
+ headers = [],
+ json = nil
}).
-record(index_header,
diff --git a/src/couchdb/couch_httpd_external.erl b/src/couchdb/couch_httpd_external.erl
index bfe77a329..2036d252e 100644
--- a/src/couchdb/couch_httpd_external.erl
+++ b/src/couchdb/couch_httpd_external.erl
@@ -120,17 +120,21 @@ json_query_keys([{<<"key">>, Value} | Rest], Acc) ->
json_query_keys([Term | Rest], Acc) ->
json_query_keys(Rest, [Term|Acc]).
-send_external_response(#httpd{mochi_req=MochiReq}=Req, Response) ->
+send_external_response(Req, Response) ->
#extern_resp_args{
code = Code,
data = Data,
ctype = CType,
- headers = Headers
+ headers = Headers,
+ json = Json
} = parse_external_response(Response),
- couch_httpd:log_request(Req, Code),
- Resp = MochiReq:respond({Code,
- default_or_content_type(CType, Headers ++ couch_httpd:server_header()), Data}),
- {ok, Resp}.
+ Headers1 = default_or_content_type(CType, Headers),
+ case Json of
+ nil ->
+ couch_httpd:send_response(Req, Code, Headers1, Data);
+ Json ->
+ couch_httpd:send_json(Req, Code, Headers1, Json)
+ end.
parse_external_response({Response}) ->
lists:foldl(fun({Key,Value}, Args) ->
@@ -143,7 +147,7 @@ parse_external_response({Response}) ->
Args#extern_resp_args{stop=true};
{<<"json">>, Value} ->
Args#extern_resp_args{
- data=?JSON_ENCODE(Value),
+ json=Value,
ctype="application/json"};
{<<"body">>, Value} ->
Args#extern_resp_args{data=Value, ctype="text/html; charset=utf-8"};