http.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. // Tencent is pleased to support the open source community by making Mars available.
  2. // Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
  3. // Licensed under the MIT License (the "License"); you may not use this file except in
  4. // compliance with the License. You may obtain a copy of the License at
  5. // http://opensource.org/licenses/MIT
  6. // Unless required by applicable law or agreed to in writing, software distributed under the License is
  7. // distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
  8. // either express or implied. See the License for the specific language governing permissions and
  9. // limitations under the License.
  10. /*
  11. * HttpRequest.h
  12. *
  13. * Created on: 2013-12-5
  14. * Author: yerungui
  15. */
  16. #ifndef HTTP_H_
  17. #define HTTP_H_
  18. #include <string>
  19. #include <map>
  20. #include "autobuffer.h"
  21. namespace http {
  22. struct less {
  23. bool operator()(const std::string& __x, const std::string& __y) const;
  24. };
  25. enum THttpVersion {
  26. kVersion_0_9,
  27. kVersion_1_0,
  28. kVersion_1_1,
  29. kVersion_2_0,
  30. kVersion_Unknow,
  31. };
  32. const char* const kHttpVersionString[] = {
  33. "HTTP/0.9",
  34. "HTTP/1.0",
  35. "HTTP/1.1",
  36. "HTTP/2",
  37. "version_unknown",
  38. };
  39. enum TCsMode {
  40. kRequest,
  41. kRespond,
  42. };
  43. class RequestLine {
  44. public:
  45. enum THttpMethod {
  46. kUnknown = 0,
  47. kGet,
  48. kPost,
  49. kOptions,
  50. kHead,
  51. kPut,
  52. kDelete,
  53. kTrace,
  54. kConnect,
  55. kMax,
  56. };
  57. static const char* const kHttpMethodString[kMax];
  58. public:
  59. RequestLine();
  60. RequestLine(THttpMethod _httpMethod, const char* _url, THttpVersion _httpVersion);
  61. // RequestLine(const RequestLine&);
  62. // RequestLine& operator=(const RequestLine&);
  63. public:
  64. void Method(THttpMethod _method);
  65. THttpMethod Method() const;
  66. void Version(THttpVersion _version);
  67. THttpVersion Version() const;
  68. void Url(const std::string& _url);
  69. std::string Url() const;
  70. std::string ToString() const;
  71. bool FromString(const std::string& _requestline);
  72. private:
  73. THttpMethod http_method_;
  74. std::string req_url_;
  75. THttpVersion http_version_;
  76. };
  77. class StatusLine {
  78. public:
  79. StatusLine();
  80. StatusLine(THttpVersion _httpversion, int _statuscode, const std::string& _reasonphrase);
  81. // StatusLine(const StatusLine&);
  82. // StatusLine& operator=(const StatusLine&);
  83. public:
  84. void Version(THttpVersion _version);
  85. THttpVersion Version() const;
  86. void StatusCode(int _statuscode);
  87. int StatusCode() const;
  88. void ReasonPhrase(const std::string& _reasonphrase);
  89. std::string ReasonPhrase() const;
  90. std::string ToString() const;
  91. bool FromString(const std::string& _statusline);
  92. private:
  93. THttpVersion http_version_;
  94. int statuscode_;
  95. std::string reason_phrase_;
  96. };
  97. class HeaderFields {
  98. public:
  99. // HeaderFields(const HeaderFields&);
  100. // HeaderFields& operator=(const HeaderFields&);
  101. public:
  102. static std::pair<const std::string, std::string> MakeContentLength(int _len);
  103. static std::pair<const std::string, std::string> MakeTransferEncodingChunked();
  104. static std::pair<const std::string, std::string> MakeConnectionClose();
  105. static std::pair<const std::string, std::string> MakeConnectionKeepalive();
  106. static std::pair<const std::string, std::string> MakeAcceptAll();
  107. static std::pair<const std::string, std::string> MakeAcceptEncodingDefalte();
  108. static std::pair<const std::string, std::string> MakeAcceptEncodingGzip();
  109. static std::pair<const std::string, std::string> MakeCacheControlNoCache();
  110. static std::pair<const std::string, std::string> MakeContentTypeOctetStream();
  111. static const char* const KStringHost;
  112. static const char* const KStringAccept;
  113. static const char* const KStringUserAgent;
  114. static const char* const KStringCacheControl;
  115. static const char* const KStringConnection;
  116. static const char* const kStringProxyConnection;
  117. static const char* const kStringProxyAuthorization;
  118. static const char* const KStringContentType;
  119. static const char* const KStringContentLength;
  120. static const char* const KStringTransferEncoding;
  121. static const char* const kStringContentEncoding;
  122. static const char* const KStringAcceptEncoding;
  123. static const char* const KStringContentRange;
  124. static const char* const KStringMicroMessenger;
  125. static const char* const KStringRange;
  126. static const char* const KStringLocation;
  127. static const char* const KStringReferer;
  128. void HeaderFiled(const char* _name, const char* _value);
  129. void HeaderFiled(const std::pair<const std::string, std::string>& _headerfield);
  130. void HeaderFiled(const HeaderFields& _headerfields);
  131. const char* HeaderField(const char* _key) const;
  132. std::map<const std::string, std::string, less>& GetHeaders() {return headers_;}
  133. bool IsTransferEncodingChunked();
  134. int ContentLength();
  135. bool ContentRange(int* start, int* end, int* total);
  136. const std::string ToString() const;
  137. private:
  138. std::map<const std::string, std::string, less> headers_;
  139. };
  140. class IBlockBodyProvider {
  141. public:
  142. virtual ~IBlockBodyProvider() {}
  143. virtual bool Data(AutoBuffer& _body) = 0;
  144. virtual bool FillData(AutoBuffer& _body) = 0;
  145. virtual size_t Length() const = 0;
  146. };
  147. class BufferBodyProvider : public IBlockBodyProvider {
  148. public:
  149. bool Data(AutoBuffer& _body) {
  150. if (!buffer_.Ptr()) return false;
  151. _body.Write(buffer_.Ptr(), buffer_.Length());
  152. buffer_.Reset();
  153. return true;
  154. }
  155. bool FillData(AutoBuffer& _body) {
  156. if (!buffer_.Ptr()) return false;
  157. _body.Write(buffer_.Ptr(), buffer_.Length());
  158. buffer_.Reset();
  159. return true;
  160. }
  161. size_t Length() const {return buffer_.Length();}
  162. AutoBuffer& Buffer() {return buffer_;}
  163. private:
  164. AutoBuffer buffer_;
  165. };
  166. class IStreamBodyProvider {
  167. public:
  168. virtual ~IStreamBodyProvider() {}
  169. virtual bool HaveData() const = 0;
  170. virtual bool Data(AutoBuffer& _body) = 0;
  171. virtual bool Eof() const = 0;
  172. const char* EofData();
  173. protected:
  174. static void AppendHeader(AutoBuffer& _body, size_t _length);
  175. static void AppendTail(AutoBuffer& _body);
  176. };
  177. class Builder {
  178. public:
  179. Builder(TCsMode _csmode);
  180. ~Builder();
  181. private:
  182. Builder(const Builder&);
  183. Builder& operator=(const Builder&);
  184. public:
  185. RequestLine& Request();
  186. StatusLine& Status();
  187. const RequestLine& Request() const;
  188. const StatusLine& Status() const;
  189. HeaderFields& Fields();
  190. const HeaderFields& Fields() const;
  191. void BlockBody(IBlockBodyProvider* _body, bool _manage);
  192. void StreamBody(IStreamBodyProvider* _body, bool _manage);
  193. IBlockBodyProvider* BlockBody();
  194. IStreamBodyProvider* StreamBody();
  195. const IBlockBodyProvider* BlockBody() const;
  196. const IStreamBodyProvider* StreamBody() const;
  197. bool HeaderToBuffer(AutoBuffer& _header);
  198. bool HttpToBuffer(AutoBuffer& _http);
  199. private:
  200. TCsMode csmode_;
  201. StatusLine statusline_;
  202. RequestLine requestline_;
  203. HeaderFields headfields_;
  204. IBlockBodyProvider* blockbody_;
  205. IStreamBodyProvider* streambody_;
  206. bool is_manage_body_;
  207. };
  208. class BodyReceiver {
  209. public:
  210. BodyReceiver(): total_length_(0) {}
  211. virtual ~BodyReceiver() {}
  212. virtual void AppendData(const void* _body, size_t _length) { total_length_ += _length;}
  213. virtual void EndData() {}
  214. size_t Length() const {return total_length_;}
  215. private:
  216. size_t total_length_;
  217. };
  218. class MemoryBodyReceiver : public BodyReceiver {
  219. public:
  220. MemoryBodyReceiver(AutoBuffer& _buf)
  221. : body_(_buf) {}
  222. virtual void AppendData(const void* _body, size_t _length) {
  223. BodyReceiver::AppendData(_body, _length);
  224. body_.Write(_body, _length);
  225. }
  226. virtual void EndData() {}
  227. private:
  228. AutoBuffer& body_;
  229. };
  230. class Parser {
  231. public:
  232. enum TRecvStatus {
  233. kStart,
  234. kFirstLine,
  235. kFirstLineError,
  236. kHeaderFields,
  237. kHeaderFieldsError,
  238. kBody,
  239. kBodyError,
  240. kEnd,
  241. };
  242. public:
  243. Parser(BodyReceiver* _body = new BodyReceiver(), bool _manage = true);
  244. ~Parser();
  245. private:
  246. Parser(const Parser&);
  247. Parser& operator=(const Parser&);
  248. public:
  249. TRecvStatus Recv(const void* _buffer, size_t _length);
  250. TRecvStatus Recv(AutoBuffer& _recv_buffer);
  251. TRecvStatus RecvStatus() const;
  252. TCsMode CsMode() const;
  253. bool FirstLineReady() const;
  254. const RequestLine& Request() const;
  255. const StatusLine& Status() const;
  256. const AutoBuffer& HeaderBuffer() const;
  257. bool FieldsReady() const;
  258. HeaderFields& Fields();
  259. const HeaderFields& Fields() const;
  260. size_t HeaderLength() const;
  261. bool BodyReady() const;
  262. bool BodyRecving() const;
  263. BodyReceiver& Body();
  264. const BodyReceiver& Body() const;
  265. bool Error() const;
  266. bool Success() const;
  267. private:
  268. TRecvStatus recvstatus_;
  269. AutoBuffer recvbuf_;
  270. AutoBuffer headerbuf_;
  271. bool response_header_ready_;
  272. TCsMode csmode_;
  273. StatusLine statusline_;
  274. RequestLine requestline_;
  275. HeaderFields headfields_;
  276. BodyReceiver* bodyreceiver_;
  277. bool is_manage_body_;
  278. size_t headerlength_;
  279. };
  280. // void testChunk();
  281. } /* namespace http */
  282. #endif /* HTTPREQUEST_H_ */