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