X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fhttp%2Fserver.cpp;h=e0b34b382e8a9d86e0a9c0a862a2a9250fa2220a;hb=0165ed331051ae7fc64dfe85dd7ab8f5b11ba919;hp=9205cc1096383caa797f1af237ec9e02e1b07724;hpb=debe1004676d5431e571d9c4361072661dcc88c4;p=libs%2Fnet.git diff --git a/source/http/server.cpp b/source/http/server.cpp index 9205cc1..e0b34b3 100644 --- a/source/http/server.cpp +++ b/source/http/server.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -83,6 +84,8 @@ void Server::client_data_available(Client &cl) char rbuf[4096]; unsigned len = cl.sock->read(rbuf, sizeof(rbuf)); + if(cl.stale) + return; cl.in_buf.append(rbuf, len); RefPtr response; @@ -118,17 +121,23 @@ void Server::client_data_available(Client &cl) cl.in_buf.erase(0, len); } + bool keepalive = false; if(cl.request && cl.request->is_complete() && !response) { + if(cl.request->has_header("Connection")) + keepalive = (cl.request->get_header("Connection")=="keep-alive"); + response = new Response(NONE); try { cl.response = response.get(); + responses[cl.response] = &cl; signal_request.emit(*cl.request, *response); if(cl.async) response.release(); else { + responses.erase(cl.response); cl.response = 0; if(response->get_status()==NONE) { @@ -139,6 +148,7 @@ void Server::client_data_available(Client &cl) } catch(const exception &e) { + responses.erase(cl.response); cl.response = 0; response = new Response(INTERNAL_ERROR); response->add_content(e.what()); @@ -148,7 +158,18 @@ void Server::client_data_available(Client &cl) if(response) { cl.sock->write(response->str()); - cl.stale = true; + if(keepalive) + { + delete cl.request; + cl.request = 0; + delete cl.response; + cl.response = 0; + } + else + { + cl.sock->shutdown(IO::M_WRITE); + cl.stale = true; + } } } @@ -159,12 +180,7 @@ void Server::client_end_of_file(Client &cl) Server::Client &Server::get_client_by_response(Response &resp) { - for(list::iterator i=clients.begin(); i!=clients.end(); ++i) - if(i->response==&resp) - return *i; - - // XXX Do this differently - throw invalid_argument("Response does not belong to any client"); + return *get_item(responses, &resp); }