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