From: Jeff Trawick Date: Thu, 23 Feb 2006 21:40:59 +0000 (+0000) Subject: mod_charset_lite: Remove Content-Length when output filter can X-Git-Tag: 2.3.0~2525 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=589b46d974c816f4e16a1bd4cc6f0b8a5ef9eef0;p=thirdparty%2Fapache%2Fhttpd.git mod_charset_lite: Remove Content-Length when output filter can invalidate it. Warn when input filter can invalidate it. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@380232 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index e45cd053e4a..eeb67576949 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,10 @@ Changes with Apache 2.3.0 [Remove entries to the current 2.0 and 2.2 section below, when backported] + *) mod_charset_lite: Remove Content-Length when output filter can + invalidate it. Warn when input filter can invalidate it. + [Jeff Trawick] + *) Ensure that the proper status line is written to the client, fixing incorrect status lines caused by filters which modify r->status without resetting r->status_line, such as the built-in byterange filter. diff --git a/modules/filters/mod_charset_lite.c b/modules/filters/mod_charset_lite.c index 61a27ed67f3..fd68ec5bb68 100644 --- a/modules/filters/mod_charset_lite.c +++ b/modules/filters/mod_charset_lite.c @@ -85,6 +85,7 @@ typedef struct charset_dir_t { */ typedef struct charset_filter_ctx_t { apr_xlate_t *xlate; + int is_sb; /* single-byte translation? */ charset_dir_t *dc; ees_t ees; /* extended error status */ apr_size_t saved; @@ -323,6 +324,9 @@ static int find_code_page(request_rec *r) dc->charset_default, dc->charset_source); return HTTP_INTERNAL_SERVER_ERROR; } + if (apr_xlate_sb_get(input_ctx->xlate, &input_ctx->is_sb) != APR_SUCCESS) { + input_ctx->is_sb = 0; + } } return DECLINED; @@ -862,6 +866,11 @@ static apr_status_t xlate_out_filter(ap_filter_t *f, apr_bucket_brigade *bb) dc->charset_source, dc->charset_default); ctx->noop = 1; } + else { + if (apr_xlate_sb_get(ctx->xlate, &ctx->is_sb) != APR_SUCCESS) { + ctx->is_sb = 0; + } + } } else { ctx->noop = 1; @@ -883,6 +892,12 @@ static apr_status_t xlate_out_filter(ap_filter_t *f, apr_bucket_brigade *bb) if (!ctx->ran) { /* filter never ran before */ chk_filter_chain(f); ctx->ran = 1; + if (!ctx->noop && !ctx->is_sb) { + /* We're not converting between two single-byte charsets, so unset + * Content-Length since it is unlikely to remain the same. + */ + apr_table_unset(f->r->headers_out, "Content-Length"); + } } if (ctx->noop) { @@ -1041,6 +1056,17 @@ static int xlate_in_filter(ap_filter_t *f, apr_bucket_brigade *bb, if (!ctx->ran) { /* filter never ran before */ chk_filter_chain(f); ctx->ran = 1; + if (!ctx->noop && !ctx->is_sb) { + /* We're not converting between two single-byte charsets, so note + * that some handlers can't deal with it. + * It doesn't help to unset Content-Length in the input header + * table since in all likelihood the handler has already seen it. + */ + if (dc->debug >= DBGLVL_PMC) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, + "Request body length may change, breaking some requests"); + } + } } if (ctx->noop) {