+ unsigned lf=str.find('\n');
+ vector<string> parts=split(str.substr(0, lf-(str[lf-1]=='\r')), ' ', 2);
+ if(parts.size()<3)
+ throw InvalidParameterValue("Invalid request");
+
+ 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 InvalidParameterValue("Only http scheme is supported");
+ string path=url.path;
+ if(path.empty())
+ path="/";
+ if(!url.query.empty())