-/* $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>
{
if(event_disp && sock)
event_disp->remove(*sock);
- event_disp=ed;
+ event_disp = ed;
if(event_disp && sock)
event_disp->add(*sock);
}
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));
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();
}
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())
signal_response_complete.emit(*response);
delete sock;
- sock=0;
+ sock = 0;
delete request;
- request=0;
+ request = 0;
}
}
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());
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);
}
{
signal_response_complete.emit(*response);
- sock->close();
delete request;
- request=0;
+ request = 0;
}
}