00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef _SOCKETS_HTTPSocket_H
00033 #define _SOCKETS_HTTPSocket_H
00034
00035 #include "sockets-config.h"
00036 #include "TcpSocket.h"
00037 #include "Utility.h"
00038
00039
00040 #ifdef SOCKETS_NAMESPACE
00041 namespace SOCKETS_NAMESPACE {
00042 #endif
00043
00047 class HTTPSocket : public TcpSocket
00048 {
00050 typedef Utility::ncmap<std::string> string_m;
00051 public:
00052 HTTPSocket(ISocketHandler& );
00053 ~HTTPSocket();
00054
00055 void OnRawData(const char *buf,size_t len);
00056 void OnLine(const std::string& line);
00057
00060 virtual void OnFirst() = 0;
00064 virtual void OnHeader(const std::string& key,const std::string& value) = 0;
00066 virtual void OnHeaderComplete() = 0;
00068 virtual void OnData(const char *,size_t) = 0;
00070 virtual void OnDataComplete() {}
00071
00073 const std::string& GetMethod() const;
00074
00075 public:
00077 const std::string& GetUrl() const;
00079 const std::string& GetUri() const;
00081 const std::string& GetQueryString() const;
00083 const std::string& GetHttpVersion() const;
00085 const std::string& GetStatus() const;
00087 const std::string& GetStatusText() const;
00089 bool IsRequest() const;
00091 bool IsResponse() const;
00092
00094 void SetHttpVersion(const std::string& x);
00096 void SetStatus(const std::string& x);
00098 void SetStatusText(const std::string& x);
00100 void AddResponseHeader(const std::string& x,const std::string& y);
00102 void AddResponseHeader(const std::string& x,const char *format, ...);
00104 void AppendResponseHeader(const std::string& x,const std::string& y);
00106 bool ResponseHeaderIsSet(const std::string& name) const;
00109 void SendResponse();
00112 void SendRequest();
00113
00115 virtual std::string MyUseragent();
00116
00118 void url_this(const std::string& url_in,std::string& protocol,std::string& host,port_t& port,std::string& url,std::string& file);
00119
00121 bool IsChunked() const { return m_b_chunked; }
00122
00123 protected:
00124 HTTPSocket(const HTTPSocket& s) : TcpSocket(s) {}
00126 virtual void Reset();
00127
00128 void SetMaxHeaderCount(int x) { m_max_header_count = x; }
00129
00131 void SetMethod(const std::string& x);
00133 void SetUrl(const std::string& x);
00135 void SetUri(const std::string& x);
00136
00137 private:
00138 HTTPSocket& operator=(const HTTPSocket& ) { return *this; }
00139 bool m_first;
00140 bool m_header;
00141 std::string m_line;
00142 std::string m_method;
00143 std::string m_url;
00144 std::string m_uri;
00145 std::string m_query_string;
00146 std::string m_http_version;
00147 std::string m_status;
00148 std::string m_status_text;
00149 bool m_request;
00150 bool m_response;
00151 string_m m_response_header;
00152 size_t m_body_size_left;
00153 bool m_b_http_1_1;
00154 bool m_b_keepalive;
00155 std::list<std::pair<std::string, std::string> > m_response_header_append;
00156 bool m_b_chunked;
00157 size_t m_chunk_size;
00158 int m_chunk_state;
00159 std::string m_chunk_line;
00160 int m_header_count;
00161 int m_max_header_count;
00162 };
00163
00164
00165
00166
00167 #ifdef SOCKETS_NAMESPACE
00168 }
00169 #endif
00170
00171 #endif // _SOCKETS_HTTPSocket_H
00172