We have to do more work than this.  The 100 has to be sent before 
attempting
to read the first chunk (if chunked) or only if C-L > 0 (if length).

Also, the code that reads the chunk length is failing to check for errors.

Also, the code that reads the chunk end is failing to read the trailers.

In other words, this isn't even remotely HTTP/1.1 compliant right now.
I suspect the same is true of the proxy code.

....Roy

On Friday, April 12, 2002, at 05:01  PM, Justin Erenkrantz wrote:

> 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;
>

Reply via email to