00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef REQUEST_HPP
00023 #define REQUEST_HPP
00024
00025 #include <queue>
00026 #include <map>
00027 #include <string>
00028 #include <locale>
00029
00030 #include <boost/shared_array.hpp>
00031 #include <boost/thread.hpp>
00032 #include <boost/function.hpp>
00033
00034 #include <fastcgi++/protocol.hpp>
00035 #include <fastcgi++/exceptions.hpp>
00036 #include <fastcgi++/transceiver.hpp>
00037 #include <fastcgi++/fcgistream.hpp>
00038 #include <fastcgi++/http.hpp>
00039
00041 namespace Fastcgipp
00042 {
00044
00059 template<class charT> class Request
00060 {
00061 public:
00063 Request(): state(Protocol::PARAMS) { setloc(std::locale::classic()); out.exceptions(std::ios_base::badbit | std::ios_base::failbit | std::ios_base::eofbit); session.clearPostBuffer(); }
00064
00065 protected:
00067 Http::Session<charT> session;
00068
00069
00070
00071
00073
00076 Fcgistream<charT, std::char_traits<charT> > out;
00077
00079
00082 Fcgistream<charT, std::char_traits<charT> > err;
00083
00085
00093 virtual bool response() =0;
00094
00096
00106 virtual void inHandler(int bytesReceived) { };
00107
00109 std::locale loc;
00110
00112
00118 Message message;
00119
00121
00130 void setloc(std::locale loc_);
00131
00133
00144 boost::function<void(Message)> callback;
00145 private:
00147
00151 class Messages: public std::queue<Message>, public boost::mutex {};
00153 Messages messages;
00154
00156
00163 bool handler();
00164 template <typename T> friend class Manager;
00166 Transceiver* transceiver;
00168 Protocol::Role role;
00170 Protocol::FullId id;
00172 bool killCon;
00174 Protocol::RecordType state;
00176 void complete();
00178
00187 void set(Protocol::FullId id_, Transceiver& transceiver_, Protocol::Role role_, bool killCon_, boost::function<void(Message)> callback_)
00188 {
00189 killCon=killCon_;
00190 id=id_;
00191 transceiver=&transceiver_;
00192 role=role_;
00193 callback=callback_;
00194
00195 err.set(id_, transceiver_, Protocol::ERR);
00196 out.set(id_, transceiver_, Protocol::OUT);
00197 }
00198 };
00199 }
00200
00201 #endif