#ifndef HTTP_CONNECTION_H #define HTTP_CONNECTION_H #include #include #include #include #include #include #include using boost::asio::ip::tcp; #include namespace fs = boost::filesystem; #include namespace HTTP { class Connection : public boost::enable_shared_from_this { friend class Server; public: typedef boost::shared_ptr p; typedef boost::function Handler; typedef std::list PathList; //! Request method. std::string method; //! Request path. PathList path; //! Base path. PathList base_path; //! Pop topmost element of path and add to base_path. std::string pop_path_base(); //! Request arguments. std::map args; //! Request version. std::string version; //! Request headers. std::map headers; //! Send error. void send_error(int code); //! Add response header. void add_header(std::string key, std::string value); //! Send data. void send_data(const std::string& data); void send_data(const void* data, std::size_t size); void send_data(std::istream& stream); //! Send file. void send_file(const fs::path& filename); private: typedef std::vector > HeaderList; //! Constructor. Connection(boost::asio::io_service& io_service); //! Start reading the request headers. void read_request(Handler callback); void handle_write(const boost::system::error_code& error, size_t bytes_transferred); void handle_read(const boost::system::error_code& error, size_t bytes_transferred, Handler callback); tcp::socket socket; boost::asio::streambuf buf; //! Response headers. HeaderList response_headers; //! Parse request headers. bool parse_request(boost::asio::streambuf& buf); //! Write response headers. void write_headers(int code = 200); //! Response headers written? bool headers_written; }; typedef Connection::Handler Handler; }; #endif