Skip to content
This repository has been archived by the owner on Nov 6, 2022. It is now read-only.

Fix response body is not read #72

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion http_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -1733,9 +1733,21 @@ http_should_keep_alive (http_parser *parser)
/* HTTP/1.1 */
if (parser->flags & F_CONNECTION_CLOSE) {
return 0;
} else {
}
if (parser->type == HTTP_REQUEST) {
return 1;
}
/* see RFC2616 section 4.4 */
if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */
parser->status_code == 204 || /* No Content */
parser->status_code == 304 || /* Not Modified */
parser->flags & F_SKIPBODY) { /* response to a HEAD request */
return 1;
}
if (!(parser->flags & F_CHUNKED) && parser->content_length == -1) {
return 0;
}
return 1;
} else {
/* HTTP/1.0 or earlier */
if (parser->flags & F_CONNECTION_KEEP_ALIVE) {
Expand Down
50 changes: 44 additions & 6 deletions test.c
Original file line number Diff line number Diff line change
Expand Up @@ -780,8 +780,8 @@ const struct message responses[] =
, {.name= "404 no headers no body"
,.type= HTTP_RESPONSE
,.raw= "HTTP/1.1 404 Not Found\r\n\r\n"
,.should_keep_alive= TRUE
,.message_complete_on_eof= FALSE
,.should_keep_alive= FALSE
,.message_complete_on_eof= TRUE
,.http_major= 1
,.http_minor= 1
,.status_code= 404
Expand All @@ -795,8 +795,8 @@ const struct message responses[] =
, {.name= "301 no response phrase"
,.type= HTTP_RESPONSE
,.raw= "HTTP/1.1 301\r\n\r\n"
,.should_keep_alive = TRUE
,.message_complete_on_eof= FALSE
,.should_keep_alive = FALSE
,.message_complete_on_eof= TRUE
,.http_major= 1
,.http_minor= 1
,.status_code= 301
Expand Down Expand Up @@ -1057,8 +1057,46 @@ const struct message responses[] =
{}
,.body= ""
}
, {.name= NULL } /* sentinel */

#define NO_CONTENT_LENGTH_NO_TRANSFER_ENCODING_RESPONSE 13
/* The client should wait for the server's EOF. That is, when neither
* content-length nor transfer-encoding is specified, the end of body
* is specified by the EOF.
*/
, {.name= "neither content-length nor transfer-encoding response"
,.type= HTTP_RESPONSE
,.raw= "HTTP/1.1 200 OK\r\n"
"Content-Type: text/plain\r\n"
"\r\n"
"hello world"
,.should_keep_alive= FALSE
,.message_complete_on_eof= TRUE
,.http_major= 1
,.http_minor= 1
,.status_code= 200
,.num_headers= 1
,.headers=
{ { "Content-Type", "text/plain" }
}
,.body= "hello world"
}

#define NO_HEADERS_NO_BODY_204 14
, {.name= "204 no headers no body"
,.type= HTTP_RESPONSE
,.raw= "HTTP/1.1 204 No Content\r\n\r\n"
,.should_keep_alive= TRUE
,.message_complete_on_eof= FALSE
,.http_major= 1
,.http_minor= 1
,.status_code= 204
,.num_headers= 0
,.headers= {}
,.body_size= 0
,.body= ""
}

, {.name= NULL } /* sentinel */
};

int
Expand Down Expand Up @@ -1888,7 +1926,7 @@ main (void)

printf("response scan 1/2 ");
test_scan( &responses[TRAILING_SPACE_ON_CHUNKED_BODY]
, &responses[NO_HEADERS_NO_BODY_404]
, &responses[NO_HEADERS_NO_BODY_204]
, &responses[NO_REASON_PHRASE]
);

Expand Down