Http1Parser.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include "Http1Parser.h"
  2. #define MAX_CONTENT_LENGTH (1 << 24) // 16M
  3. static int on_url(http_parser* parser, const char *at, size_t length);
  4. static int on_status(http_parser* parser, const char *at, size_t length);
  5. static int on_header_field(http_parser* parser, const char *at, size_t length);
  6. static int on_header_value(http_parser* parser, const char *at, size_t length);
  7. static int on_body(http_parser* parser, const char *at, size_t length);
  8. static int on_message_begin(http_parser* parser);
  9. static int on_headers_complete(http_parser* parser);
  10. static int on_message_complete(http_parser* parser);
  11. http_parser_settings* Http1Parser::cbs = NULL;
  12. Http1Parser::Http1Parser(http_session_type type) {
  13. if (cbs == NULL) {
  14. cbs = (http_parser_settings*)malloc(sizeof(http_parser_settings));
  15. http_parser_settings_init(cbs);
  16. cbs->on_message_begin = on_message_begin;
  17. cbs->on_url = on_url;
  18. cbs->on_status = on_status;
  19. cbs->on_header_field = on_header_field;
  20. cbs->on_header_value = on_header_value;
  21. cbs->on_headers_complete = on_headers_complete;
  22. cbs->on_body = on_body;
  23. cbs->on_message_complete = on_message_complete;
  24. }
  25. http_parser_init(&parser, HTTP_BOTH);
  26. parser.data = this;
  27. flags = 0;
  28. state = HP_START_REQ_OR_RES;
  29. submited = NULL;
  30. parsed = NULL;
  31. }
  32. Http1Parser::~Http1Parser() {
  33. }
  34. int on_url(http_parser* parser, const char *at, size_t length) {
  35. printd("on_url:%.*s\n", (int)length, at);
  36. Http1Parser* hp = (Http1Parser*)parser->data;
  37. hp->state = HP_URL;
  38. hp->url.append(at, length);
  39. return 0;
  40. }
  41. int on_status(http_parser* parser, const char *at, size_t length) {
  42. printd("on_status:%.*s\n", (int)length, at);
  43. Http1Parser* hp = (Http1Parser*)parser->data;
  44. hp->state = HP_STATUS;
  45. return 0;
  46. }
  47. int on_header_field(http_parser* parser, const char *at, size_t length) {
  48. printd("on_header_field:%.*s\n", (int)length, at);
  49. Http1Parser* hp = (Http1Parser*)parser->data;
  50. hp->handle_header();
  51. hp->state = HP_HEADER_FIELD;
  52. hp->header_field.append(at, length);
  53. return 0;
  54. }
  55. int on_header_value(http_parser* parser, const char *at, size_t length) {
  56. printd("on_header_value:%.*s""\n", (int)length, at);
  57. Http1Parser* hp = (Http1Parser*)parser->data;
  58. hp->state = HP_HEADER_VALUE;
  59. hp->header_value.append(at, length);
  60. return 0;
  61. }
  62. int on_body(http_parser* parser, const char *at, size_t length) {
  63. //printd("on_body:%.*s""\n", (int)length, at);
  64. Http1Parser* hp = (Http1Parser*)parser->data;
  65. hp->state = HP_BODY;
  66. hp->parsed->body.append(at, length);
  67. return 0;
  68. }
  69. int on_message_begin(http_parser* parser) {
  70. printd("on_message_begin\n");
  71. Http1Parser* hp = (Http1Parser*)parser->data;
  72. hp->state = HP_MESSAGE_BEGIN;
  73. return 0;
  74. }
  75. int on_headers_complete(http_parser* parser) {
  76. printd("on_headers_complete\n");
  77. Http1Parser* hp = (Http1Parser*)parser->data;
  78. hp->handle_header();
  79. bool skip_body = false;
  80. hp->parsed->http_major = parser->http_major;
  81. hp->parsed->http_minor = parser->http_minor;
  82. if (hp->parsed->type == HTTP_REQUEST) {
  83. HttpRequest* req = (HttpRequest*)hp->parsed;
  84. req->method = (http_method)parser->method;
  85. req->url = hp->url;
  86. }
  87. else if (hp->parsed->type == HTTP_RESPONSE) {
  88. HttpResponse* res = (HttpResponse*)hp->parsed;
  89. res->status_code = (http_status)parser->status_code;
  90. // response to HEAD
  91. if (res->status_code == 200 && hp->flags & F_SKIPBODY) {
  92. skip_body = true;
  93. }
  94. }
  95. auto iter = hp->parsed->headers.find("content-type");
  96. if (iter != hp->parsed->headers.end()) {
  97. hp->parsed->content_type = http_content_type_enum(iter->second.c_str());
  98. }
  99. iter = hp->parsed->headers.find("content-length");
  100. if (iter != hp->parsed->headers.end()) {
  101. int content_length = atoi(iter->second.c_str());
  102. hp->parsed->content_length = content_length;
  103. int reserve_length = MIN(content_length + 1, MAX_CONTENT_LENGTH);
  104. if ((!skip_body) && reserve_length > hp->parsed->body.capacity()) {
  105. hp->parsed->body.reserve(reserve_length);
  106. }
  107. }
  108. hp->state = HP_HEADERS_COMPLETE;
  109. return skip_body ? 1 : 0;
  110. }
  111. int on_message_complete(http_parser* parser) {
  112. printd("on_message_complete\n");
  113. Http1Parser* hp = (Http1Parser*)parser->data;
  114. hp->state = HP_MESSAGE_COMPLETE;
  115. return 0;
  116. }