On 2011-07-19 08.29, David Gwynne wrote: > noone has an opinion? I like it. I was about to run into exactly the same problem on a similar setup in a few days myself, so it couldn't have come in more handy. :-)
> would anyone get upset if i committed this? I've tried the patch briefly, and it seems to work. I'll run it for a while on a production system (who dares wins :-) ) and see if I find any regressions, but so far it looks good. Regards, /Benny > On 14/07/2011, at 1:40 PM, David Gwynne wrote: > >> in my environment i have nginx in front of apache to offload ssl >> and to let me easily point different parts of the uri namespace at >> all crazy backends we have. this works fine except if the apache >> wants to canonicalise something on the "ssl" backends. because the >> ssl is done in nginx, apache doesnt know that it should use https >> as the scheme rather than just http and redirects the user to the >> wrong port. >> >> this diff models the newer apache behaviour of letting you specify >> the scheme/method as part of the ServerName directive. >> >> i can set virtualhosts up like this now: >> >> # nginx has an ssl listener on 443 that proxies to this backend >> # using plain http. >> <VirtualHost _default_:280> >> ServerName https://internal.eait.uq.edu.au >> >> # other shizz >> >> </VirtualHost> >> >> with this diff apache canonicalises with https at the start of the >> url instead of the default of http. >> >> please note i dont like userland (too many strings), and im generally >> unfamiliar with apache internals, so i would appreciate both eyes >> and tests. >> >> ok? >> >> Index: src/include/http_core.h >> =================================================================== >> RCS file: /cvs/src/usr.sbin/httpd/src/include/http_core.h,v >> retrieving revision 1.12 >> diff -u -p -r1.12 http_core.h >> --- src/include/http_core.h 24 Aug 2007 11:31:29 -0000 1.12 >> +++ src/include/http_core.h 14 Jul 2011 03:33:02 -0000 >> @@ -138,6 +138,8 @@ API_EXPORT(const char *) ap_get_remote_l >> API_EXPORT(char *) ap_construct_url(pool *p, const char *uri, request_rec > *r); >> API_EXPORT(const char *) ap_get_server_name(request_rec *r); >> API_EXPORT(unsigned) ap_get_server_port(const request_rec *r); >> +API_EXPORT(const char *) ap_get_server_method(const request_rec *r); >> +API_EXPORT(unsigned) ap_get_default_port(const request_rec *r); >> API_EXPORT(unsigned long) ap_get_limit_req_body(const request_rec *r); >> API_EXPORT(void) ap_custom_response(request_rec *r, int status, char > *string); >> API_EXPORT(int) ap_exists_config_define(char *name); >> Index: src/include/httpd.h >> =================================================================== >> RCS file: /cvs/src/usr.sbin/httpd/src/include/httpd.h,v >> retrieving revision 1.30 >> diff -u -p -r1.30 httpd.h >> --- src/include/httpd.h 25 Feb 2010 07:49:53 -0000 1.30 >> +++ src/include/httpd.h 14 Jul 2011 03:33:02 -0000 >> @@ -141,12 +141,8 @@ extern "C" { >> #define DEFAULT_HTTP_PORT 80 >> #define DEFAULT_HTTPS_PORT 443 >> #define ap_is_default_port(port,r) ((port) == ap_default_port(r)) >> -#define ap_http_method(r) (((r)->ctx != NULL && ap_ctx_get((r)->ctx, \ >> - "ap::http::method") != NULL) ? ((char *)ap_ctx_get((r)->ctx, \ >> - "ap::http::method")) : "http") >> -#define ap_default_port(r) (((r)->ctx != NULL && ap_ctx_get((r)->ctx, \ >> - "ap::default::port") != NULL) ? atoi((char *)ap_ctx_get((r)->ctx, \ >> - "ap::default::port")) : DEFAULT_HTTP_PORT) >> +#define ap_http_method(r) ap_get_server_method(r) >> +#define ap_default_port(r) ap_get_default_port(r) >> >> /* --------- Default user name and group name running standalone ---------- > */ >> /* --- These may be specified as numbers by placing a # before a number --- > */ >> Index: src/main/http_core.c >> =================================================================== >> RCS file: /cvs/src/usr.sbin/httpd/src/main/http_core.c,v >> retrieving revision 1.27 >> diff -u -p -r1.27 http_core.c >> --- src/main/http_core.c 10 May 2010 02:00:50 -0000 1.27 >> +++ src/main/http_core.c 14 Jul 2011 03:33:02 -0000 >> @@ -804,6 +804,42 @@ ap_get_server_port(const request_rec *r) >> : port; >> } >> >> +API_EXPORT(const char *) >> +ap_get_server_method(const request_rec *r) >> +{ >> + const char *method; >> + >> + if (r->ctx != NULL) { >> + method = ap_ctx_get(r->ctx, "ap::http::method"); >> + if (method != NULL) >> + return (method); >> + } >> + >> + if (r->server->ctx != NULL) { >> + method = ap_ctx_get(r->server->ctx, "ap::http::method"); >> + if (method != NULL) >> + return (method); >> + } >> + >> + return ("http"); >> +} >> + >> +API_EXPORT(unsigned) >> +ap_get_default_port(const request_rec *r) >> +{ >> + const char *v = NULL; >> + >> + if (r->ctx != NULL) >> + v = ap_ctx_get(r->ctx, "ap::default::port"); >> + if (v == NULL && r->server->ctx != NULL) >> + v = ap_ctx_get(r->server->ctx, "ap::default::port"); >> + >> + if (v == NULL) >> + return (DEFAULT_HTTP_PORT); >> + >> + return (atoi(v)); >> +} >> + >> API_EXPORT(char *) >> ap_construct_url(pool *p, const char *uri, request_rec *r) >> { >> @@ -1751,6 +1787,43 @@ static const char *set_server_string_slo >> return NULL; >> } >> >> +static const char * >> +set_server_name(cmd_parms *cmd, void *dummy, char *arg) >> +{ >> + const char *err = ap_check_cmd_context(cmd, >> + NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); >> + const char *part; >> + int port; >> + >> + if (err != NULL) >> + return (err); >> + >> + if (strncmp("https://", arg, 8) == 0) { >> + ap_ctx_set(cmd->server->ctx, "ap::http::method", "https"); >> + ap_ctx_set(cmd->server->ctx, "ap::default::port", "443"); >> + arg += 8; >> + } else if (strncmp("http://", arg, 7) == 0) { >> + /* defaults are fine */ >> + arg += 7; >> + } else if (strstr(arg, "://") != NULL) >> + return ("unsupported scheme"); >> + >> + part = strstr(arg, ":"); >> + if (part != NULL) { >> + port = (int)strtonum(part + 1, 1, 65536, &err); >> + if (err != NULL) { >> + return ap_pstrcat(cmd->temp_pool, >> + "The port number \"", part + 1, "\" is ", err, >> NULL); >> + } >> + cmd->server->port = port; >> + cmd->server->server_hostname = ap_pstrndup(cmd->pool, arg, >> + part - arg); >> + } else >> + cmd->server->server_hostname = arg; >> + >> + return (NULL); >> +} >> + >> static const char *server_type(cmd_parms *cmd, void *dummy, char *arg) >> { >> const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); >> @@ -3152,8 +3225,7 @@ static const command_rec core_cmds[] = { >> { "ServerAdmin", set_server_string_slot, >> (void *)XtOffsetOf (server_rec, server_admin), RSRC_CONF, TAKE1, >> "The email address of the server administrator" }, >> -{ "ServerName", set_server_string_slot, >> - (void *)XtOffsetOf (server_rec, server_hostname), RSRC_CONF, TAKE1, >> +{ "ServerName", set_server_name, NULL, RSRC_CONF, TAKE1, >> "The hostname of the server" }, >> { "ServerSignature", set_signature_flag, NULL, OR_ALL, TAKE1, >> "En-/disable server signature (on|off|email)" }, > -- internetlabbet.se / work: +46 8 551 124 80 / "Words must Benny Lofgren / mobile: +46 70 718 11 90 / be weighed, / fax: +46 8 551 124 89 / not counted." / email: benny -at- internetlabbet.se