#include "http_connection.h" #include "http.h" #include #include HTTP::Connection::Connection(boost::asio::io_service& io_service) : socket(io_service) { } void HTTP::Connection::handle_write(const boost::system::error_code& error, size_t bytes_transferred) { } void HTTP::Connection::handle_read(const boost::system::error_code& error, size_t bytes_transferred, Handler callback) { if(!parse_request(buf)) { // Request parse error. std::cout << "Request parse error." << std::endl; send_error(400, "Bad Request"); return; } std::cout << "Path: " << std::endl; for(PathList::iterator it = path.begin(); it != path.end(); it++) { std::cout << " " << *it << std::endl; } std::cout << "Args: " << std::endl; for(std::map::iterator it = args.begin(); it != args.end(); it++) { std::cout << " " << it->first << " = " << it->second << std::endl; } std::cout << "Headers: " << std::endl; for(std::map::iterator it = headers.begin(); it != headers.end(); it++) { std::cout << " " << it->first << " = " << it->second << std::endl; } callback(shared_from_this()); } void print(char c) { std::cout << "Char: " << int(c) << std::endl; } void HTTP::Connection::read_request(Handler callback) { boost::asio::async_read_until(socket, buf, "\r\n\r\n", boost::bind(&Connection::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, callback)); } std::string HTTP::Connection::pop_path_base() { if(!path.size()) { return ""; } base_path.push_back(path.front()); path.pop_front(); return base_path.back(); } void HTTP::Connection::send_error(int code, std::string name) { boost::asio::write(socket, boost::asio::buffer(boost::str(boost::format("HTTP/1.1 %1$d %2$s\r\n\r\n

%1$d %2$s

") % code % name))); }