75 lines
1.8 KiB
C++
75 lines
1.8 KiB
C++
|
|
#include "parsing_message_http.hpp"
|
|
|
|
/*
|
|
- parse_http_first_line() :
|
|
- copy first line into a vector of 3 strings
|
|
/ copy line into a vector of 3 strings
|
|
- parse_http_headers(std::string message)
|
|
-
|
|
- parse_http_body(std::string message)
|
|
*/
|
|
|
|
std::map<std::string, std::string>
|
|
parse_http_headers(std::string message)
|
|
{
|
|
std::map<std::string, std::string> headers;
|
|
std::vector<std::string> list;
|
|
std::vector<std::string>::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<std::string, std::string>(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<std::string> sline;
|
|
|
|
sline = ::split(str, ' ');
|
|
if (sline.size() != 3)
|
|
return false;
|
|
if (sline[0].find(':') != std::string::npos)
|
|
return false;
|
|
return true;
|
|
}
|
|
|