X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fhttp%2Fclient.h;h=b1f097d8852a4517c501a7d996ee077a97e753fc;hb=HEAD;hp=37acf0cfe0e3bb08d1483520e9a3cd7bc557dc76;hpb=6af1bfce6dc53104c5406adef32d186384525ae3;p=libs%2Fnet.git diff --git a/source/http/client.h b/source/http/client.h index 37acf0c..b1f097d 100644 --- a/source/http/client.h +++ b/source/http/client.h @@ -1,54 +1,63 @@ #ifndef MSP_HTTP_CLIENT_H_ #define MSP_HTTP_CLIENT_H_ +#include #include #include #include +#include +#include #include namespace Msp { namespace Http { -class client_busy: public std::logic_error -{ -public: - client_busy(): std::logic_error(std::string()) { } - virtual ~client_busy() throw() { } -}; - class Request; class Response; -class Client +class MSPNET_API Client { public: sigc::signal signal_response_complete; sigc::signal signal_socket_error; private: - Net::StreamSocket *sock; - IO::EventDispatcher *event_disp; - std::string user_agent; - Request *request; - Response *response; + struct ResolveListener: public sigc::trackable + { + Client &client; + + ResolveListener(Client &); + + void address_resolved(unsigned, const Net::SockAddr &); + void resolve_failed(unsigned, const std::exception &); + }; + + std::unique_ptr sock; + IO::EventDispatcher *event_disp = nullptr; + Net::Resolver *resolver = nullptr; + std::unique_ptr resolve_listener; + unsigned resolve_tag = 0; + std::string user_agent = "libmspnet/1.0"; + std::unique_ptr request; + std::unique_ptr response; std::string in_buf; - Client(const Client &); - Client &operator=(const Client &); public: - Client(); ~Client(); void use_event_dispatcher(IO::EventDispatcher *); + void use_resolver(Net::Resolver *); void set_user_agent(const std::string &); void start_request(const Request &); const Response *get_url(const std::string &); void tick(); void wait_response(); void abort(); - const Request *get_request() const { return request; } - const Response *get_response() const { return response; } + const Request *get_request() const { return request.get(); } + const Response *get_response() const { return response.get(); } private: + void address_resolved(unsigned, const Net::SockAddr &); + void resolve_failed(unsigned, const std::exception &); void connect_finished(const std::exception *); void data_available(); };