mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Fix HTTP parser bug for parsing header from multiple pieces of data.
This commit is contained in:
parent
45ed458927
commit
6bad973a7c
3 changed files with 218 additions and 14 deletions
|
@ -79,12 +79,10 @@ srs_error_t SrsHttpParser::parse_message(ISrsReader* reader, ISrsHttpMessage** p
|
|||
// Reset request data.
|
||||
state = SrsHttpParseStateInit;
|
||||
hp_header = http_parser();
|
||||
// Reset the message url.
|
||||
url = "";
|
||||
// The body that we have read from cache.
|
||||
pbody = NULL;
|
||||
// Reset the temporarily parsed header field.
|
||||
expect_field_name = true;
|
||||
// We must reset the field name and value, because we may get a partial value in on_header_value.
|
||||
field_name = field_value = "";
|
||||
// The header of the request.
|
||||
srs_freep(header);
|
||||
header = new SrsHttpHeader();
|
||||
|
@ -144,6 +142,11 @@ srs_error_t SrsHttpParser::parse_message_imp(ISrsReader* reader)
|
|||
return srs_error_wrap(err, "grow buffer");
|
||||
}
|
||||
}
|
||||
|
||||
SrsHttpParser* obj = this;
|
||||
if (!obj->field_value.empty()) {
|
||||
obj->header->set(obj->field_name, obj->field_value);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -206,15 +209,14 @@ int SrsHttpParser::on_header_field(http_parser* parser, const char* at, size_t l
|
|||
{
|
||||
SrsHttpParser* obj = (SrsHttpParser*)parser->data;
|
||||
srs_assert(obj);
|
||||
|
||||
// field value=>name, reap the field.
|
||||
if (!obj->expect_field_name) {
|
||||
|
||||
if (!obj->field_value.empty()) {
|
||||
obj->header->set(obj->field_name, obj->field_value);
|
||||
obj->field_name = obj->field_value = "";
|
||||
}
|
||||
obj->expect_field_name = true;
|
||||
|
||||
if (length > 0) {
|
||||
obj->field_name = string(at, (int)length);
|
||||
obj->field_name.append(at, (int)length);
|
||||
}
|
||||
|
||||
srs_info("Header field(%d bytes): %.*s", (int)length, (int)length, at);
|
||||
|
@ -227,9 +229,8 @@ int SrsHttpParser::on_header_value(http_parser* parser, const char* at, size_t l
|
|||
srs_assert(obj);
|
||||
|
||||
if (length > 0) {
|
||||
obj->field_value = string(at, (int)length);
|
||||
obj->field_value.append(at, (int)length);
|
||||
}
|
||||
obj->expect_field_name = false;
|
||||
|
||||
srs_info("Header value(%d bytes): %.*s", (int)length, (int)length, at);
|
||||
return 0;
|
||||
|
|
|
@ -49,8 +49,6 @@ private:
|
|||
// Whether allow jsonp parse.
|
||||
bool jsonp;
|
||||
private:
|
||||
// http parse data, reset before parse message.
|
||||
bool expect_field_name;
|
||||
std::string field_name;
|
||||
std::string field_value;
|
||||
SrsHttpParseState state;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue