HttpParser.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #ifndef HW_HTTP_PARSER_H_
  2. #define HW_HTTP_PARSER_H_
  3. #include "http_parser.h"
  4. #include "HttpRequest.h"
  5. #include "hstring.h"
  6. enum http_parser_state {
  7. HP_START_REQ_OR_RES,
  8. HP_MESSAGE_BEGIN,
  9. HP_URL,
  10. HP_STATUS,
  11. HP_HEADER_FIELD,
  12. HP_HEADER_VALUE,
  13. HP_HEADERS_COMPLETE,
  14. HP_BODY,
  15. HP_MESSAGE_COMPLETE
  16. };
  17. struct http_parser_userdata {
  18. http_parser_type type;
  19. http_parser_state state;
  20. HttpInfo* payload;
  21. // tmp
  22. std::string url;
  23. std::string header_field;
  24. std::string header_value;
  25. void handle_header() {
  26. if (header_field.size() != 0 && header_value.size() != 0) {
  27. payload->headers[header_field] = header_value;
  28. header_field.clear();
  29. header_value.clear();
  30. }
  31. }
  32. void init() {
  33. state = HP_START_REQ_OR_RES;
  34. url.clear();
  35. header_field.clear();
  36. header_value.clear();
  37. }
  38. };
  39. class HttpParser {
  40. http_parser_settings hp_settings;
  41. http_parser hp_parser;
  42. http_parser_userdata hp_userdata;
  43. public:
  44. HttpParser() {
  45. http_parser_settings_init(&hp_settings);
  46. hp_settings.on_message_begin = HttpParser::on_message_begin;
  47. hp_settings.on_url = HttpParser::on_url;
  48. hp_settings.on_status = HttpParser::on_status;
  49. hp_settings.on_header_field = HttpParser::on_header_field;
  50. hp_settings.on_header_value = HttpParser::on_header_value;
  51. hp_settings.on_headers_complete = HttpParser::on_headers_complete;
  52. hp_settings.on_body = HttpParser::on_body;
  53. hp_settings.on_message_complete = HttpParser::on_message_complete;
  54. hp_parser.data = &hp_userdata;
  55. }
  56. void parser_request_init(HttpRequest* req) {
  57. hp_userdata.init();
  58. hp_userdata.type = HTTP_REQUEST;
  59. hp_userdata.payload = req;
  60. http_parser_init(&hp_parser, HTTP_REQUEST);
  61. }
  62. void parser_response_init(HttpResponse* res) {
  63. hp_userdata.init();
  64. hp_userdata.type = HTTP_RESPONSE;
  65. hp_userdata.payload = res;
  66. http_parser_init(&hp_parser, HTTP_RESPONSE);
  67. }
  68. int execute(const char* data, size_t len) {
  69. return http_parser_execute(&hp_parser, &hp_settings, data, len);
  70. }
  71. http_errno get_errno() {
  72. return (http_errno)hp_parser.http_errno;
  73. }
  74. http_parser_state get_state() {
  75. return hp_userdata.state;
  76. }
  77. protected:
  78. static int on_url(http_parser* parser, const char *at, size_t length);
  79. static int on_status(http_parser* parser, const char *at, size_t length);
  80. static int on_header_field(http_parser* parser, const char *at, size_t length);
  81. static int on_header_value(http_parser* parser, const char *at, size_t length);
  82. static int on_body(http_parser* parser, const char *at, size_t length);
  83. static int on_message_begin(http_parser* parser);
  84. static int on_headers_complete(http_parser* parser);
  85. static int on_message_complete(http_parser* parser);
  86. };
  87. #endif // HW_HTTP_PARSER_H_