1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

For #1657, fix the jsonp bug

This commit is contained in:
winlin 2020-11-05 17:57:22 +08:00
parent fc21b31714
commit d67b050935
8 changed files with 60 additions and 53 deletions

View file

@ -1691,7 +1691,13 @@ SrsHttpApi::~SrsHttpApi()
srs_error_t SrsHttpApi::on_start() srs_error_t SrsHttpApi::on_start()
{ {
return srs_success; srs_error_t err = srs_success;
if ((err = conn->set_jsonp(true)) != srs_success) {
return srs_error_wrap(err, "set jsonp");
}
return err;
} }
srs_error_t SrsHttpApi::on_http_message(ISrsHttpMessage* req) srs_error_t SrsHttpApi::on_http_message(ISrsHttpMessage* req)
@ -1742,10 +1748,6 @@ srs_error_t SrsHttpApi::start()
return srs_error_wrap(err, "set cors=%d", v); return srs_error_wrap(err, "set cors=%d", v);
} }
if ((err = conn->set_jsonp(true)) != srs_success) {
return srs_error_wrap(err, "set jsonp");
}
return conn->start(); return conn->start();
} }

View file

@ -159,11 +159,6 @@ srs_error_t SrsHttpConn::cycle()
srs_error_t SrsHttpConn::do_cycle() srs_error_t SrsHttpConn::do_cycle()
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
// Notify the handler that we are starting to process the connection.
if ((err = handler_->on_start()) != srs_success) {
return srs_error_wrap(err, "start");
}
// set the recv timeout, for some clients never disconnect the connection. // set the recv timeout, for some clients never disconnect the connection.
// @see https://github.com/ossrs/srs/issues/398 // @see https://github.com/ossrs/srs/issues/398
@ -171,6 +166,16 @@ srs_error_t SrsHttpConn::do_cycle()
SrsRequest* last_req = NULL; SrsRequest* last_req = NULL;
SrsAutoFree(SrsRequest, last_req); SrsAutoFree(SrsRequest, last_req);
// initialize parser
if ((err = parser->initialize(HTTP_REQUEST)) != srs_success) {
return srs_error_wrap(err, "init parser for %s", ip.c_str());
}
// Notify the handler that we are starting to process the connection.
if ((err = handler_->on_start()) != srs_success) {
return srs_error_wrap(err, "start");
}
// process http messages. // process http messages.
for (int req_id = 0; (err = trd->pull()) == srs_success; req_id++) { for (int req_id = 0; (err = trd->pull()) == srs_success; req_id++) {
@ -268,14 +273,8 @@ srs_error_t SrsHttpConn::set_crossdomain_enabled(bool v)
srs_error_t SrsHttpConn::set_jsonp(bool v) srs_error_t SrsHttpConn::set_jsonp(bool v)
{ {
srs_error_t err = srs_success; parser->set_jsonp(v);
return srs_success;
// initialize parser
if ((err = parser->initialize(HTTP_REQUEST, v)) != srs_success) {
return srs_error_wrap(err, "init parser for %s", ip.c_str());
}
return err;
} }
srs_error_t SrsHttpConn::set_tcp_nodelay(bool v) srs_error_t SrsHttpConn::set_tcp_nodelay(bool v)

View file

@ -281,7 +281,7 @@ srs_error_t SrsHttpClient::initialize(string schema, string h, int p, srs_utime_
srs_freep(parser); srs_freep(parser);
parser = new SrsHttpParser(); parser = new SrsHttpParser();
if ((err = parser->initialize(HTTP_RESPONSE, false)) != srs_success) { if ((err = parser->initialize(HTTP_RESPONSE)) != srs_success) {
return srs_error_wrap(err, "http: init parser"); return srs_error_wrap(err, "http: init parser");
} }

View file

@ -52,11 +52,11 @@ SrsHttpParser::~SrsHttpParser()
srs_freep(header); srs_freep(header);
} }
srs_error_t SrsHttpParser::initialize(enum http_parser_type type, bool allow_jsonp) srs_error_t SrsHttpParser::initialize(enum http_parser_type type)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
jsonp = allow_jsonp; jsonp = false;
type_ = type; type_ = type;
// Initialize the parser, however it's not necessary. // Initialize the parser, however it's not necessary.
@ -75,6 +75,11 @@ srs_error_t SrsHttpParser::initialize(enum http_parser_type type, bool allow_jso
return err; return err;
} }
void SrsHttpParser::set_jsonp(bool allow_jsonp)
{
jsonp = allow_jsonp;
}
srs_error_t SrsHttpParser::parse_message(ISrsReader* reader, ISrsHttpMessage** ppmsg) srs_error_t SrsHttpParser::parse_message(ISrsReader* reader, ISrsHttpMessage** ppmsg)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;

View file

@ -67,8 +67,9 @@ public:
public: public:
// initialize the http parser with specified type, // initialize the http parser with specified type,
// one parser can only parse request or response messages. // one parser can only parse request or response messages.
// @param allow_jsonp whether allow jsonp parser, which indicates the method in query string. virtual srs_error_t initialize(enum http_parser_type type);
virtual srs_error_t initialize(enum http_parser_type type, bool allow_jsonp = false); // Whether allow jsonp parser, which indicates the method in query string.
virtual void set_jsonp(bool allow_jsonp);
// always parse a http message, // always parse a http message,
// that is, the *ppmsg always NOT-NULL when return success. // that is, the *ppmsg always NOT-NULL when return success.
// or error and *ppmsg must be NULL. // or error and *ppmsg must be NULL.

File diff suppressed because one or more lines are too long

View file

@ -6006,7 +6006,7 @@ VOID TEST(ProtocolHTTPTest, ParseHTTPMessage)
SrsHttpParser hp; SrsHttpParser hp;
bio.append("GET /gslb/v1/versions HTTP/1.1\r\nContent-Length: 5\r\n\r\nHello"); bio.append("GET /gslb/v1/versions HTTP/1.1\r\nContent-Length: 5\r\n\r\nHello");
HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST, false)); HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
ISrsHttpMessage* req = NULL; ISrsHttpMessage* req = NULL;
HELPER_ASSERT_SUCCESS(hp.parse_message(&bio, &req)); HELPER_ASSERT_SUCCESS(hp.parse_message(&bio, &req));
@ -6030,7 +6030,7 @@ VOID TEST(ProtocolHTTPTest, ParseHTTPMessage)
SrsHttpParser hp; SrsHttpParser hp;
bio.append("GET"); bio.append("GET");
HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST, false)); HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
// Should fail if not completed message. // Should fail if not completed message.
ISrsHttpMessage* req = NULL; ISrsHttpMessage* req = NULL;
@ -6043,7 +6043,7 @@ VOID TEST(ProtocolHTTPTest, ParseHTTPMessage)
SrsHttpParser hp; SrsHttpParser hp;
bio.append("GET /gslb/v1/versions HTTP/1.1\r\nContent-Length: 5\r\n\r\nHello"); bio.append("GET /gslb/v1/versions HTTP/1.1\r\nContent-Length: 5\r\n\r\nHello");
HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST, false)); HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
ISrsHttpMessage* req = NULL; ISrsHttpMessage* req = NULL;
SrsAutoFree(ISrsHttpMessage, req); SrsAutoFree(ISrsHttpMessage, req);
@ -6061,7 +6061,7 @@ VOID TEST(ProtocolHTTPTest, ParseHTTPMessage)
SrsHttpParser hp; SrsHttpParser hp;
bio.append("GET /gslb/v1/versions HTTP/1.1\r\nContent-Length: 0\r\n\r\n"); bio.append("GET /gslb/v1/versions HTTP/1.1\r\nContent-Length: 0\r\n\r\n");
HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST, false)); HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
ISrsHttpMessage* req = NULL; ISrsHttpMessage* req = NULL;
SrsAutoFree(ISrsHttpMessage, req); SrsAutoFree(ISrsHttpMessage, req);
@ -6073,7 +6073,7 @@ VOID TEST(ProtocolHTTPTest, ParseHTTPMessage)
SrsHttpParser hp; SrsHttpParser hp;
bio.append("GET /gslb/v1/versions HTTP/1.1\r\n\r\n"); bio.append("GET /gslb/v1/versions HTTP/1.1\r\n\r\n");
HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST, false)); HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
ISrsHttpMessage* req = NULL; ISrsHttpMessage* req = NULL;
SrsAutoFree(ISrsHttpMessage, req); SrsAutoFree(ISrsHttpMessage, req);
@ -6085,7 +6085,7 @@ VOID TEST(ProtocolHTTPTest, ParseHTTPMessage)
SrsHttpParser hp; SrsHttpParser hp;
bio.append("GET /gslb/v1/versions HTTP/1.1\r\n\r\n"); bio.append("GET /gslb/v1/versions HTTP/1.1\r\n\r\n");
HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST, false)); HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
ISrsHttpMessage* req = NULL; ISrsHttpMessage* req = NULL;
SrsAutoFree(ISrsHttpMessage, req); SrsAutoFree(ISrsHttpMessage, req);

View file

@ -633,7 +633,7 @@ VOID TEST(HTTPServerTest, ContentLength)
MockBufferIO io; MockBufferIO io;
io.append("HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n"); io.append("HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n");
SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_RESPONSE, false)); SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_RESPONSE));
ISrsHttpMessage* msg = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &msg)); ISrsHttpMessage* msg = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &msg));
char buf[32]; ssize_t nread = 0; char buf[32]; ssize_t nread = 0;
@ -661,7 +661,7 @@ VOID TEST(HTTPServerTest, HTTPChunked)
MockBufferIO io; MockBufferIO io;
io.append("HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"); io.append("HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n");
SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_RESPONSE, false)); SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_RESPONSE));
ISrsHttpMessage* msg = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &msg)); ISrsHttpMessage* msg = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &msg));
char buf[32]; ssize_t nread = 0; char buf[32]; ssize_t nread = 0;
@ -690,7 +690,7 @@ VOID TEST(HTTPServerTest, InfiniteChunked)
MockBufferIO io; MockBufferIO io;
io.append("HTTP/1.1 200 OK\r\n\r\n"); io.append("HTTP/1.1 200 OK\r\n\r\n");
SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_RESPONSE, false)); SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_RESPONSE));
ISrsHttpMessage* msg = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &msg)); ISrsHttpMessage* msg = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &msg));
SrsAutoFree(ISrsHttpMessage, msg); SrsAutoFree(ISrsHttpMessage, msg);
@ -717,7 +717,7 @@ VOID TEST(HTTPServerTest, InfiniteChunked)
MockBufferIO io; MockBufferIO io;
io.append("HTTP/1.1 200 OK\r\n\r\n"); io.append("HTTP/1.1 200 OK\r\n\r\n");
SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_RESPONSE, false)); SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_RESPONSE));
ISrsHttpMessage* msg = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &msg)); ISrsHttpMessage* msg = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &msg));
char buf[32]; ssize_t nread = 0; char buf[32]; ssize_t nread = 0;
@ -745,7 +745,7 @@ VOID TEST(HTTPServerTest, OPTIONSRead)
MockBufferIO io; MockBufferIO io;
io.append("OPTIONS /rtc/v1/play HTTP/1.1\r\n\r\n"); io.append("OPTIONS /rtc/v1/play HTTP/1.1\r\n\r\n");
SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST, false)); SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
ISrsHttpMessage* req = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &req)); ISrsHttpMessage* req = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &req));
SrsAutoFree(ISrsHttpMessage, req); SrsAutoFree(ISrsHttpMessage, req);
@ -758,7 +758,7 @@ VOID TEST(HTTPServerTest, OPTIONSRead)
MockBufferIO io; MockBufferIO io;
io.append("HTTP/1.1 200 OK\r\n\r\n"); io.append("HTTP/1.1 200 OK\r\n\r\n");
SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_RESPONSE, false)); SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_RESPONSE));
ISrsHttpMessage* req = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &req)); ISrsHttpMessage* req = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &req));
SrsAutoFree(ISrsHttpMessage, req); SrsAutoFree(ISrsHttpMessage, req);
@ -771,7 +771,7 @@ VOID TEST(HTTPServerTest, OPTIONSRead)
MockBufferIO io; MockBufferIO io;
io.append("OPTIONS /rtc/v1/play HTTP/1.1\r\nContent-Length: 5\r\n\r\nHello"); io.append("OPTIONS /rtc/v1/play HTTP/1.1\r\nContent-Length: 5\r\n\r\nHello");
SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST, false)); SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
ISrsHttpMessage* req = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &req)); ISrsHttpMessage* req = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &req));
SrsAutoFree(ISrsHttpMessage, req); SrsAutoFree(ISrsHttpMessage, req);
@ -793,7 +793,7 @@ VOID TEST(HTTPServerTest, OPTIONSRead)
MockBufferIO io; MockBufferIO io;
io.append("OPTIONS /rtc/v1/play HTTP/1.1\r\n\r\n"); io.append("OPTIONS /rtc/v1/play HTTP/1.1\r\n\r\n");
SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST, false)); SrsHttpParser hp; HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
ISrsHttpMessage* req = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &req)); ISrsHttpMessage* req = NULL; HELPER_ASSERT_SUCCESS(hp.parse_message(&io, &req));
SrsAutoFree(ISrsHttpMessage, req); SrsAutoFree(ISrsHttpMessage, req);