You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by be...@apache.org on 2012/11/05 06:02:38 UTC

[1/3] git commit: check if "*" is accepted.

Updated Branches:
  refs/heads/431-feature_cors e70e4faa9 -> 95e5c72df


check if "*" is accepted.

Now we are checking if the node can accept all origins. This patch add a
test from @daleharvey.


Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/95e5c72d
Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/95e5c72d
Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/95e5c72d

Branch: refs/heads/431-feature_cors
Commit: 95e5c72df89bff955b2be725d9408d765a3dc0e2
Parents: 84b2d15
Author: benoitc <bc...@gmail.com>
Authored: Mon Nov 5 05:59:21 2012 +0100
Committer: benoitc <bc...@gmail.com>
Committed: Mon Nov 5 05:59:21 2012 +0100

----------------------------------------------------------------------
 src/couchdb/couch_httpd.erl      |    1 +
 src/couchdb/couch_httpd_cors.erl |   55 +++++++++++++++++---------------
 2 files changed, 30 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb/blob/95e5c72d/src/couchdb/couch_httpd.erl
----------------------------------------------------------------------
diff --git a/src/couchdb/couch_httpd.erl b/src/couchdb/couch_httpd.erl
index 0024609..54381da 100644
--- a/src/couchdb/couch_httpd.erl
+++ b/src/couchdb/couch_httpd.erl
@@ -30,6 +30,7 @@
 -export([send_response/4,send_method_not_allowed/2,send_error/4, send_redirect/2,send_chunked_error/2]).
 -export([send_json/2,send_json/3,send_json/4,last_chunk/1,parse_multipart_request/3]).
 -export([accepted_encodings/1,handle_request_int/5,validate_referer/1,validate_ctype/2]).
+-export([http_1_0_keep_alive/2]).
 
 start_link() ->
     start_link(http).

http://git-wip-us.apache.org/repos/asf/couchdb/blob/95e5c72d/src/couchdb/couch_httpd_cors.erl
----------------------------------------------------------------------
diff --git a/src/couchdb/couch_httpd_cors.erl b/src/couchdb/couch_httpd_cors.erl
index 4f8bf48..879fee0 100644
--- a/src/couchdb/couch_httpd_cors.erl
+++ b/src/couchdb/couch_httpd_cors.erl
@@ -37,7 +37,7 @@ is_preflight_request(#httpd{mochi_req=MochiReq}=Req) ->
         true ->
             case preflight_request(MochiReq) of
                 {ok, PreflightHeaders} ->
-                    couch_httpd:send_response(Req, 204, PreflightHeaders, <<>>);
+                    send_preflight_response(Req, PreflightHeaders);
                 _ ->
                     Req
             end;
@@ -56,10 +56,6 @@ cors_headers(#httpd{mochi_req=MochiReq}) ->
             case MochiReq:get_header_value("Origin") of
                 undefined ->
                     [];
-                <<"*">> ->
-                    handle_cors_headers("*", Host, AcceptedOrigins);
-                <<"null">> ->
-                    handle_cors_headers("*", Host, AcceptedOrigins);
                 Origin ->
                     handle_cors_headers(couch_util:to_list(Origin),
                                         Host, AcceptedOrigins)
@@ -68,47 +64,45 @@ cors_headers(#httpd{mochi_req=MochiReq}) ->
             []
     end.
 
-handle_cors_headers("*", _Host, _AcceptedOrigins) ->
-    [{"Access-Control-Allow-Origin", "*"}];
 handle_cors_headers(Origin, Host, []) ->
+    make_cors_header(Origin, Host);
+handle_cors_headers(Origin, Host, AcceptedOrigins) ->
+    AcceptAll = lists:member("*", AcceptedOrigins),
+    case {AcceptAll, lists:member(Origin, AcceptedOrigins)} of
+        {true, _} ->
+            make_cors_header(Origin, Host);
+        {false, true}  ->
+            make_cors_header(Origin, Host);
+        _ ->
+            []
+    end.
+
+make_cors_header(Origin, Host) ->
     case credentials(Origin, Host) of
         true ->
             [{"Access-Control-Allow-Origin", Origin},
              {"Access-Control-Allow-Credentials", "true"}];
         false ->
             [{"Access-Control-Allow-Origin", Origin}]
-    end;
-handle_cors_headers(Origin, Host, AcceptedOrigins) ->
-    AllowCredentials = credentials(Origin, Host),
-    case lists:member(Origin, AcceptedOrigins) of
-        true when AllowCredentials =:= true ->
-            [{"Access-Control-Allow-Origin", Origin},
-             {"Access-Control-Allow-Credentials", "true"}];
-        true ->
-            [{"Access-Control-Allow-Origin", Origin}];
-        _ ->
-            []
     end.
 
-
 preflight_request(MochiReq) ->
     Host = couch_httpd_vhost:host(MochiReq),
     case MochiReq:get_header_value("Origin") of
         undefined ->
             MochiReq;
-        <<"*">>  ->
-            handle_preflight_request("*", Host, MochiReq);
-        <<"null">> ->
-            handle_preflight_request("*", Host, MochiReq);
+
         Origin ->
             AcceptedOrigins = re:split(cors_config(Host, "origins", []),
                                        "\\s*,\\s*",
                                        [trim, {return, list}]),
-            case AcceptedOrigins of
-                [] ->
+            AcceptAll = lists:member("*", AcceptedOrigins),
+
+            case {AcceptAll, AcceptedOrigins} of
+                {true, _} ->
                     handle_preflight_request(couch_util:to_list(Origin),
                                              Host, MochiReq);
-                _ ->
+                {false, _} ->
                     case lists:member(Origin, AcceptedOrigins) of
                         true ->
                             handle_preflight_request(couch_util:to_list(Origin),
@@ -183,6 +177,15 @@ handle_preflight_request(Origin, Host, MochiReq) ->
     end.
 
 
+send_preflight_response(#httpd{mochi_req=MochiReq}=Req, Headers) ->
+    couch_httpd:log_request(Req, 204),
+    couch_stats_collector:increment({httpd_status_codes, 204}),
+    Headers1 = couch_httpd:http_1_0_keep_alive(MochiReq, Headers),
+    Headers2 = Headers1 ++ couch_httpd:server_header() ++
+               couch_httpd_auth:cookie_auth_header(Req, Headers1),
+    {ok, MochiReq:respond({204, Headers2, <<>>})}.
+
+
 credentials("*", _Host) ->
     false;
 credentials(_Origin, Host) ->