http_server.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _HTTP_SERVER_H_
00023 #define _HTTP_SERVER_H_
00024
00025 #include <map>
00026 #include <string>
00027 #include <sstream>
00028
00029 #include <dcl/delegate.h>
00030 #include <dcl/http_header.h>
00031 #include <dcl/mutex.h>
00032 #include <dcl/tcp_server.h>
00033
00034 namespace dbp {
00035
00037
00040 class http_server: public tcp_server {
00041 public:
00043 typedef delegate1<const http_request&, http_response> on_request_handler;
00045 http_server(size_t worker_threads = 2, size_t queue_size = 32768);
00047 virtual ~http_server() { }
00049 void on_request(on_request_handler handler) {
00050 request_handler = handler;
00051 }
00052 protected:
00053 void on_process_data(on_process_data_handler handler) {
00054 tcp_server::on_process_data(handler);
00055 }
00056 private:
00057
00058 struct request {
00059 enum states {
00060 WAIT_COMMAND,
00061 WAIT_HEADER,
00062 RECEIVING_DATA,
00063 PROCESS_REQUEST,
00064 CLOSING
00065 };
00066 request(): state(WAIT_COMMAND), data_size(0), data_readed(0) { }
00067 states state;
00068 size_t data_size;
00069 size_t data_readed;
00070 http_request req;
00071 };
00072 typedef std::map<int, request*> requests;
00073 requests reqs;
00074 mutex lock;
00075
00076 on_request_handler request_handler;
00077
00078 bool process_data(const socket&, std::istream&, std::ostream&);
00079 };
00080
00081 }
00082
00083 #endif