|
|
@ -171,8 +171,8 @@ static int add_header(grpc_http_parser *parser) { |
|
|
|
while (cur != end && (*cur == ' ' || *cur == '\t')) { |
|
|
|
while (cur != end && (*cur == ' ' || *cur == '\t')) { |
|
|
|
cur++; |
|
|
|
cur++; |
|
|
|
} |
|
|
|
} |
|
|
|
GPR_ASSERT(end - cur >= 2); |
|
|
|
GPR_ASSERT((size_t)(end - cur) >= parser->cur_line_end_length); |
|
|
|
hdr.value = buf2str(cur, (size_t)(end - cur) - 2); |
|
|
|
hdr.value = buf2str(cur, (size_t)(end - cur) - parser->cur_line_end_length); |
|
|
|
|
|
|
|
|
|
|
|
if (parser->type == GRPC_HTTP_RESPONSE) { |
|
|
|
if (parser->type == GRPC_HTTP_RESPONSE) { |
|
|
|
hdr_count = &parser->http.response.hdr_count; |
|
|
|
hdr_count = &parser->http.response.hdr_count; |
|
|
@ -207,7 +207,7 @@ static int finish_line(grpc_http_parser *parser) { |
|
|
|
parser->state = GRPC_HTTP_HEADERS; |
|
|
|
parser->state = GRPC_HTTP_HEADERS; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case GRPC_HTTP_HEADERS: |
|
|
|
case GRPC_HTTP_HEADERS: |
|
|
|
if (parser->cur_line_length == 2) { |
|
|
|
if (parser->cur_line_length == parser->cur_line_end_length) { |
|
|
|
parser->state = GRPC_HTTP_BODY; |
|
|
|
parser->state = GRPC_HTTP_BODY; |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
@ -247,6 +247,30 @@ static int addbyte_body(grpc_http_parser *parser, uint8_t byte) { |
|
|
|
return 1; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int check_line(grpc_http_parser *parser) { |
|
|
|
|
|
|
|
if (parser->cur_line_length >= 2 && |
|
|
|
|
|
|
|
parser->cur_line[parser->cur_line_length - 2] == '\r' && |
|
|
|
|
|
|
|
parser->cur_line[parser->cur_line_length - 1] == '\n') { |
|
|
|
|
|
|
|
return 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// HTTP request with \n\r line termiantors.
|
|
|
|
|
|
|
|
else if (parser->cur_line_length >= 2 && |
|
|
|
|
|
|
|
parser->cur_line[parser->cur_line_length - 2] == '\n' && |
|
|
|
|
|
|
|
parser->cur_line[parser->cur_line_length - 1] == '\r') { |
|
|
|
|
|
|
|
return 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// HTTP request with only \n line terminators.
|
|
|
|
|
|
|
|
else if (parser->cur_line_length >= 1 && |
|
|
|
|
|
|
|
parser->cur_line[parser->cur_line_length - 1] == '\n') { |
|
|
|
|
|
|
|
parser->cur_line_end_length = 1; |
|
|
|
|
|
|
|
return 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int addbyte(grpc_http_parser *parser, uint8_t byte) { |
|
|
|
static int addbyte(grpc_http_parser *parser, uint8_t byte) { |
|
|
|
switch (parser->state) { |
|
|
|
switch (parser->state) { |
|
|
|
case GRPC_HTTP_FIRST_LINE: |
|
|
|
case GRPC_HTTP_FIRST_LINE: |
|
|
@ -259,9 +283,7 @@ static int addbyte(grpc_http_parser *parser, uint8_t byte) { |
|
|
|
} |
|
|
|
} |
|
|
|
parser->cur_line[parser->cur_line_length] = byte; |
|
|
|
parser->cur_line[parser->cur_line_length] = byte; |
|
|
|
parser->cur_line_length++; |
|
|
|
parser->cur_line_length++; |
|
|
|
if (parser->cur_line_length >= 2 && |
|
|
|
if (check_line(parser)) { |
|
|
|
parser->cur_line[parser->cur_line_length - 2] == '\r' && |
|
|
|
|
|
|
|
parser->cur_line[parser->cur_line_length - 1] == '\n') { |
|
|
|
|
|
|
|
return finish_line(parser); |
|
|
|
return finish_line(parser); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
return 1; |
|
|
|
return 1; |
|
|
@ -277,6 +299,7 @@ void grpc_http_parser_init(grpc_http_parser *parser) { |
|
|
|
memset(parser, 0, sizeof(*parser)); |
|
|
|
memset(parser, 0, sizeof(*parser)); |
|
|
|
parser->state = GRPC_HTTP_FIRST_LINE; |
|
|
|
parser->state = GRPC_HTTP_FIRST_LINE; |
|
|
|
parser->type = GRPC_HTTP_UNKNOWN; |
|
|
|
parser->type = GRPC_HTTP_UNKNOWN; |
|
|
|
|
|
|
|
parser->cur_line_end_length = 2; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void grpc_http_parser_destroy(grpc_http_parser *parser) { |
|
|
|
void grpc_http_parser_destroy(grpc_http_parser *parser) { |
|
|
|