X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fhttp%2Fclient.cpp;h=6f221810c922a78f85289934b36ce4d6b71b2100;hb=HEAD;hp=da6b25ebc17ef4c6fc0234704e4b80ad73f40b84;hpb=6ed443a30ab510d3365bbc879cd27aef36f173ca;p=libs%2Fnet.git diff --git a/source/http/client.cpp b/source/http/client.cpp index da6b25e..1c4c953 100644 --- a/source/http/client.cpp +++ b/source/http/client.cpp @@ -1,7 +1,7 @@ -#include +#include "client.h" +#include #include #include -#include "client.h" #include "request.h" #include "response.h" @@ -10,22 +10,8 @@ using namespace std; 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; - delete request; - delete response; } void Client::use_event_dispatcher(IO::EventDispatcher *ed) @@ -40,30 +26,25 @@ void Client::use_event_dispatcher(IO::EventDispatcher *ed) void Client::use_resolver(Net::Resolver *r) { if(resolver) - { - delete resolve_listener; - resolve_listener = 0; - } + resolve_listener.reset(); resolver = r; if(resolver) - resolve_listener = new ResolveListener(*this); + resolve_listener = make_unique(*this); } void Client::start_request(const Request &r) { if(request) - throw client_busy(); + throw invalid_state("already processing a request"); - delete sock; - sock = 0; + sock.reset(); - request = new Request(r); + request = make_unique(r); if(!user_agent.empty()) request->set_header("User-Agent", user_agent); - delete response; - response = 0; + response.reset(); in_buf.clear(); string host = r.get_header("Host"); @@ -73,7 +54,7 @@ void Client::start_request(const Request &r) resolve_tag = resolver->resolve(host); else { - RefPtr addr = Net::resolve(host); + unique_ptr addr(Net::resolve(host)); address_resolved(resolve_tag, *addr); } } @@ -82,7 +63,7 @@ const Response *Client::get_url(const std::string &url) { start_request(Request::from_url(url)); wait_response(); - return response; + return response.get(); } void Client::tick() @@ -97,10 +78,8 @@ void Client::tick() { signal_response_complete.emit(*response); - delete sock; - sock = 0; - delete request; - request = 0; + sock.reset(); + request.reset(); } } @@ -112,10 +91,8 @@ void Client::wait_response() void Client::abort() { - delete sock; - sock = 0; - delete request; - request = 0; + sock.reset(); + request.reset(); } void Client::address_resolved(unsigned tag, const Net::SockAddr &addr) @@ -124,7 +101,7 @@ void Client::address_resolved(unsigned tag, const Net::SockAddr &addr) return; resolve_tag = 0; - sock = new Net::StreamSocket(addr.get_family()); + sock = make_unique(addr.get_family()); sock->set_block(false); sock->signal_data_available.connect(sigc::mem_fun(this, &Client::data_available)); @@ -141,23 +118,37 @@ void Client::resolve_failed(unsigned tag, const exception &err) return; resolve_tag = 0; - signal_socket_error.emit(err); + request.reset(); - delete request; - request = 0; + 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); + request.reset(); - delete request; - request = 0; + 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() @@ -170,6 +161,8 @@ void Client::data_available() } catch(const exception &e) { + if(signal_socket_error.empty()) + throw; signal_socket_error.emit(e); return; } @@ -182,7 +175,7 @@ void Client::data_available() { 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 = make_unique(Response::parse(in_buf)); response->set_user_data(request->get_user_data()); in_buf = string(); } @@ -197,8 +190,7 @@ void Client::data_available() { signal_response_complete.emit(*response); - delete request; - request = 0; + request.reset(); } }