1
0

Http1Parser.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #ifndef HV_HTTP1_PARSER_H_
  2. #define HV_HTTP1_PARSER_H_
  3. #include "HttpParser.h"
  4. #include "http_parser.h"
  5. class Http1Parser : public HttpParser {
  6. public:
  7. static http_parser_settings cbs;
  8. http_parser parser;
  9. int flags;
  10. http_parser_state state;
  11. HttpMessage* submited;
  12. HttpMessage* parsed;
  13. // tmp
  14. std::string url; // for on_url
  15. std::string header_field; // for on_header_field
  16. std::string header_value; // for on_header_value
  17. std::string sendbuf; // for GetSendData
  18. Http1Parser(http_session_type type = HTTP_CLIENT);
  19. virtual ~Http1Parser();
  20. void handle_header() {
  21. if (header_field.size() != 0) {
  22. if (stricmp(header_field.c_str(), "Set-CooKie") == 0 ||
  23. stricmp(header_field.c_str(), "Cookie") == 0) {
  24. HttpCookie cookie;
  25. if (cookie.parse(header_value)) {
  26. parsed->cookies.emplace_back(cookie);
  27. }
  28. }
  29. parsed->headers[header_field] = header_value;
  30. header_field.clear();
  31. header_value.clear();
  32. }
  33. }
  34. virtual int GetSendData(char** data, size_t* len) {
  35. if (!submited) {
  36. *data = NULL;
  37. *len = 0;
  38. return 0;
  39. }
  40. sendbuf = submited->Dump(true, true);
  41. submited = NULL;
  42. *data = (char*)sendbuf.data();
  43. *len = sendbuf.size();
  44. return sendbuf.size();
  45. }
  46. virtual int FeedRecvData(const char* data, size_t len) {
  47. return http_parser_execute(&parser, &cbs, data, len);
  48. }
  49. virtual int GetState() {
  50. return (int)state;
  51. }
  52. virtual bool WantRecv() {
  53. return state != HP_MESSAGE_COMPLETE;
  54. }
  55. virtual bool WantSend() {
  56. return state == HP_MESSAGE_COMPLETE;
  57. }
  58. virtual bool IsComplete() {
  59. return state == HP_MESSAGE_COMPLETE;
  60. }
  61. virtual bool IsEof() {
  62. FeedRecvData(NULL, 0);
  63. return IsComplete();
  64. }
  65. virtual int GetError() {
  66. return parser.http_errno;
  67. }
  68. virtual const char* StrError(int error) {
  69. return http_errno_description((enum http_errno)error);
  70. }
  71. // client
  72. // SubmitRequest -> while(GetSendData) {send} -> InitResponse -> do {recv -> FeedRecvData} while(WantRecv)
  73. virtual int SubmitRequest(HttpRequest* req) {
  74. submited = req;
  75. if (req) {
  76. if (req->method == HTTP_HEAD) {
  77. flags |= F_SKIPBODY;
  78. } else {
  79. flags &= ~F_SKIPBODY;
  80. }
  81. }
  82. return 0;
  83. }
  84. virtual int InitResponse(HttpResponse* res) {
  85. res->Reset();
  86. parsed = res;
  87. http_parser_init(&parser, HTTP_RESPONSE);
  88. url.clear();
  89. header_field.clear();
  90. header_value.clear();
  91. return 0;
  92. }
  93. // server
  94. // InitRequest -> do {recv -> FeedRecvData} while(WantRecv) -> SubmitResponse -> while(GetSendData) {send}
  95. virtual int InitRequest(HttpRequest* req) {
  96. req->Reset();
  97. parsed = req;
  98. http_parser_init(&parser, HTTP_REQUEST);
  99. state = HP_START_REQ_OR_RES;
  100. url.clear();
  101. header_field.clear();
  102. header_value.clear();
  103. return 0;
  104. }
  105. virtual int SubmitResponse(HttpResponse* res) {
  106. submited = res;
  107. return 0;
  108. }
  109. // HttpMessage::http_cb
  110. int invokeHttpCb(const char* data = NULL, size_t size = 0) {
  111. if (parsed->http_cb == NULL) return -1;
  112. parsed->http_cb(parsed, state, data, size);
  113. return 0;
  114. }
  115. };
  116. #endif // HV_HTTP1_PARSER_H_