Skip to content

Commit

Permalink
[http] Defer processing response code until after receiving all headers
Browse files Browse the repository at this point in the history
Some headers can modify the meaning of the response code.  For
example, a WWW-Authenticate header can change the interpretation of a
401 Unauthorized response from "Access denied" to "Please
authenticate".

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed May 22, 2012
1 parent 8a5ba67 commit 46df5c9
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions src/net/tcp/httpcore.c
Expand Up @@ -143,6 +143,8 @@ struct http_request {

/** RX state */
enum http_rx_state rx_state;
/** Response code */
unsigned int code;
/** Received length */
size_t rx_len;
/** Length remaining (or 0 if unknown) */
Expand Down Expand Up @@ -311,22 +313,18 @@ static int http_response_to_rc ( unsigned int response ) {
*/
static int http_rx_response ( struct http_request *http, char *response ) {
char *spc;
unsigned int code;
int rc;

DBGC ( http, "HTTP %p response \"%s\"\n", http, response );

/* Check response starts with "HTTP/" */
if ( strncmp ( response, "HTTP/", 5 ) != 0 )
return -EINVAL_RESPONSE;

/* Locate and check response code */
/* Locate and store response code */
spc = strchr ( response, ' ' );
if ( ! spc )
return -EINVAL_RESPONSE;
code = strtoul ( spc, NULL, 10 );
if ( ( rc = http_response_to_rc ( code ) ) != 0 )
return rc;
http->code = strtoul ( spc, NULL, 10 );

/* Move to received headers */
http->rx_state = HTTP_RX_HEADER;
Expand Down Expand Up @@ -488,6 +486,12 @@ static int http_rx_header ( struct http_request *http, char *header ) {
/* An empty header line marks the end of this phase */
if ( ! header[0] ) {
empty_line_buffer ( &http->linebuf );

/* Handle response code */
if ( ( rc = http_response_to_rc ( http->code ) ) != 0 )
return rc;

/* Move to next state */
if ( ( http->rx_state == HTTP_RX_HEADER ) &&
( ! ( http->flags & HTTP_HEAD_ONLY ) ) ) {
DBGC ( http, "HTTP %p start of data\n", http );
Expand Down

0 comments on commit 46df5c9

Please sign in to comment.