]> git.tdb.fi Git - libs/net.git/blob - source/http/server.h
Add a dynamic receiver class for more flexible packet handling
[libs/net.git] / source / http / server.h
1 #ifndef MSP_HTTP_SERVER_H_
2 #define MSP_HTTP_SERVER_H_
3
4 #include <msp/io/eventdispatcher.h>
5 #include <msp/net/mspnet_api.h>
6 #include <msp/net/streamserversocket.h>
7 #include <msp/time/timedelta.h>
8
9 namespace Msp {
10 namespace Http {
11
12 class Request;
13 class Response;
14
15 class MSPNET_API Server
16 {
17 public:
18         sigc::signal<void, const Request &, Response &> signal_request;
19
20 private:
21         struct Client
22         {
23                 std::unique_ptr<Net::StreamSocket> sock;
24                 std::string in_buf;
25                 std::unique_ptr<Request> request;
26                 std::unique_ptr<Response> response;
27                 bool keepalive = false;
28                 bool async = false;
29                 bool stale = false;
30
31                 Client(std::unique_ptr<Net::StreamSocket>);
32         };
33
34         Net::StreamServerSocket sock;
35         std::list<Client> clients;
36         std::map<Response *, Client *> responses;
37         IO::EventDispatcher *event_disp = nullptr;
38
39 public:
40         Server();
41         Server(unsigned);
42         ~Server();
43
44         void listen(unsigned);
45         unsigned get_port() const;
46         void use_event_dispatcher(IO::EventDispatcher *);
47         void delay_response(Response &);
48         void submit_response(Response &);
49         void cancel_keepalive(Response &);
50         void close_connections(const Time::TimeDelta &);
51 private:
52         void data_available();
53         void client_data_available(Client &);
54         void send_response(Client &, Response &);
55         void client_end_of_file(Client &);
56         Client &get_client_by_response(Response &);
57 };
58
59 } // namespace Http
60 } // namespace Msp
61
62 #endif