DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT <http://nagoya.apache.org/bugzilla/show_bug.cgi?id=16134>. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=16134 mod_deflate may lead to HTTP/1.1 400 responce when a request is absolutely correct Summary: mod_deflate may lead to HTTP/1.1 400 responce when a request is absolutely correct Product: Apache httpd-2.0 Version: HEAD Platform: PC OS/Version: Windows XP Status: NEW Severity: Major Priority: Other Component: mod_deflate AssignedTo: [email protected] ReportedBy: [EMAIL PROTECTED] When following conditions are met, mod_deflate (as a filter) does not propagate EOS to the upper level and leads to WRONG REQUEST (HTTP 400) responce. 1. enable mod_dav, mod_dav_fs, mod_deflate 2. compression is enabled for both - input and output 3. client sends PROPFIND HTTP/1.1 request with Content-Encoding: gzip header and a properly gzip'ed xml content. Example of httpd.conf: ###httpd.conf BEGIN ... skipped all common options ... LoadModule deflate_module modules/mod_deflate.so NameVirtualHost localhost:80 NameVirtualHost localhost:801 <VirtualHost localhost:80> </VirtualHost> <VirtualHost localhost:801> DAVLockDB logs/DavLock <Directory "D:/apa2_0_43_15JAN03/Debug/htdocs"> SetInputFilter DEFLATE SetOutputFilter DEFLATE DAV On <Limit PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK> AuthName "Foo" AuthType Basic AuthUserFile logs/passw Require user dmitri </Limit> </Directory> </VirtualHost> ###httpd.conf END My investigation showed that the trouble is in xml_util.c and mod_delate.c files. First requires data until a len=0 (normal condition) or len<0 (error) returned while the second never returns EOS and as a result len is never 0. See mod_deflate.c:662: /* If we actually see the EOS, that means we screwed up! */ if (APR_BUCKET_IS_EOS(bkt)) { return APR_EGENERAL; } I propose a patch that works: --- mod_deflate.c~ 2003-01-03 02:12:36.000000000 +0300 +++ mod_deflate.c 2003-01-15 23:15:38.000000000 +0300 @@ -648,6 +648,15 @@ apr_brigade_cleanup(ctx->bb); } + if (APR_BUCKET_IS_EOS(APR_BRIGADE_FIRST(ctx->bb))) { + apr_bucket *eos; + + apr_brigade_cleanup(ctx->bb); + eos = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, eos); + return APR_SUCCESS; + } + if (APR_BRIGADE_EMPTY(ctx->proc_bb)) { rv = ap_get_brigade(f->next, ctx->bb, mode, block, readbytes); I'm not sure that it's absolutely correct and it needs to be reviewed by somebody who knows Apache2 architecture better. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
