]> git.tdb.fi Git - libs/net.git/blobdiff - source/http/server.cpp
Reject requests with a relative path
[libs/net.git] / source / http / server.cpp
index b18ed4c76b02dec85572e41cfecac26f2f186852..ed3a2b9288339830ee89f0b56585960ddb24d398 100644 (file)
@@ -106,6 +106,11 @@ void Server::client_data_available(Client &cl)
                                        response = new Response(NOT_IMPLEMENTED);
                                        response->add_content("Method not implemented\n");
                                }
+                               else if(cl.request->get_path()[0]!='/')
+                               {
+                                       response = new Response(BAD_REQUEST);
+                                       response->add_content("Path must be absolute\n");
+                               }
                        }
                        catch(const exception &e)
                        {
@@ -121,8 +126,12 @@ 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
                {
@@ -154,7 +163,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;
+               }
        }
 }