mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
GB28181: Refine HTTP parser to support SIP. v5.0.70
This commit is contained in:
parent
dae46a59ae
commit
1e6143e2eb
9 changed files with 456 additions and 79 deletions
|
@ -255,6 +255,14 @@ ISrsHttpResponseReader::~ISrsHttpResponseReader()
|
|||
{
|
||||
}
|
||||
|
||||
ISrsHttpRequestWriter::ISrsHttpRequestWriter()
|
||||
{
|
||||
}
|
||||
|
||||
ISrsHttpRequestWriter::~ISrsHttpRequestWriter()
|
||||
{
|
||||
}
|
||||
|
||||
ISrsHttpHandler::ISrsHttpHandler()
|
||||
{
|
||||
entry = NULL;
|
||||
|
@ -1696,6 +1704,9 @@ enum state
|
|||
, s_res_HT
|
||||
, s_res_HTT
|
||||
, s_res_HTTP
|
||||
, s_res_S /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
, s_res_SI /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
, s_res_SIP /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
, s_res_http_major
|
||||
, s_res_http_dot
|
||||
, s_res_http_minor
|
||||
|
@ -1728,6 +1739,9 @@ enum state
|
|||
, s_req_http_HTTP
|
||||
, s_req_http_I
|
||||
, s_req_http_IC
|
||||
, s_req_http_S /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
, s_req_http_SI /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
, s_req_http_SIP /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
, s_req_http_major
|
||||
, s_req_http_dot
|
||||
, s_req_http_minor
|
||||
|
@ -2143,6 +2157,11 @@ reexecute:
|
|||
if (ch == 'H') {
|
||||
UPDATE_STATE(s_res_or_resp_H);
|
||||
|
||||
CALLBACK_NOTIFY(message_begin);
|
||||
} else if (ch == 'S') { /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
parser->type = HTTP_RESPONSE;
|
||||
UPDATE_STATE(s_res_S);
|
||||
|
||||
CALLBACK_NOTIFY(message_begin);
|
||||
} else {
|
||||
parser->type = HTTP_REQUEST;
|
||||
|
@ -2179,6 +2198,8 @@ reexecute:
|
|||
|
||||
if (ch == 'H') {
|
||||
UPDATE_STATE(s_res_H);
|
||||
} else if (ch == 'S') { /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
UPDATE_STATE(s_res_S);
|
||||
} else {
|
||||
SET_ERRNO(HPE_INVALID_CONSTANT);
|
||||
goto error;
|
||||
|
@ -2208,6 +2229,24 @@ reexecute:
|
|||
UPDATE_STATE(s_res_http_major);
|
||||
break;
|
||||
|
||||
/* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
case s_res_S:
|
||||
STRICT_CHECK(ch != 'I');
|
||||
UPDATE_STATE(s_res_SI);
|
||||
break;
|
||||
|
||||
/* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
case s_res_SI:
|
||||
STRICT_CHECK(ch != 'P');
|
||||
UPDATE_STATE(s_res_SIP);
|
||||
break;
|
||||
|
||||
/* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
case s_res_SIP:
|
||||
STRICT_CHECK(ch != '/');
|
||||
UPDATE_STATE(s_res_http_major);
|
||||
break;
|
||||
|
||||
case s_res_http_major:
|
||||
if (UNLIKELY(!IS_NUM(ch))) {
|
||||
SET_ERRNO(HPE_INVALID_VERSION);
|
||||
|
@ -2342,20 +2381,21 @@ reexecute:
|
|||
parser->method = (enum http_method) 0;
|
||||
parser->index = 1;
|
||||
switch (ch) {
|
||||
case 'A': parser->method = HTTP_ACL; break;
|
||||
case 'B': parser->method = HTTP_BIND; break;
|
||||
case 'A': parser->method = HTTP_ACL; /* or ACK */ break;
|
||||
case 'B': parser->method = HTTP_BIND; /* or BYE */ break;
|
||||
case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break;
|
||||
case 'D': parser->method = HTTP_DELETE; break;
|
||||
case 'G': parser->method = HTTP_GET; break;
|
||||
case 'H': parser->method = HTTP_HEAD; break;
|
||||
case 'I': parser->method = HTTP_INVITE; break; /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
case 'L': parser->method = HTTP_LOCK; /* or LINK */ break;
|
||||
case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH, MKCALENDAR */ break;
|
||||
case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH, MKCALENDAR, MESSAGE */ break;
|
||||
case 'N': parser->method = HTTP_NOTIFY; break;
|
||||
case 'O': parser->method = HTTP_OPTIONS; break;
|
||||
case 'P': parser->method = HTTP_POST;
|
||||
/* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */
|
||||
break;
|
||||
case 'R': parser->method = HTTP_REPORT; /* or REBIND */ break;
|
||||
case 'R': parser->method = HTTP_REPORT; /* or REBIND, REGISTER */ break;
|
||||
case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH, SOURCE */ break;
|
||||
case 'T': parser->method = HTTP_TRACE; break;
|
||||
case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE, UNBIND, UNLINK */ break;
|
||||
|
@ -2394,6 +2434,8 @@ reexecute:
|
|||
XX(POST, 1, 'A', PATCH)
|
||||
XX(POST, 1, 'R', PROPFIND)
|
||||
XX(PUT, 2, 'R', PURGE)
|
||||
XX(ACL, 2, 'K', ACK) /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
XX(BIND, 1, 'Y', BYE) /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
XX(CONNECT, 1, 'H', CHECKOUT)
|
||||
XX(CONNECT, 2, 'P', COPY)
|
||||
XX(MKCOL, 1, 'O', MOVE)
|
||||
|
@ -2401,9 +2443,11 @@ reexecute:
|
|||
XX(MKCOL, 1, '-', MSEARCH)
|
||||
XX(MKCOL, 2, 'A', MKACTIVITY)
|
||||
XX(MKCOL, 3, 'A', MKCALENDAR)
|
||||
XX(MERGE, 2, 'S', MESSAGE) /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
XX(SUBSCRIBE, 1, 'E', SEARCH)
|
||||
XX(SUBSCRIBE, 1, 'O', SOURCE)
|
||||
XX(REPORT, 2, 'B', REBIND)
|
||||
XX(REPORT, 2, 'G', REGISTER) /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
XX(PROPFIND, 4, 'P', PROPPATCH)
|
||||
XX(LOCK, 1, 'I', LINK)
|
||||
XX(UNLOCK, 2, 'S', UNSUBSCRIBE)
|
||||
|
@ -2432,6 +2476,11 @@ reexecute:
|
|||
UPDATE_STATE(s_req_server_start);
|
||||
}
|
||||
|
||||
/* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
if (parser->method >= HTTP_REGISTER && parser->method <= HTTP_BYE) {
|
||||
UPDATE_STATE(s_req_path);
|
||||
}
|
||||
|
||||
UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch));
|
||||
if (UNLIKELY(CURRENT_STATE() == s_dead)) {
|
||||
SET_ERRNO(HPE_INVALID_URL);
|
||||
|
@ -2503,6 +2552,9 @@ reexecute:
|
|||
case 'H':
|
||||
UPDATE_STATE(s_req_http_H);
|
||||
break;
|
||||
case 'S': /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
UPDATE_STATE(s_req_http_S); /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
break; /* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
case 'I':
|
||||
if (parser->method == HTTP_SOURCE) {
|
||||
UPDATE_STATE(s_req_http_I);
|
||||
|
@ -2545,6 +2597,24 @@ reexecute:
|
|||
UPDATE_STATE(s_req_http_major);
|
||||
break;
|
||||
|
||||
/* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
case s_req_http_S:
|
||||
STRICT_CHECK(ch != 'I');
|
||||
UPDATE_STATE(s_req_http_SI);
|
||||
break;
|
||||
|
||||
/* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
case s_req_http_SI:
|
||||
STRICT_CHECK(ch != 'P');
|
||||
UPDATE_STATE(s_req_http_SIP);
|
||||
break;
|
||||
|
||||
/* SIP https://www.ietf.org/rfc/rfc3261.html */
|
||||
case s_req_http_SIP:
|
||||
STRICT_CHECK(ch != '/');
|
||||
UPDATE_STATE(s_req_http_major);
|
||||
break;
|
||||
|
||||
case s_req_http_major:
|
||||
if (UNLIKELY(!IS_NUM(ch))) {
|
||||
SET_ERRNO(HPE_INVALID_VERSION);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue