My concern is that this can't and shouldn't change on 2.4.x.

I love the concept and it is correct, however there are enough modules
relying
on the fact that they must remove the http protocol filters that changing
the
default behavior is effectively breaking binary ABI.

Thoughts?

Cheers,

Bill

On Mon, Mar 14, 2016 at 7:22 PM, Graham Leggett <minf...@sharp.fm> wrote:

> Hi all,
>
> The following patch fixes the problem where the HTTP1 filters are added on
> non HTTP1 requests.
>
> The filters are now only added if ap_get_protocol() returns
> AP_PROTOCOL_HTTP1.
>
> Regards,
> Graham
> --
>
> Index: modules/http/http_core.c
> ===================================================================
> --- modules/http/http_core.c    (revision 1734998)
> +++ modules/http/http_core.c    (working copy)
> @@ -34,6 +34,8 @@
>
>  #include "mod_core.h"
>
> +module AP_MODULE_DECLARE_DATA http_module;
> +
>  /* Handles for core filters */
>  AP_DECLARE_DATA ap_filter_rec_t *ap_http_input_filter_handle;
>  AP_DECLARE_DATA ap_filter_rec_t *ap_http_header_filter_handle;
> @@ -48,6 +50,10 @@
>   */
>  static int async_mpm = 0;
>
> +typedef struct {
> +    int is_http;
> +} http_conn_conf;
> +
>  static const char *set_keep_alive_timeout(cmd_parms *cmd, void *dummy,
>                                            const char *arg)
>  {
> @@ -242,9 +248,29 @@
>      return OK;
>  }
>
> +static int http_pre_connection(conn_rec *c, void *csd)
> +{
> +    const char *protocol = ap_get_protocol(c);
> +
> +    http_conn_conf *cconf = apr_pcalloc(c->pool, sizeof(*cconf));
> +
> +    if (!protocol || !strcmp(AP_PROTOCOL_HTTP1, protocol)) {
> +        cconf->is_http = 1;
> +    }
> +
> +    ap_set_module_config(c->conn_config, &http_module, cconf);
> +
> +    return OK;
> +}
> +
>  static int ap_process_http_connection(conn_rec *c)
>  {
> -    if (async_mpm && !c->clogging_input_filters) {
> +    http_conn_conf *cconf = ap_get_module_config(c->conn_config,
> &http_module);
> +
> +    if (!cconf || !cconf->is_http) {
> +        return DECLINED;
> +    }
> +    else if (async_mpm && !c->clogging_input_filters) {
>          return ap_process_http_async_connection(c);
>      }
>      else {
> @@ -254,7 +280,6 @@
>
>  static int http_create_request(request_rec *r)
>  {
> -    /* FIXME: we must only add these filters if we are an HTTP request */
>      if (!r->main && !r->prev) {
>          ap_add_output_filter_handle(ap_byterange_filter_handle,
>                                      NULL, r, r->connection);
> @@ -295,6 +320,7 @@
>  static void register_hooks(apr_pool_t *p)
>  {
>      ap_hook_post_config(http_post_config, NULL, NULL, APR_HOOK_MIDDLE);
> +    ap_hook_pre_connection(http_pre_connection,NULL,NULL,
> APR_HOOK_REALLY_LAST);
>      ap_hook_process_connection(ap_process_http_connection, NULL, NULL,
>                                 APR_HOOK_REALLY_LAST);
>      ap_hook_map_to_storage(ap_send_http_trace,NULL,NULL,APR_HOOK_MIDDLE);
>
>

Reply via email to