From f2292e7f24585b690a6712dd2474cddeb81cc8d3 Mon Sep 17 00:00:00 2001 From: John Christopher Anderson Date: Thu, 13 May 2010 01:25:51 +0000 Subject: vhost_global_handlers bypass rewrite rules and are available in all vhosts git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@943764 13f79535-47bb-0310-9956-ffa450edef68 --- src/couchdb/couch_httpd.erl | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) (limited to 'src/couchdb/couch_httpd.erl') diff --git a/src/couchdb/couch_httpd.erl b/src/couchdb/couch_httpd.erl index f0217a4e..00bfc196 100644 --- a/src/couchdb/couch_httpd.erl +++ b/src/couchdb/couch_httpd.erl @@ -13,7 +13,7 @@ -module(couch_httpd). -include("couch_db.hrl"). --export([start_link/0, stop/0, handle_request/6]). +-export([start_link/0, stop/0, handle_request/7]). -export([header_value/2,header_value/3,qs_value/2,qs_value/3,qs/1,path/1,absolute_uri/2,body_length/1]). -export([verify_is_server_admin/1,unquote/1,quote/1,recv/2,recv_chunked/4,error_info/1]). @@ -37,7 +37,11 @@ start_link() -> Port = couch_config:get("httpd", "port", "5984"), MaxConnections = couch_config:get("httpd", "max_connections", "2048"), VirtualHosts = couch_config:get("vhosts"), - + VhostGlobals = re:split( + couch_config:get("httpd", "vhost_global_handlers", ""), + "\\s+", + [{return, list}] + ), DefaultSpec = "{couch_httpd_db, handle_request}", DefaultFun = make_arity_1_fun( couch_config:get("httpd", "default_handler", DefaultSpec) @@ -64,7 +68,7 @@ start_link() -> Loop = fun(Req)-> apply(?MODULE, handle_request, [ Req, DefaultFun, UrlHandlers, DbUrlHandlers, DesignUrlHandlers, - VirtualHosts + VirtualHosts, VhostGlobals ]) end, @@ -157,19 +161,26 @@ redirect_to_vhost(MochiReq, DefaultFun, UrlHandlers, DbUrlHandlers, DesignUrlHandlers). handle_request(MochiReq, DefaultFun, - UrlHandlers, DbUrlHandlers, DesignUrlHandlers, VirtualHosts) -> + UrlHandlers, DbUrlHandlers, DesignUrlHandlers, VirtualHosts, VhostGlobals) -> % grab Host from Req Vhost = MochiReq:get_header_value("Host"), % find Vhost in config case couch_util:get_value(Vhost, VirtualHosts) of - undefined -> % business as usual + undefined -> % business as usual + handle_request_int(MochiReq, DefaultFun, + UrlHandlers, DbUrlHandlers, DesignUrlHandlers); + VhostTarget -> + case vhost_global(VhostGlobals, MochiReq) of + true ->% global handler for vhosts handle_request_int(MochiReq, DefaultFun, - UrlHandlers, DbUrlHandlers, DesignUrlHandlers); - VhostTarget -> + UrlHandlers, DbUrlHandlers, DesignUrlHandlers); + _Else -> + % do rewrite redirect_to_vhost(MochiReq, DefaultFun, UrlHandlers, DbUrlHandlers, DesignUrlHandlers, VhostTarget) + end end. @@ -297,6 +308,11 @@ authenticate_request(Response, _AuthSrcs) -> increment_method_stats(Method) -> couch_stats_collector:increment({httpd_request_methods, Method}). +% if so, then it will not be rewritten, but will run as a normal couchdb request. +% normally you'd use this for _uuids _utils and a few of the others you want to keep available on vhosts. You can also use it to make databases 'global'. +vhost_global(VhostGlobals, MochiReq) -> + "/"++Path = MochiReq:get(path), + [true] == [true||V <- VhostGlobals, V == Path]. % Utilities -- cgit v1.2.3