HttpParser.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. strlower((char*)header_field.c_str());
  28. payload->headers[header_field] = header_value;
  29. header_field.clear();
  30. header_value.clear();
  31. }
  32. }
  33. void init() {
  34. state = HP_START_REQ_OR_RES;
  35. url.clear();
  36. header_field.clear();
  37. header_value.clear();
  38. }
  39. };
  40. class HttpParser {
  41. http_parser_settings hp_settings;
  42. http_parser hp_parser;
  43. http_parser_userdata hp_userdata;
  44. public:
  45. HttpParser() {
  46. http_parser_settings_init(&hp_settings);
  47. hp_settings.on_message_begin = HttpParser::on_message_begin;
  48. hp_settings.on_url = HttpParser::on_url;
  49. hp_settings.on_status = HttpParser::on_status;
  50. hp_settings.on_header_field = HttpParser::on_header_field;
  51. hp_settings.on_header_value = HttpParser::on_header_value;
  52. hp_settings.on_headers_complete = HttpParser::on_headers_complete;
  53. hp_settings.on_body = HttpParser::on_body;
  54. hp_settings.on_message_complete = HttpParser::on_message_complete;
  55. hp_parser.data = &hp_userdata;
  56. }
  57. void parser_request_init(HttpRequest* req) {
  58. hp_userdata.init();
  59. hp_userdata.type = HTTP_REQUEST;
  60. hp_userdata.payload = req;
  61. http_parser_init(&hp_parser, HTTP_REQUEST);
  62. }
  63. void parser_response_init(HttpResponse* res) {
  64. hp_userdata.init();
  65. hp_userdata.type = HTTP_RESPONSE;
  66. hp_userdata.payload = res;
  67. http_parser_init(&hp_parser, HTTP_RESPONSE);
  68. }
  69. int execute(const char* data, size_t len) {
  70. return http_parser_execute(&hp_parser, &hp_settings, data, len);
  71. }
  72. http_errno get_errno() {
  73. return (http_errno)hp_parser.http_errno;
  74. }
  75. http_parser_state get_state() {
  76. return hp_userdata.state;
  77. }
  78. protected:
  79. static int on_url(http_parser* parser, const char *at, size_t length);
  80. static int on_status(http_parser* parser, const char *at, size_t length);
  81. static int on_header_field(http_parser* parser, const char *at, size_t length);
  82. static int on_header_value(http_parser* parser, const char *at, size_t length);
  83. static int on_body(http_parser* parser, const char *at, size_t length);
  84. static int on_message_begin(http_parser* parser);
  85. static int on_headers_complete(http_parser* parser);
  86. static int on_message_complete(http_parser* parser);
  87. };
  88. #endif // HW_HTTP_PARSER_H_