1
0
Fork 0
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:
winlin 2022-09-18 22:50:14 +08:00
parent dae46a59ae
commit 1e6143e2eb
9 changed files with 456 additions and 79 deletions

View file

@ -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);