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();
00075 void SetMethod(const std::string& x);
00077 const std::string& GetUrl();
00079 void SetUrl(const std::string& x);
00081 const std::string& GetUri();
00083 void SetUri(const std::string& x);
00085 const std::string& GetQueryString();
00087 const std::string& GetHttpVersion();
00089 const std::string& GetStatus();
00091 const std::string& GetStatusText();
00093 bool IsRequest();
00095 bool IsResponse();
00097 void SetHttpVersion(const std::string& x);
00099 void SetStatus(const std::string& x);
00101 void SetStatusText(const std::string& x);
00103 void AddResponseHeader(const std::string& x,const std::string& y);
00105 void AddResponseHeader(const std::string& x,const char *format, ...);
00107 void AppendResponseHeader(const std::string& x,const std::string& y);
00109 bool ResponseHeaderIsSet(const std::string& name);
00112 void SendResponse();
00115 void SendRequest();
00116
00118 virtual std::string MyUseragent();
00119
00121 void url_this(const std::string& url_in,std::string& protocol,std::string& host,port_t& port,std::string& url,std::string& file);
00122
00124 bool IsChunked() { return m_b_chunked; }
00125
00126 protected:
00127 HTTPSocket(const HTTPSocket& s) : TcpSocket(s) {}
00129 virtual void Reset();
00130
00131 void SetMaxHeaderCount(int x) { m_max_header_count = x; }
00132
00133 private:
00134 HTTPSocket& operator=(const HTTPSocket& ) { return *this; }
00135 bool m_first;
00136 bool m_header;
00137 std::string m_line;
00138 std::string m_method;
00139 std::string m_url;
00140 std::string m_uri;
00141 std::string m_query_string;
00142 std::string m_http_version;
00143 std::string m_status;
00144 std::string m_status_text;
00145 bool m_request;
00146 bool m_response;
00147 string_m m_response_header;
00148 size_t m_body_size_left;
00149 bool m_b_http_1_1;
00150 bool m_b_keepalive;
00151 std::list<std::pair<std::string, std::string> > m_response_header_append;
00152 bool m_b_chunked;
00153 size_t m_chunk_size;
00154 int m_chunk_state;
00155 std::string m_chunk_line;
00156 int m_header_count;
00157 int m_max_header_count;
00158 };
00159
00160
00161
00162
00163 #ifdef SOCKETS_NAMESPACE
00164 }
00165 #endif
00166
00167 #endif // _SOCKETS_HTTPSocket_H
00168