]> git.tdb.fi Git - libs/net.git/blobdiff - source/client.cpp
Exception changes
[libs/net.git] / source / client.cpp
index be579184fa98e62a71d7ea3d09d5c247907fa16f..0729544a7ce0686754f721e8e6dee3e30cd7c40e 100644 (file)
@@ -1,10 +1,3 @@
-/* $Id$
-
-This file is part of libmsphttp
-Copyright © 2008  Mikkosoft Productions, Mikko Rasa
-Distributed under the LGPL
-*/
-
 #include <msp/core/except.h>
 #include <msp/core/refptr.h>
 #include <msp/net/resolve.h>
@@ -37,7 +30,7 @@ void Client::use_event_dispatcher(IO::EventDispatcher *ed)
 {
        if(event_disp && sock)
                event_disp->remove(*sock);
-       event_disp=ed;
+       event_disp = ed;
        if(event_disp && sock)
                event_disp->add(*sock);
 }
@@ -47,13 +40,13 @@ void Client::start_request(const Request &r)
        if(request)
                throw InvalidState("Already processing a request");
 
-       string host=r.get_header("Host");
+       string host = r.get_header("Host");
        if(host.find(':')==string::npos)
-               host+=":80";
-       RefPtr<Net::SockAddr> addr=Net::resolve(host);
+               host += ":80";
+       RefPtr<Net::SockAddr> addr = Net::resolve(host);
 
        delete sock;
-       sock=new Net::StreamSocket(addr->get_family());
+       sock = new Net::StreamSocket(addr->get_family());
        sock->set_block(false);
 
        sock->signal_data_available.connect(sigc::mem_fun(this, &Client::data_available));
@@ -63,12 +56,12 @@ void Client::start_request(const Request &r)
 
        sock->connect(*addr);
 
-       request=new Request(r);
+       request = new Request(r);
        if(!user_agent.empty())
                request->set_header("User-Agent", user_agent);
 
        delete response;
-       response=0;
+       response = 0;
        in_buf.clear();
 }
 
@@ -84,7 +77,7 @@ void Client::tick()
        if(!request)
                return;
 
-       while(IO::PollEvent ev=IO::poll(*sock, sock->get_events(), Time::zero))
+       while(IO::PollEvent ev = IO::poll(*sock, sock->get_events(), Time::zero))
                sock->event(ev);
 
        if(response && response->is_complete())
@@ -92,9 +85,9 @@ void Client::tick()
                signal_response_complete.emit(*response);
 
                delete sock;
-               sock=0;
+               sock = 0;
                delete request;
-               request=0;
+               request = 0;
        }
 }
 
@@ -107,20 +100,19 @@ void Client::wait_response()
 void Client::abort()
 {
        delete sock;
-       sock=0;
+       sock = 0;
        delete request;
-       request=0;
+       request = 0;
 }
 
-void Client::connect_finished(int err)
+void Client::connect_finished(const exception *err)
 {
        if(err)
        {
                signal_socket_error.emit(err);
 
-               sock->close();
                delete request;
-               request=0;
+               request = 0;
        }
        else
                sock->write(request->str());
@@ -129,21 +121,33 @@ void Client::connect_finished(int err)
 void Client::data_available()
 {
        char rbuf[4096];
-       unsigned len=sock->read(rbuf, sizeof(rbuf));
+       unsigned len;
+       try
+       {
+               len = sock->read(rbuf, sizeof(rbuf));
+       }
+       catch(const exception &e)
+       {
+               signal_socket_error.emit(&e);
+               return;
+       }
+
+       if(!len)
+               return;
        in_buf.append(rbuf, len);
 
        if(!response)
        {
                if(in_buf.find("\r\n\r\n")!=string::npos || in_buf.find("\n\n")!=string::npos)
                {
-                       response=new Response(Response::parse(in_buf));
+                       response = new Response(Response::parse(in_buf));
                        response->set_user_data(request->get_user_data());
-                       in_buf=string();
+                       in_buf = string();
                }
        }
        else
        {
-               len=response->parse_content(in_buf);
+               len = response->parse_content(in_buf);
                in_buf.erase(0, len);
        }
 
@@ -151,9 +155,8 @@ void Client::data_available()
        {
                signal_response_complete.emit(*response);
 
-               sock->close();
                delete request;
-               request=0;
+               request = 0;
        }
 }