00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __PION_HTTPREQUESTREADER_HEADER__
00011 #define __PION_HTTPREQUESTREADER_HEADER__
00012
00013 #include <boost/asio.hpp>
00014 #include <boost/bind.hpp>
00015 #include <boost/function.hpp>
00016 #include <boost/function/function2.hpp>
00017 #include <boost/shared_ptr.hpp>
00018 #include <boost/enable_shared_from_this.hpp>
00019 #include <pion/PionConfig.hpp>
00020 #include <pion/net/HTTPRequest.hpp>
00021 #include <pion/net/HTTPReader.hpp>
00022
00023
00024 namespace pion {
00025 namespace net {
00026
00027
00031 class HTTPRequestReader :
00032 public HTTPReader,
00033 public boost::enable_shared_from_this<HTTPRequestReader>
00034 {
00035
00036 public:
00037
00039 typedef boost::function3<void, HTTPRequestPtr, TCPConnectionPtr,
00040 const boost::system::error_code&> FinishedHandler;
00041
00042
00043
00044 virtual ~HTTPRequestReader() {}
00045
00052 static inline boost::shared_ptr<HTTPRequestReader>
00053 create(TCPConnectionPtr& tcp_conn, FinishedHandler handler)
00054 {
00055 return boost::shared_ptr<HTTPRequestReader>
00056 (new HTTPRequestReader(tcp_conn, handler));
00057 }
00058
00059
00060 protected:
00061
00068 HTTPRequestReader(TCPConnectionPtr& tcp_conn, FinishedHandler handler)
00069 : HTTPReader(true, tcp_conn), m_http_msg(new HTTPRequest),
00070 m_finished(handler)
00071 {
00072 m_http_msg->setRemoteIp(tcp_conn->getRemoteIp());
00073 setLogger(PION_GET_LOGGER("pion.net.HTTPRequestReader"));
00074 }
00075
00077 virtual void readBytes(void) {
00078 getTCPConnection()->async_read_some(boost::bind(&HTTPRequestReader::consumeBytes,
00079 shared_from_this(),
00080 boost::asio::placeholders::error,
00081 boost::asio::placeholders::bytes_transferred));
00082 }
00083
00085 virtual void finishedReading(const boost::system::error_code& ec) {
00086
00087 if (m_finished) m_finished(m_http_msg, getTCPConnection(), ec);
00088 }
00089
00091 virtual HTTPMessage& getMessage(void) { return *m_http_msg; }
00092
00094 HTTPRequestPtr m_http_msg;
00095
00097 FinishedHandler m_finished;
00098 };
00099
00100
00102 typedef boost::shared_ptr<HTTPRequestReader> HTTPRequestReaderPtr;
00103
00104
00105 }
00106 }
00107
00108 #endif