00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef HTTP_HPP
00023 #define HTTP_HPP
00024
00025 #include <string>
00026 #include <boost/shared_array.hpp>
00027 #include <boost/scoped_array.hpp>
00028 #include <boost/date_time/posix_time/posix_time.hpp>
00029 #include <ostream>
00030 #include <istream>
00031 #include <cstring>
00032 #include <sstream>
00033 #include <map>
00034
00035 #include <fastcgi++/exceptions.hpp>
00036 #include <fastcgi++/protocol.hpp>
00037
00039 namespace Fastcgipp
00040 {
00042 namespace Http
00043 {
00045
00056 template<class charT> struct Post
00057 {
00059 enum Type { file, form } type;
00061 std::basic_string<charT> value;
00063 boost::shared_array<char> data;
00065 size_t size;
00066 };
00067
00069
00075 class Address
00076 {
00077 public:
00079
00082 uint32_t getInt() const { return data; }
00084
00087 Address operator=(uint32_t data_) { data=data_; return *this; }
00088 Address operator=(Address address) { data=address.data; return *this; }
00089 Address(const Address& address): data(address.data) { }
00091
00094 Address(uint32_t data_): data(data_) { }
00096 Address(): data(0) { }
00098
00105 void assign(const char* start, const char* end);
00106 private:
00107 friend inline bool operator==(Address x, Address y);
00108 friend inline bool operator>(Address x, Address y);
00109 friend inline bool operator<(Address x, Address y);
00110 friend inline bool operator<=(Address x, Address y);
00111 friend inline bool operator>=(Address x, Address y);
00112 friend inline Address operator&(Address x, Address y);
00113 template<class charT, class Traits> friend std::basic_ostream<charT, Traits>& operator<<(std::basic_ostream<charT, Traits>& os, const Address& address);
00114 template<class charT, class Traits> friend std::basic_istream<charT, Traits>& operator>>(std::basic_istream<charT, Traits>& is, Address& address);
00116 uint32_t data;
00117 };
00118
00120
00124 inline bool operator==(Address x, Address y) { return x.data==y.data; }
00126
00130 inline bool operator>(Address x, Address y) { return x.data>y.data; }
00132
00136 inline bool operator<(Address x, Address y) { return x.data<y.data; }
00138
00142 inline bool operator<=(Address x, Address y) { return x.data<=y.data; }
00144
00148 inline bool operator>=(Address x, Address y) { return x.data>=y.data; }
00150
00153 inline Address operator&(Address x, Address y) { return Address(x.data&y.data); }
00154
00156
00159 template<class charT, class Traits> std::basic_ostream<charT, Traits>& operator<<(std::basic_ostream<charT, Traits>& os, const Address& address);
00161
00165 template<class charT, class Traits> std::basic_istream<charT, Traits>& operator>>(std::basic_istream<charT, Traits>& is, Address& address);
00166
00168
00174 template<class charT>
00175 struct Session
00176 {
00178 std::basic_string<charT> host;
00180 std::basic_string<charT> userAgent;
00182 std::basic_string<charT> acceptContentTypes;
00184 std::basic_string<charT> acceptLanguages;
00186 std::basic_string<charT> acceptCharsets;
00188 std::basic_string<charT> referer;
00190 std::basic_string<charT> contentType;
00192 std::basic_string<charT> queryString;
00194 std::basic_string<charT> cookies;
00196 std::basic_string<charT> root;
00198 std::basic_string<charT> scriptName;
00200 int etag;
00202 int keepAlive;
00204 unsigned int contentLength;
00206 Address serverAddress;
00208 Address remoteAddress;
00210 uint16_t serverPort;
00212 uint16_t remotePort;
00214 boost::posix_time::ptime ifModifiedSince;
00215
00216
00217
00218
00219 typedef std::map<std::basic_string<charT>, Post<charT> > Posts;
00221 Posts posts;
00222
00224
00232 bool fill(const char* data, size_t size);
00234
00243 void fillPosts(const char* data, size_t size);
00244
00246 void clearPostBuffer() { postBuffer.reset(); postBufferSize=0; }
00247
00248 private:
00250 boost::scoped_array<char> boundary;
00252 size_t boundarySize;
00253
00255 boost::scoped_array<char> postBuffer;
00257 size_t postBufferSize;
00258 };
00259
00261
00267 bool charToString(const char* data, size_t size, std::wstring& string);
00269
00275 inline bool charToString(const char* data, size_t size, std::string& string) { string.assign(data, size); return true; }
00277
00287 int atoi(const char* start, const char* end);
00288
00290
00299 template<class charT>
00300 bool parseXmlValue(const char* const name, const char* start, const char* end, std::basic_string<charT>& string);
00301
00303
00313 int percentEscapedToRealBytes(const char* source, char* destination, size_t size);
00314 }
00315 }
00316
00317 #endif