diff options
-rw-r--r-- | src/couchdb/couch_httpd_vhost.erl | 8 | ||||
-rwxr-xr-x | test/etap/160-vhosts.t | 14 |
2 files changed, 19 insertions, 3 deletions
diff --git a/src/couchdb/couch_httpd_vhost.erl b/src/couchdb/couch_httpd_vhost.erl index 9bfb5951..a9517600 100644 --- a/src/couchdb/couch_httpd_vhost.erl +++ b/src/couchdb/couch_httpd_vhost.erl @@ -216,15 +216,19 @@ code_change(_OldVsn, State, _Extra) -> {ok, State}. +append_path("/"=_Target, "/"=_Path) -> + "/"; +append_path(Target, Path) -> + Target ++ Path. % default redirect vhost handler redirect_to_vhost(MochiReq, VhostTarget) -> Path = MochiReq:get(raw_path), - Target = VhostTarget ++ Path, + Target = append_path(VhostTarget, Path), ?LOG_DEBUG("Vhost Target: '~p'~n", [Target]), - + Headers = mochiweb_headers:enter("x-couchdb-vhost-path", Path, MochiReq:get(headers)), diff --git a/test/etap/160-vhosts.t b/test/etap/160-vhosts.t index 8dac53e5..4bb8e926 100755 --- a/test/etap/160-vhosts.t +++ b/test/etap/160-vhosts.t @@ -52,7 +52,7 @@ admin_user_ctx() -> {user_ctx, #user_ctx{roles=[<<"_admin">>]}}. main(_) -> test_util:init_code_path(), - etap:plan(14), + etap:plan(15), case (catch test()) of ok -> etap:end_tests(); @@ -115,6 +115,7 @@ test() -> ok = couch_config:set("vhosts", "*.example2.com/test", "/*", false), ok = couch_config:set("vhosts", "*/test1", "/etap-test-db/_design/doc1/_show/test", false), + ok = couch_config:set("vhosts", "example3.com", "/", false), % let couch_httpd restart timer:sleep(100), @@ -133,6 +134,7 @@ test() -> test_vhost_request_path1(), test_vhost_request_path2(), test_vhost_request_path3(), + test_vhost_request_to_root(), %% restart boilerplate couch_db:close(Db), @@ -289,3 +291,13 @@ test_vhost_request_path3() -> end, true, <<"path in req ok">>); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. + +test_vhost_request_to_root() -> + Uri = server(), + case ibrowse:send_req(Uri, [], get, [], []) of + {ok, _, _, Body} -> + {JsonBody} = couch_util:json_decode(Body), + HasCouchDBWelcome = proplists:is_defined(<<"couchdb">>, JsonBody), + etap:is(HasCouchDBWelcome, true, "should allow redirect to /"); + _Else -> etap:is(false, true, <<"ibrowse fail">>) + end. |