From: Mikko Rasa Date: Tue, 19 Apr 2016 07:34:42 +0000 (+0300) Subject: Use connection keepalive on async responses too X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=09858e5a153b0667b4885da81f6f979a0bf29c36;p=libs%2Fnet.git Use connection keepalive on async responses too --- diff --git a/source/http/server.cpp b/source/http/server.cpp index 9bdfa61..fbacb10 100644 --- a/source/http/server.cpp +++ b/source/http/server.cpp @@ -62,10 +62,7 @@ void Server::submit_response(Response &resp) { Client &cl = get_client_by_response(resp); if(cl.async) - { - cl.sock->write(resp.str()); - cl.stale = true; - } + send_response(cl, *cl.response); } void Server::data_available() @@ -131,11 +128,11 @@ void Server::client_data_available(Client &cl) cl.in_buf.erase(0, len); } - bool keepalive = false; if(cl.request && cl.request->is_complete() && !response) { + cl.keepalive = false; if(cl.request->has_header("Connection")) - keepalive = (cl.request->get_header("Connection")=="keep-alive"); + cl.keepalive = (cl.request->get_header("Connection")=="keep-alive"); response = new Response(NONE); try @@ -166,20 +163,24 @@ void Server::client_data_available(Client &cl) } if(response) + send_response(cl, *response); +} + +void Server::send_response(Client &cl, Response &resp) +{ + cl.sock->write(resp.str()); + cl.async = false; + if(cl.keepalive) { - cl.sock->write(response->str()); - if(keepalive) - { - delete cl.request; - cl.request = 0; - delete cl.response; - cl.response = 0; - } - else - { - cl.sock->shutdown(IO::M_WRITE); - cl.stale = true; - } + delete cl.request; + cl.request = 0; + delete cl.response; + cl.response = 0; + } + else + { + cl.sock->shutdown(IO::M_WRITE); + cl.stale = true; } } @@ -198,6 +199,7 @@ Server::Client::Client(RefPtr s): sock(s), request(0), response(0), + keepalive(false), async(false), stale(false) { } diff --git a/source/http/server.h b/source/http/server.h index 04c2d06..29b2b45 100644 --- a/source/http/server.h +++ b/source/http/server.h @@ -23,6 +23,7 @@ private: std::string in_buf; Request *request; Response *response; + bool keepalive; bool async; bool stale; @@ -46,6 +47,7 @@ public: private: void data_available(); void client_data_available(Client &); + void send_response(Client &, Response &); void client_end_of_file(Client &); Client &get_client_by_response(Response &); };