]> git.tdb.fi Git - libs/net.git/blobdiff - source/http/request.cpp
Add a dynamic receiver class for more flexible packet handling
[libs/net.git] / source / http / request.cpp
index c948755ae78281cb1c36378de491a1cd0c948cd7..685de332371749d35b7665e7619e399c39726f29 100644 (file)
@@ -1,7 +1,7 @@
-#include <msp/strings/formatter.h>
+#include "request.h"
+#include <msp/strings/format.h>
 #include <msp/strings/regex.h>
 #include <msp/strings/utils.h>
-#include "request.h"
 #include "utils.h"
 
 using namespace std;
@@ -12,7 +12,10 @@ namespace Http {
 Request::Request(const string &m, const string &p):
        method(m),
        path(p)
-{ }
+{
+       if(path.find(' ')!=string::npos)
+               throw invalid_argument("Request::Request");
+}
 
 string Request::str() const
 {
@@ -24,7 +27,9 @@ string Request::str() const
 
 Request Request::parse(const string &str)
 {
-       unsigned lf = str.find('\n');
+       string::size_type lf = str.find('\n');
+       if(lf==0)
+               throw invalid_argument("Request::parse");
        vector<string> parts = split(str.substr(0, lf-(str[lf-1]=='\r')), ' ', 2);
        if(parts.size()<3)
                throw invalid_argument("Request::parse");
@@ -45,14 +50,10 @@ Request Request::from_url(const string &str)
        if(url.scheme!="http")
                throw invalid_argument("Request::from_url");
 
-       string path = url.path;
+       string path = urlencode(url.path);
        if(path.empty())
                path = "/";
-       if(!url.query.empty())
-       {
-               path += '?';
-               path += url.query;
-       }
+       append(path, "?", url.query);
 
        Request result("GET", path);
        result.set_header("Host", url.host);