X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fhttp%2Frequest.cpp;fp=source%2Fhttp%2Frequest.cpp;h=c948755ae78281cb1c36378de491a1cd0c948cd7;hb=cf8d2e48581eeb8f1b83e8c48321a0bc2ffa6d83;hp=0000000000000000000000000000000000000000;hpb=d683ca0964182e9579838fec8d7d100eeabddee0;p=libs%2Fnet.git diff --git a/source/http/request.cpp b/source/http/request.cpp new file mode 100644 index 0000000..c948755 --- /dev/null +++ b/source/http/request.cpp @@ -0,0 +1,65 @@ +#include +#include +#include +#include "request.h" +#include "utils.h" + +using namespace std; + +namespace Msp { +namespace Http { + +Request::Request(const string &m, const string &p): + method(m), + path(p) +{ } + +string Request::str() const +{ + string result = format("%s %s %s\r\n", method, path, version_str(http_version)); + result += str_common(); + + return result; +} + +Request Request::parse(const string &str) +{ + unsigned lf = str.find('\n'); + vector parts = split(str.substr(0, lf-(str[lf-1]=='\r')), ' ', 2); + if(parts.size()<3) + throw invalid_argument("Request::parse"); + + Request result(parts[0], parts[1]); + result.http_version = parse_version(parts[2]); + + lf += result.parse_headers(str.substr(lf+1)); + + result.parse_content(str.substr(lf+1)); + + return result; +} + +Request Request::from_url(const string &str) +{ + Url url = parse_url(str); + if(url.scheme!="http") + throw invalid_argument("Request::from_url"); + + string path = url.path; + if(path.empty()) + path = "/"; + if(!url.query.empty()) + { + path += '?'; + path += url.query; + } + + Request result("GET", path); + result.set_header("Host", url.host); + result.set_header("Connection", "close"); + + return result; +} + +} // namespace Http +} // namespace Msp