Http1Parser.h 3.0 KB

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