#include "parsing_message_http.hpp" size_t parse_http_first_line(std::string message, std::vector &line) { std::vector sline; std::string sub; std::string tmp; size_t pos; size_t ret; // TODO: check for err in substr pos = message.find(CRLF); sub = message.substr(0, pos); sline = ::split(sub, ' '); ret = sline.size(); if (ret != 3) return ret; for (int i = 0; i < 3; i++) { tmp = ::trim(sline[i], ' '); tmp = ::trim(tmp, '\r'); line.push_back(tmp); } return ret; } std::map parse_http_headers(std::string message) { std::map headers; std::vector list; std::vector::iterator it; std::string sub; std::string key; std::string val; size_t pos; pos = (message).find(CRLF CRLF); sub = (message).substr(0, pos); list = ::split(sub, '\n'); if ( maybe_http_first_line( *list.begin() ) ) list.erase(list.begin()); for (it = list.begin(); it != list.end(); it++) { // TODO: if pattern is not "NAME: value" return error pos = (*it).find(':'); key = (*it).substr( 0, pos ); key = ::trim(key, ' '); key = ::trim(key, '\r'); key = ::str_tolower(key); val = (*it).substr( pos + 1 ); val = ::trim(val, ' '); val = ::trim(val, '\r'); headers.insert( std::pair(key, val) ); } return headers; } std::string parse_http_body(std::string message) { std::string body; size_t pos; pos = message.find(CRLF CRLF); pos += std::string(CRLF CRLF).size(); // TODO: copying just like that might fail in case of binary or images body = message.substr(pos); return body; } bool maybe_http_first_line(std::string str) { // method SP target SP version https://www.rfc-editor.org/rfc/rfc7230.html#section-3.1.1 // version SP status SP reason https://www.rfc-editor.org/rfc/rfc7230.html#section-3.1.2 std::vector sline; sline = ::split(str, ' '); if (sline.size() != 3) return false; if (sline[0].find(':') != std::string::npos) return false; return true; }