HttpParser.h 3.0 KB

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