
#include "parsing_message_http.hpp"

size_t
	parse_http_first_line(std::string message, std::vector<std::string> &line)
{
	std::vector<std::string>	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<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;
}

