TwITe

Untitled

Jan 7th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.51 KB | None | 0 0
  1. //
  2. // Created by twite on 07.01.18.
  3. //
  4.  
  5. #ifndef WEB_HTTP_REQUEST_PARSER_H
  6. #define WEB_HTTP_REQUEST_PARSER_H
  7.  
  8. #include <iostream>
  9. #include <vector>
  10.  
  11. namespace webserver {
  12.  
  13.  
  14.     class http_request_parser {
  15.  
  16.         bool check_is_current_header_host(const std::__cxx11::string& current_header) {
  17.             return current_header == "Host";
  18.         }
  19.  
  20.         void parse_request_line(http_request& request, const std::vector<std::__cxx11::string>& raw_http_request) {
  21.             std::istringstream request_line(raw_http_request[0]);
  22.  
  23.             std::__cxx11::string method;
  24.             std::__cxx11::string request_url;
  25.  
  26.             request_line >> method >> request_url;
  27.  
  28.             request.set_http_request_method(method);
  29.             request.set_http_request_url(request_url);
  30.         }
  31.  
  32.         void extend_request_url_by_host(const std::__cxx11::string& host, http_request& request) {
  33.             std::__cxx11::string full_url;
  34.             std::__cxx11::string url_second_part = request.get_request_url();
  35.  
  36.             full_url = host + url_second_part;
  37.  
  38.             request.set_http_request_url(full_url);
  39.         }
  40.  
  41.         void parse_request_body(http_request& request, const std::vector<std::__cxx11::string>& raw_http_request) {
  42.             for (auto current_message_line = raw_http_request.begin(); current_message_line != raw_http_request.end(); current_message_line++)  {
  43.                 if (*current_message_line == " ") {
  44.                     request.set_http_request_body(*(current_message_line + 1));
  45.                 }
  46.             }
  47.         }
  48.  
  49.         void parse_headers(http_request& request, const std::vector<std::__cxx11::string>& raw_http_request) {
  50.              for (auto current_message_line = raw_http_request.begin() + 1; current_message_line != raw_http_request.end(); current_message_line++) {
  51.                  std::__cxx11::string current_header_type;
  52.                  std::__cxx11::string current_header_value;
  53.  
  54.                  if (*current_message_line == " ") {
  55.                      break;
  56.                  }
  57.  
  58.                  for (std::size_t current_char_postion = 0; current_char_postion < current_message_line->size(); current_char_postion++) {
  59.                      if ((*current_message_line)[current_char_postion] == ':') {
  60.                          current_header_value = current_message_line->substr(current_char_postion + 2);
  61.                          break;
  62.                      }
  63.                      current_header_type.push_back((*current_message_line)[current_char_postion]);
  64.                  }
  65.  
  66.                  http_header current_header;
  67.                  current_header.type = current_header_type;
  68.                  current_header.value = current_header_value;
  69.  
  70.                  request.add_http_request_header(current_header);
  71.  
  72.                  if (check_is_current_header_host(current_header_type)) {
  73.                      extend_request_url_by_host(current_header_value, request);
  74.                  }
  75.              }
  76.         }
  77.  
  78.     public:
  79.         //TODO: Написать тесты для парсера
  80.         http_request parse(std::vector<std::__cxx11::string>& raw_http_request) {
  81.             http_request request;
  82.  
  83.             parse_request_line(request, raw_http_request);
  84.             parse_headers(request, raw_http_request);
  85.             if (request.check_is_request_body_exist()) {
  86.                 parse_request_body(request, raw_http_request);
  87.             }
  88.  
  89.             return request;
  90.         }
  91.     };
  92.  
  93. }
  94.  
  95.  
  96. #endif //WEB_HTTP_REQUEST_PARSER_H
Advertisement
Add Comment
Please, Sign In to add comment