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