niq says: done
jim: +1
- * mod_charset_lite: Remove Content-Length when output filter can
- invalidate it. Warn when input filter can invalidate it.
- trunk:
- http://svn.apache.org/viewvc?view=rev&revision=380232
- http://svn.apache.org/viewvc?view=rev&revision=593890
- 2.2.x:
- Trunk patches work when applied in succession, but a consolidated
- patch is at
- http://people.apache.org/~trawick/sb-charset-consolidated.txt
- +1: trawick, niq, jim
-
* mod_autoindex: Generate valid XHTML output by adding the xhtml namespace.
Trunk version of patch:
http://svn.apache.org/viewcvs.cgi?rev=593816&view=rev
*/
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;
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;
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;
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) {
if (!ctx->ran) { /* filter never ran before */
chk_filter_chain(f);
ctx->ran = 1;
+ if (!ctx->noop && !ctx->is_sb
+ && apr_table_get(f->r->headers_in, "Content-Length")) {
+ /* A Content-Length header is present, but it won't be valid after
+ * conversion because we're not converting between two single-byte
+ * charsets. This will affect most CGI scripts and may affect
+ * some modules.
+ * Content-Length can't be unset here because that would break
+ * being able to read the request body.
+ * Processing of chunked request bodies is not impacted by this
+ * filter since the the length was not declared anyway.
+ */
+ if (dc->debug >= DBGLVL_PMC) {
+ ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r,
+ "Request body length may change, resulting in "
+ "misprocessing by some modules or scripts");
+ }
+ }
}
if (ctx->noop) {