+#include <msp/core/except.h>
#include <msp/core/refptr.h>
#include <msp/net/resolve.h>
-#include <msp/time/units.h>
+#include <msp/time/timedelta.h>
#include "client.h"
#include "request.h"
#include "response.h"
namespace Msp {
namespace Http {
-Client::Client():
- sock(0),
- event_disp(0),
- resolver(0),
- resolve_listener(0),
- resolve_tag(0),
- user_agent("libmsphttp/0.1"),
- request(0),
- response(0)
-{ }
-
Client::~Client()
{
delete sock;
if(resolver)
{
delete resolve_listener;
- resolve_listener = 0;
+ resolve_listener = nullptr;
}
resolver = r;
void Client::start_request(const Request &r)
{
if(request)
- throw client_busy();
+ throw invalid_state("already processing a request");
delete sock;
- sock = 0;
+ sock = nullptr;
request = new Request(r);
if(!user_agent.empty())
request->set_header("User-Agent", user_agent);
delete response;
- response = 0;
+ response = nullptr;
in_buf.clear();
string host = r.get_header("Host");
signal_response_complete.emit(*response);
delete sock;
- sock = 0;
+ sock = nullptr;
delete request;
- request = 0;
+ request = nullptr;
}
}
void Client::abort()
{
delete sock;
- sock = 0;
+ sock = nullptr;
delete request;
- request = 0;
+ request = nullptr;
}
void Client::address_resolved(unsigned tag, const Net::SockAddr &addr)
return;
resolve_tag = 0;
- signal_socket_error.emit(err);
-
delete request;
- request = 0;
+ request = nullptr;
+
+ if(signal_socket_error.empty())
+ throw err;
+ signal_socket_error.emit(err);
}
void Client::connect_finished(const exception *err)
{
if(err)
{
- signal_socket_error.emit(*err);
-
delete request;
- request = 0;
+ request = nullptr;
+
+ if(signal_socket_error.empty())
+ throw *err;
+ signal_socket_error.emit(*err);
}
else
- sock->write(request->str());
+ {
+ try
+ {
+ sock->write(request->str());
+ }
+ catch(const exception &e)
+ {
+ if(signal_socket_error.empty())
+ throw;
+ signal_socket_error.emit(e);
+ return;
+ }
+ }
}
void Client::data_available()
}
catch(const exception &e)
{
+ if(signal_socket_error.empty())
+ throw;
signal_socket_error.emit(e);
return;
}
signal_response_complete.emit(*response);
delete request;
- request = 0;
+ request = nullptr;
}
}