asio 0.3.8rc3 | Home | Reference | Tutorial | Examples | Design

Examples |

# http/server/connection.cpp

Go to the documentation of this file.

    00001 //
    00002 // connection.cpp
    00003 // ~~~~~~~~~~~~~~
    00004 //
    00005 // Copyright (c) 2003-2007 Christopher M. Kohlhoff (chris at kohlhoff dot com)
    00006 //
    00007 // Distributed under the Boost Software License, Version 1.0. (See accompanying
    00008 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
    00009 //
    00010
    00011 #include "connection.hpp"
    00012 #include <vector>
    00013 #include <boost/bind.hpp>
    00014 #include "connection_manager.hpp"
    00015 #include "request_handler.hpp"
    00016
    00017 namespace http {
    00018 namespace server {
    00019
    00020 connection::connection(asio::io_service& io_service,
    00021     connection_manager& manager, request_handler& handler)
    00022   : socket_(io_service),
    00023     connection_manager_(manager),
    00024     request_handler_(handler)
    00025 {
    00026 }
    00027
    00028 asio::ip::tcp::socket& connection::socket()
    00029 {
    00030   return socket_;
    00031 }
    00032
    00033 void connection::start()
    00034 {
    00035   socket_.async_read_some(asio::buffer(buffer_),
    00036       boost::bind(&connection::handle_read, shared_from_this(),
    00037         asio::placeholders::error,
    00038         asio::placeholders::bytes_transferred));
    00039 }
    00040
    00041 void connection::stop()
    00042 {
    00043   socket_.close();
    00044 }
    00045
    00046 void connection::handle_read(const asio::error_code& e,
    00047     std::size_t bytes_transferred)
    00048 {
    00049   if (!e)
    00050   {
    00051     boost::tribool result;
    00052     boost::tie(result, boost::tuples::ignore) = request_parser_.parse(
    00053         request_, buffer_.data(), buffer_.data() + bytes_transferred);
    00054
    00055     if (result)
    00056     {
    00057       request_handler_.handle_request(request_, reply_);
    00058       asio::async_write(socket_, reply_.to_buffers(),
    00059           boost::bind(&connection::handle_write, shared_from_this(),
    00060             asio::placeholders::error));
    00061     }
    00062     else if (!result)
    00063     {
    00064       reply_ = reply::stock_reply(reply::bad_request);
    00065       asio::async_write(socket_, reply_.to_buffers(),
    00066           boost::bind(&connection::handle_write, shared_from_this(),
    00067             asio::placeholders::error));
    00068     }
    00069     else
    00070     {
    00071       socket_.async_read_some(asio::buffer(buffer_),
    00072           boost::bind(&connection::handle_read, shared_from_this(),
    00073             asio::placeholders::error,
    00074             asio::placeholders::bytes_transferred));
    00075     }
    00076   }
    00077   else if (e != asio::error::operation_aborted)
    00078   {
    00079     connection_manager_.stop(shared_from_this());
    00080   }
    00081 }
    00082
    00083 void connection::handle_write(const asio::error_code& e)
    00084 {
    00085   if (e != asio::error::operation_aborted)
    00086   {
    00087     connection_manager_.stop(shared_from_this());
    00088   }
    00089 }
    00090
    00091 } // namespace server
    00092 } // namespace http

asio 0.3.8rc3 | Home | Reference | Tutorial | Examples | Design