mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
For #1657, refine code
This commit is contained in:
parent
c3d290013e
commit
2fedb683e8
2 changed files with 59 additions and 45 deletions
|
@ -164,9 +164,6 @@ srs_error_t SrsHttpConn::do_cycle()
|
||||||
// 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
|
||||||
skt->set_recv_timeout(SRS_HTTP_RECV_TIMEOUT);
|
skt->set_recv_timeout(SRS_HTTP_RECV_TIMEOUT);
|
||||||
|
|
||||||
SrsRequest* last_req = NULL;
|
|
||||||
SrsAutoFree(SrsRequest, last_req);
|
|
||||||
|
|
||||||
// initialize parser
|
// initialize parser
|
||||||
if ((err = parser->initialize(HTTP_REQUEST)) != srs_success) {
|
if ((err = parser->initialize(HTTP_REQUEST)) != srs_success) {
|
||||||
|
@ -177,50 +174,12 @@ srs_error_t SrsHttpConn::do_cycle()
|
||||||
if ((err = handler_->on_start()) != srs_success) {
|
if ((err = handler_->on_start()) != srs_success) {
|
||||||
return srs_error_wrap(err, "start");
|
return srs_error_wrap(err, "start");
|
||||||
}
|
}
|
||||||
|
|
||||||
// process http messages.
|
|
||||||
for (int req_id = 0; (err = trd->pull()) == srs_success; req_id++) {
|
|
||||||
// get a http message
|
|
||||||
ISrsHttpMessage* req = NULL;
|
|
||||||
if ((err = parser->parse_message(skt, &req)) != srs_success) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if SUCCESS, always NOT-NULL.
|
|
||||||
// always free it in this scope.
|
|
||||||
srs_assert(req);
|
|
||||||
SrsAutoFree(ISrsHttpMessage, req);
|
|
||||||
|
|
||||||
// Attach owner connection to message.
|
|
||||||
SrsHttpMessage* hreq = (SrsHttpMessage*)req;
|
|
||||||
hreq->set_connection(this);
|
|
||||||
|
|
||||||
// copy request to last request object.
|
|
||||||
srs_freep(last_req);
|
|
||||||
last_req = hreq->to_request(hreq->host());
|
|
||||||
|
|
||||||
// may should discard the body.
|
SrsRequest* last_req = NULL;
|
||||||
SrsHttpResponseWriter writer(skt);
|
SrsAutoFree(SrsRequest, last_req);
|
||||||
if ((err = handler_->on_http_message(req, &writer)) != srs_success) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ok, handle http request.
|
|
||||||
if ((err = process_request(&writer, req)) != srs_success) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// After the request is processed.
|
// process all http messages.
|
||||||
if ((err = handler_->on_message_done(req, &writer)) != srs_success) {
|
err = process_requests(&last_req);
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// donot keep alive, disconnect it.
|
|
||||||
// @see https://github.com/ossrs/srs/issues/399
|
|
||||||
if (!req->is_keep_alive()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
srs_error_t r0 = srs_success;
|
srs_error_t r0 = srs_success;
|
||||||
if ((r0 = on_disconnect(last_req)) != srs_success) {
|
if ((r0 = on_disconnect(last_req)) != srs_success) {
|
||||||
|
@ -231,6 +190,60 @@ srs_error_t SrsHttpConn::do_cycle()
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srs_error_t SrsHttpConn::process_requests(SrsRequest** preq)
|
||||||
|
{
|
||||||
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
for (int req_id = 0; ; req_id++) {
|
||||||
|
if ((err = trd->pull()) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "pull");
|
||||||
|
}
|
||||||
|
|
||||||
|
// get a http message
|
||||||
|
ISrsHttpMessage* req = NULL;
|
||||||
|
if ((err = parser->parse_message(skt, &req)) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "parse message");
|
||||||
|
}
|
||||||
|
|
||||||
|
// if SUCCESS, always NOT-NULL.
|
||||||
|
// always free it in this scope.
|
||||||
|
srs_assert(req);
|
||||||
|
SrsAutoFree(ISrsHttpMessage, req);
|
||||||
|
|
||||||
|
// Attach owner connection to message.
|
||||||
|
SrsHttpMessage* hreq = (SrsHttpMessage*)req;
|
||||||
|
hreq->set_connection(this);
|
||||||
|
|
||||||
|
// copy request to last request object.
|
||||||
|
srs_freep(*preq);
|
||||||
|
*preq = hreq->to_request(hreq->host());
|
||||||
|
|
||||||
|
// may should discard the body.
|
||||||
|
SrsHttpResponseWriter writer(skt);
|
||||||
|
if ((err = handler_->on_http_message(req, &writer)) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "on http message");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ok, handle http request.
|
||||||
|
if ((err = process_request(&writer, req)) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "process request");
|
||||||
|
}
|
||||||
|
|
||||||
|
// After the request is processed.
|
||||||
|
if ((err = handler_->on_message_done(req, &writer)) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "on message done");
|
||||||
|
}
|
||||||
|
|
||||||
|
// donot keep alive, disconnect it.
|
||||||
|
// @see https://github.com/ossrs/srs/issues/399
|
||||||
|
if (!req->is_keep_alive()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
srs_error_t SrsHttpConn::process_request(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
srs_error_t SrsHttpConn::process_request(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
|
@ -118,6 +118,7 @@ public:
|
||||||
virtual srs_error_t cycle();
|
virtual srs_error_t cycle();
|
||||||
private:
|
private:
|
||||||
virtual srs_error_t do_cycle();
|
virtual srs_error_t do_cycle();
|
||||||
|
virtual srs_error_t process_requests(SrsRequest** preq);
|
||||||
private:
|
private:
|
||||||
virtual srs_error_t process_request(ISrsHttpResponseWriter* w, ISrsHttpMessage* r);
|
virtual srs_error_t process_request(ISrsHttpResponseWriter* w, ISrsHttpMessage* r);
|
||||||
// When the connection disconnect, call this method.
|
// When the connection disconnect, call this method.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue