]> git.tdb.fi Git - libs/net.git/blob - source/http/client.h
d79389a71d09bce9761243a56f255d019a2ddf97
[libs/net.git] / source / http / client.h
1 #ifndef MSP_HTTP_CLIENT_H_
2 #define MSP_HTTP_CLIENT_H_
3
4 #include <memory>
5 #include <string>
6 #include <sigc++/signal.h>
7 #include <msp/io/eventdispatcher.h>
8 #include <msp/net/resolve.h>
9 #include <msp/net/streamsocket.h>
10
11 namespace Msp {
12 namespace Http {
13
14 class Request;
15 class Response;
16
17 class Client
18 {
19 public:
20         sigc::signal<void, const Response &> signal_response_complete;
21         sigc::signal<void, const std::exception &> signal_socket_error;
22
23 private:
24         struct ResolveListener: public sigc::trackable
25         {
26                 Client &client;
27
28                 ResolveListener(Client &);
29
30                 void address_resolved(unsigned, const Net::SockAddr &);
31                 void resolve_failed(unsigned, const std::exception &);
32         };
33
34         std::unique_ptr<Net::StreamSocket> sock;
35         IO::EventDispatcher *event_disp = nullptr;
36         Net::Resolver *resolver = nullptr;
37         std::unique_ptr<ResolveListener> resolve_listener;
38         unsigned resolve_tag = 0;
39         std::string user_agent = "libmspnet/1.0";
40         std::unique_ptr<Request> request;
41         std::unique_ptr<Response> response;
42         std::string in_buf;
43
44         Client(const Client &);
45         Client &operator=(const Client &);
46 public:
47         ~Client();
48
49         void use_event_dispatcher(IO::EventDispatcher *);
50         void use_resolver(Net::Resolver *);
51         void set_user_agent(const std::string &);
52         void start_request(const Request &);
53         const Response *get_url(const std::string &);
54         void tick();
55         void wait_response();
56         void abort();
57         const Request *get_request() const { return request.get(); }
58         const Response *get_response() const { return response.get(); }
59 private:
60         void address_resolved(unsigned, const Net::SockAddr &);
61         void resolve_failed(unsigned, const std::exception &);
62         void connect_finished(const std::exception *);
63         void data_available();
64 };
65
66 } // namespace Http
67 } // namespace Msp
68
69 #endif