00001 #include "server.hpp"
00002 #include <boost/bind.hpp>
00003
00004 namespace http {
00005 namespace server {
00006
00007 server::server(const std::string& address, const std::string& port,
00008 const std::string& doc_root)
00009 : io_service_(),
00010 acceptor_(io_service_),
00011 connection_manager_(),
00012 new_connection_(new connection(io_service_,
00013 connection_manager_, request_handler_)),
00014 request_handler_(doc_root)
00015 {
00016
00017 boost::asio::ip::tcp::resolver resolver(io_service_);
00018 boost::asio::ip::tcp::resolver::query query(address, port);
00019 boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
00020 acceptor_.open(endpoint.protocol());
00021 acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
00022 acceptor_.bind(endpoint);
00023 acceptor_.listen();
00024 acceptor_.async_accept(new_connection_->socket(),
00025 boost::bind(&server::handle_accept, this,
00026 boost::asio::placeholders::error));
00027 }
00028
00029 void server::run()
00030 {
00031
00032
00033
00034
00035 io_service_.run();
00036 }
00037
00038 void server::stop()
00039 {
00040
00041
00042 io_service_.post(boost::bind(&server::handle_stop, this));
00043 }
00044
00045 void server::handle_accept(const boost::asio::error& e)
00046 {
00047 if (!e)
00048 {
00049 connection_manager_.start(new_connection_);
00050 new_connection_.reset(new connection(io_service_,
00051 connection_manager_, request_handler_));
00052 acceptor_.async_accept(new_connection_->socket(),
00053 boost::bind(&server::handle_accept, this,
00054 boost::asio::placeholders::error));
00055 }
00056 }
00057
00058 void server::handle_stop()
00059 {
00060
00061
00062
00063 acceptor_.close();
00064 connection_manager_.stop_all();
00065 }
00066
00067 }
00068 }