44#include " Poco/Net/HTTPSession.h"
55#include < cstring>
66
7- namespace Poco { namespace Net {
7+ namespace Poco {
8+ namespace Net {
89
910HTTPReactorServer::HTTPReactorServer (int port, HTTPServerParams::Ptr pParams, HTTPRequestHandlerFactory::Ptr pFactory)
1011 : _tcpReactorServer(port, pParams)
1112{
1213 _pParams = pParams;
1314 _pFactory = pFactory;
14- _tcpReactorServer.setRecvMessageCallback ([this ](const TcpReactorConnectionPtr& conn) {
15- // Handle incoming message
16- this ->onMessage (conn);
17- });
15+ _tcpReactorServer.setRecvMessageCallback (
16+ [this ](const TcpReactorConnectionPtr& conn)
17+ {
18+ this ->onMessage (conn);
19+ });
1820}
1921
2022HTTPReactorServer::~HTTPReactorServer ()
@@ -35,16 +37,15 @@ void HTTPReactorServer::onMessage(const TcpReactorConnectionPtr& conn)
3537{
3638 try
3739 {
38- // Handle read event
3940 HTTPReactorServerSession session (conn->socket (), conn->buffer (), _pParams);
4041 if (!session.checkRequestComplete ())
4142 {
4243 return ;
4344 }
44- // Create request and response objects
45+
4546 HTTPServerResponseImpl response (session);
46- HTTPServerRequestImpl request (response, session, _pParams);
47- // Process request and generate response
47+ HTTPServerRequestImpl request (response, session, _pParams);
48+
4849 Poco::Timestamp now;
4950 response.setDate (now);
5051 response.setVersion (request.getVersion ());
@@ -54,6 +55,7 @@ void HTTPReactorServer::onMessage(const TcpReactorConnectionPtr& conn)
5455 {
5556 response.set (" Server" , server);
5657 }
58+
5759 try
5860 {
5961 session.requestTrailer ().clear ();
@@ -66,19 +68,23 @@ void HTTPReactorServer::onMessage(const TcpReactorConnectionPtr& conn)
6668
6769 pHandler->handleRequest (request, response);
6870 session.setKeepAlive (_pParams->getKeepAlive () && response.getKeepAlive ());
71+ session.popCompletedRequest ();
6972 }
7073 else
74+ {
7175 sendErrorResponse (session, HTTPResponse::HTTP_NOT_IMPLEMENTED);
76+ session.popCompletedRequest ();
77+ }
7278 }
7379 catch (Poco::Exception& e)
7480 {
7581 if (!response.sent ())
7682 {
7783 try
7884 {
79- sendErrorResponse (
80- session,
81- e. code () == 0 ? HTTPResponse::HTTP_INTERNAL_SERVER_ERROR : HTTPResponse::HTTPStatus (e. code ()) );
85+ sendErrorResponse (session, e. code () == 0 ? HTTPResponse::HTTP_INTERNAL_SERVER_ERROR
86+ : HTTPResponse::HTTPStatus (e. code ()));
87+ session. popCompletedRequest ( );
8288 }
8389 catch (...)
8490 {
@@ -99,13 +105,14 @@ void HTTPReactorServer::sendErrorResponse(HTTPSession& session, HTTPResponse::HT
99105 response.setVersion (HTTPMessage::HTTP_1_1);
100106 response.setStatusAndReason (status);
101107 response.setKeepAlive (false );
108+ response.setContentLength (0 );
109+ response.send ();
102110
103111 session.setKeepAlive (false );
104112}
105113
106114void HTTPReactorServer::onError (const Poco::Exception& ex)
107115{
108- // Handle error
109116 throw ex;
110117}
111118
0 commit comments