You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by rb...@locus.apache.org on 2000/10/11 20:32:24 UTC

cvs commit: apache-2.0/src/main http_core.c http_protocol.c

rbb         00/10/11 11:32:21

  Modified:    src      CHANGES
               src/main http_core.c http_protocol.c
  Log:
  Cleanup the input filtering a bit.  This does not work with telnet
  currently, but it is a step in the right direction.  Input filtering
  should be slowly improving from here on out.
  Submitted by:	Greg Ames, Ryan Bloom, Jeff Trawick
  
  Revision  Changes    Path
  1.268     +7 -0      apache-2.0/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/CHANGES,v
  retrieving revision 1.267
  retrieving revision 1.268
  diff -u -r1.267 -r1.268
  --- CHANGES	2000/10/10 04:11:35	1.267
  +++ CHANGES	2000/10/11 18:32:15	1.268
  @@ -1,4 +1,11 @@
   Changes with Apache 2.0a8
  +  *) Big cleanup of the input filtering.  The goal is that http_filter
  +     understands two conditions, headers and body.  It knows where it is
  +     based on c->remaining.  If c->remaining is 0, then we are in headers,
  +     and http_filter returns a line at a time.  If it is not 0, then we are
  +     in body, and http_filter returns raw data, but only up to c->remaining
  +     bytes.  It can return less, but never more.
  +     [Greg Ames, Ryan Bloom, Jeff Trawick]
   
     *) mod_cgi: Write all of the request body to the child, not just what
        the kernel would accept on the first write.  [Jeff Trawick]
  
  
  
  1.161     +3 -25     apache-2.0/src/main/http_core.c
  
  Index: http_core.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/http_core.c,v
  retrieving revision 1.160
  retrieving revision 1.161
  diff -u -r1.160 -r1.161
  --- http_core.c	2000/10/10 03:35:11	1.160
  +++ http_core.c	2000/10/11 18:32:17	1.161
  @@ -3305,37 +3305,15 @@
   
   static int core_input_filter(ap_filter_t *f, ap_bucket_brigade *b)
   {
  -    char *buff;
  -    apr_ssize_t length = HUGE_STRING_LEN;
       apr_socket_t *csock = NULL;
  -    apr_status_t rv;
       ap_bucket *e;
   
  -    /* As soon as we have pool buckets, this should become a palloc. */
  -    buff = apr_palloc(f->c->pool, HUGE_STRING_LEN);
       ap_bpop_socket(&csock, f->c->client);
  -
  -    rv = apr_recv(csock, buff, &length);
  -    if (rv == APR_SUCCESS) {
  -        if (length > 0) {
  -            /* This should probably be a pool bucket, but using a transient is 
  -             * actually okay here too.  We know the pool we are using will always 
  -             * be available as long as the connection is open.
  -             */
  -            e = ap_bucket_create_transient(buff, length);
  -            AP_BRIGADE_INSERT_TAIL(b, e);
  -        }
  -        else {
  -            /* XXX need to trigger EOS/EOF processing;
  -             * for now, return empty brigade because that is what
  -             * getline() looks for */
  -        }
  -    }
  -    else {
  -        return rv;
  -    }
  +    e = ap_bucket_create_socket(csock);
  +    AP_BRIGADE_INSERT_TAIL(b, e);
       return APR_SUCCESS;
   }
  +
   /* Default filter.  This filter should almost always be used.  Its only job
    * is to send the headers if they haven't already been sent, and then send
    * the actual data.
  
  
  
  1.157     +23 -23    apache-2.0/src/main/http_protocol.c
  
  Index: http_protocol.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/http_protocol.c,v
  retrieving revision 1.156
  retrieving revision 1.157
  diff -u -r1.156 -r1.157
  --- http_protocol.c	2000/10/11 17:37:22	1.156
  +++ http_protocol.c	2000/10/11 18:32:19	1.157
  @@ -868,7 +868,6 @@
       char *buff;
       apr_ssize_t length;
       char *pos;
  -    int state = 0;
       http_ctx_t *ctx = f->ctx;
       ap_bucket_brigade *bb;
       apr_status_t rv;
  @@ -921,30 +920,19 @@
               return rv;
           }
   
  -        pos = buff + 1;
  +        pos = buff;
           while (pos < buff + length) {
  -
  -            /* We are at the start of one line, but it actually has data. */
  -            if ((*pos != ASCII_LF) && (*pos != ASCII_CR)) {
  -                state = 0;
  -            }
  -            else {
  -                if (*pos == ASCII_LF) {
  -                    state++;
  +            if (*pos == ASCII_LF) {
  +                if (*(pos - 1) == ASCII_CR) {
  +                    *(pos - 1) = ASCII_LF;
  +                    *pos = '\0';
                   }
  -            }
  -            
  -            if ((*pos == ASCII_LF) && (*(pos - 1) == ASCII_CR)) {
  -                *(pos - 1) = ASCII_LF;
  -                *pos = '\0';
  -            }
  -            pos++;
  -            if (state == 2) {
  -                e->split(e, pos - buff);
  +                e->split(e, pos - buff + (*pos == '\0'));
                   bb = ap_brigade_split(b, AP_BUCKET_NEXT(e));
                   ctx->b = bb;
                   return APR_SUCCESS;
               }
  +            pos++;
           }
       }
       return APR_SUCCESS;
  @@ -1003,8 +991,8 @@
       if (AP_BRIGADE_EMPTY(b)) {
           return -1;
       }
  -    e = AP_BRIGADE_FIRST(b); 
       while (1) {
  +        e = AP_BRIGADE_FIRST(b); 
           while (e->length == 0) {
               AP_BUCKET_REMOVE(e);
               ap_bucket_destroy(e);
  @@ -1028,13 +1016,25 @@
   	/* check for line end using ascii encoding, even on an ebcdic box
   	 * since this is raw protocol data fresh from the network
   	 */
  +/*XXX This needs to be scrubbed, but Greg Ames is going to do a lot to this
  +  *   code in a little while.  When he is done, it shouldn't need scrubbing
  +  *   any more.
  +  *
  +  *   GREG, this is where the breakage is!!!!
  +  */
           if ((toss = ap_strchr_c(temp, ASCII_LF)) != NULL) { 
  -            length = toss - temp + 1;
  -            e->split(e, length + (temp[length] == '\0'));
  +            length = (toss - temp) + (pos - s) + 1;
  +            e->split(e, length + (temp[length] == '\0')); 
  +            apr_cpystrn(pos, temp, length + 1);
  +            AP_BUCKET_REMOVE(e);
  +            ap_bucket_destroy(e);
  +        }
  +        else {
               apr_cpystrn(pos, temp, length + 1);
  -	    
  +            pos += length;
               AP_BUCKET_REMOVE(e);
               ap_bucket_destroy(e);
  +            continue;
           }
           c->input_data = b;
           e = AP_BRIGADE_FIRST(b);