You didn't handle the case where the handler wants to through away the data, and thus doesn't want to send the 100
Ryan ---------------------------------------------- Ryan Bloom [EMAIL PROTECTED] 645 Howard St. [EMAIL PROTECTED] San Francisco, CA > -----Original Message----- > From: Justin Erenkrantz [mailto:[EMAIL PROTECTED]] > Sent: Friday, April 12, 2002 5:02 PM > To: [EMAIL PROTECTED] > Subject: [PATCH] Move 100-Continue into HTTP_IN > > As Ryan has pointed out, ap_http_filter doesn't properly > handle 100-Continue requests. Rather than call > ap_should_client_block, HTTP_IN (aka ap_http_filter) should > handle this transparently (since I am in the camp that > HTTP_IN should handle all HTTP protocol issues). > > Untested. Can I get any concept +1s (or -1s)? -- justin > > Index: modules/http/http_protocol.c > =================================================================== > RCS file: /home/cvs/httpd-2.0/modules/http/http_protocol.c,v > retrieving revision 1.407 > diff -u -r1.407 http_protocol.c > --- modules/http/http_protocol.c 1 Apr 2002 22:26:09 -0000 1.407 > +++ modules/http/http_protocol.c 12 Apr 2002 23:54:34 -0000 > @@ -736,6 +736,23 @@ > return APR_EGENERAL; > } > } > + > + /* Since we're about to read data, send 100-Continue if needed. > */ > + if (f->r->expecting_100 && f->r->proto_num >= HTTP_VERSION(1,1)) > { > + char *tmp; > + apr_bucket_brigade *bb; > + > + tmp = apr_pstrcat(f->r->pool, AP_SERVER_PROTOCOL, " ", > + status_lines[0], CRLF CRLF, NULL); > + bb = apr_brigade_create(f->r->pool, f->c->bucket_alloc); > + e = apr_bucket_pool_create(tmp, strlen(tmp), f->r->pool, > + f->c->bucket_alloc); > + APR_BRIGADE_INSERT_HEAD(bb, e); > + e = apr_bucket_flush_create(f->c->bucket_alloc); > + APR_BRIGADE_INSERT_TAIL(bb, e); > + > + ap_pass_brigade(f->c->output_filters, bb); > + } > } > > if (!ctx->remaining) { > @@ -1576,24 +1593,6 @@ > > if (r->read_length || (!r->read_chunked && (r->remaining <= 0))) { > return 0; > - } > - > - if (r->expecting_100 && r->proto_num >= HTTP_VERSION(1,1)) { > - conn_rec *c = r->connection; > - char *tmp; > - apr_bucket *e; > - apr_bucket_brigade *bb; > - > - /* sending 100 Continue interim response */ > - tmp = apr_pstrcat(r->pool, AP_SERVER_PROTOCOL, " ", > status_lines[0], > - CRLF CRLF, NULL); > - bb = apr_brigade_create(r->pool, c->bucket_alloc); > - e = apr_bucket_pool_create(tmp, strlen(tmp), r->pool, c- > >bucket_alloc); > - APR_BRIGADE_INSERT_HEAD(bb, e); > - e = apr_bucket_flush_create(c->bucket_alloc); > - APR_BRIGADE_INSERT_TAIL(bb, e); > - > - ap_pass_brigade(r->connection->output_filters, bb); > } > > return 1;
