akosut      96/08/19 11:05:34

  Modified:    src       http_protocol.c
  Log:
  Make Apache correctly read continued headers
  
  Submitted by: Paul Sutton
  Reviewed by: Alexei Kosut, Roy T. Fielding
  
  Revision  Changes    Path
  1.40      +36 -8     apache/src/http_protocol.c
  
  Index: http_protocol.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_protocol.c,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -C3 -r1.39 -r1.40
  *** http_protocol.c   1996/08/19 17:22:56     1.39
  --- http_protocol.c   1996/08/19 18:05:32     1.40
  ***************
  *** 530,545 ****
        char w[MAX_STRING_LEN];
        char *t;
        conn_rec *c = r->connection;
    
  !     while(getline(w, MAX_STRING_LEN-1, c->client)) {
  !         if(!w[0]) 
  !             return;
  !         if(!(t = strchr(w,':')))
  !             continue;
  !         *t++ = '\0';
  !         while(isspace(*t)) ++t;
    
  !     table_merge (r->headers_in, w, t);
        }
    }
    
  --- 530,573 ----
        char w[MAX_STRING_LEN];
        char *t;
        conn_rec *c = r->connection;
  +     int len = 0;
  +     char lookahead[2];
    
  !     if (getline(w, MAX_STRING_LEN-1, c->client)) {
  !         do {
  !         if(!w[len])
  !             return;
  !         /* w[] contains the _current_ line. Lets read the
  !          * first char of the _next_ line into lookahead[] and see
  !          * if it is a continuation line */
  !         if (!getline(lookahead, 2, c->client) ||
  !             *lookahead == '\0' ||
  !             (*lookahead != ' ' && *lookahead != '\t')) {
  !             /* Not a continuation line -- _next_ line is either
  !              * a read error, empty, or doesn't start with SPACE or TAB
  !              * -- so store the _current_ line now */
  !             if(!(t = strchr(w,':')))
  !                 continue;
  !             *t++ = '\0';
  !             while(isspace(*t)) ++t;
    
  !             table_merge (r->headers_in, w, t);
  ! 
  !             if (!*lookahead) /* did we read an empty line? */
  !                 return;
  ! 
  !             /* Put what we read as the start of the new _current_ line */
  !             w[0] = '\0';
  !         }
  !         /* To get here, here have got a lookahead character in
  !          * *lookahead, so append it onto the end of w[], then
  !          * read the next line onto the end of that. Move
  !          * len on to point to the first char read from the next
  !          * line of input... we use this at the top of the loop
  !          * to check whether we actually read anything. */
  !     } while (len = strlen(w),
  !              w[len++] = *lookahead,
  !              getline (w+len, MAX_STRING_LEN-1-len, c->client));
        }
    }
    
  
  
  

Reply via email to