diff --git a/mod_wsgi.c b/mod_wsgi.c index c65344e..b32fc5c 100644 --- a/mod_wsgi.c +++ b/mod_wsgi.c @@ -500,6 +500,7 @@ typedef struct { int script_reloading; int error_override; int chunked_request; + int map_head_to_get; int enable_sendfile; @@ -669,6 +670,11 @@ static void *wsgi_merge_server_config(apr_pool_t *p, void *base_conf, else config->chunked_request = parent->chunked_request; + if (child->map_head_to_get != -1) + config->map_head_to_get = child->map_head_to_get; + else + config->map_head_to_get = parent->map_head_to_get; + if (child->enable_sendfile != -1) config->enable_sendfile = child->enable_sendfile; else @@ -704,6 +710,7 @@ typedef struct { int script_reloading; int error_override; int chunked_request; + int map_head_to_get; int enable_sendfile; @@ -737,6 +744,7 @@ static WSGIDirectoryConfig *newWSGIDirectoryConfig(apr_pool_t *p) object->script_reloading = -1; object->error_override = -1; object->chunked_request = -1; + object->map_head_to_get = -1; object->enable_sendfile = -1; @@ -820,6 +828,11 @@ static void *wsgi_merge_dir_config(apr_pool_t *p, void *base_conf, else config->chunked_request = parent->chunked_request; + if (child->map_head_to_get != -1) + config->map_head_to_get = child->map_head_to_get; + else + config->map_head_to_get = parent->map_head_to_get; + if (child->enable_sendfile != -1) config->enable_sendfile = child->enable_sendfile; else @@ -880,6 +893,7 @@ typedef struct { int script_reloading; int error_override; int chunked_request; + int map_head_to_get; int enable_sendfile; @@ -1229,6 +1243,14 @@ static WSGIRequestConfig *wsgi_create_req_config(apr_pool_t *p, request_rec *r) config->chunked_request = 0; } + config->map_head_to_get = dconfig->map_head_to_get; + + if (config->map_head_to_get < 0) { + config->map_head_to_get = sconfig->map_head_to_get; + if (config->map_head_to_get < 0) + config->map_head_to_get = 2; + } + config->enable_sendfile = dconfig->enable_sendfile; if (config->enable_sendfile < 0) { @@ -7993,6 +8015,40 @@ static const char *wsgi_set_chunked_request(cmd_parms *cmd, void *mconfig, return NULL; } +static const char *wsgi_set_map_head_to_get(cmd_parms *cmd, void *mconfig, + const char *f) +{ + if (cmd->path) { + WSGIDirectoryConfig *dconfig = NULL; + dconfig = (WSGIDirectoryConfig *)mconfig; + + if (strcasecmp(f, "Off") == 0) + dconfig->map_head_to_get = 0; + else if (strcasecmp(f, "On") == 0) + dconfig->map_head_to_get = 1; + else if (strcasecmp(f, "Auto") == 0) + dconfig->map_head_to_get = 2; + else + return "WSGIMapHEADToGET must be one of: Off | On | Auto"; + } + else { + WSGIServerConfig *sconfig = NULL; + sconfig = ap_get_module_config(cmd->server->module_config, + &wsgi_module); + + if (strcasecmp(f, "Off") == 0) + sconfig->map_head_to_get = 0; + else if (strcasecmp(f, "On") == 0) + sconfig->map_head_to_get = 1; + else if (strcasecmp(f, "Auto") == 0) + sconfig->map_head_to_get = 2; + else + return "WSGIMapHEADToGET must be one of: Off | On | Auto"; + } + + return NULL; +} + static const char *wsgi_set_enable_sendfile(cmd_parms *cmd, void *mconfig, const char *f) { @@ -8463,14 +8519,15 @@ static void wsgi_build_environment(request_rec *r) * might change the content and/or headers. */ -#if AP_SERVER_MAJORVERSION_NUMBER >= 2 - if (r->method_number == M_GET && r->header_only && - r->output_filters->frec->ftype < AP_FTYPE_PROTOCOL) - apr_table_setn(r->subprocess_env, "REQUEST_METHOD", "GET"); -#else - if (r->method_number == M_GET && r->header_only) - apr_table_setn(r->subprocess_env, "REQUEST_METHOD", "GET"); -#endif + if (config->map_head_to_get == 2) { + if (r->method_number == M_GET && r->header_only && + r->output_filters->frec->ftype < AP_FTYPE_PROTOCOL) + apr_table_setn(r->subprocess_env, "REQUEST_METHOD", "GET"); + } + else if (config->map_head_to_get == 1) { + if (r->method_number == M_GET) + apr_table_setn(r->subprocess_env, "REQUEST_METHOD", "GET"); + } /* Determine whether connection uses HTTPS protocol. */ @@ -15856,6 +15913,8 @@ static const command_rec wsgi_commands[] = NULL, OR_FILEINFO, "Enable/Disable overriding of error pages."), AP_INIT_TAKE1("WSGIChunkedRequest", wsgi_set_chunked_request, NULL, OR_FILEINFO, "Enable/Disable support for chunked requests."), + AP_INIT_TAKE1("WSGIMapHEADToGET", wsgi_set_map_head_to_get, + NULL, OR_FILEINFO, "Enable/Disable mapping of HEAD to GET."), #ifndef WIN32 #if AP_SERVER_MAJORVERSION_NUMBER >= 2