diff --git a/util/http_parser.cpp b/util/http_parser.cpp index ec648a39..9a81c404 100644 --- a/util/http_parser.cpp +++ b/util/http_parser.cpp @@ -188,10 +188,25 @@ bool HTTP::Parser::parse(){ } if (seenHeaders){ if (length > 0){ - /// \todo Include POST variable parsing? if (HTTPbuffer.length() >= length){ body = HTTPbuffer.substr(0, length); HTTPbuffer.erase(0, length); + std::string tmppost = body; + std::string varname; + std::string varval; + while (tmppost.find('=') != std::string::npos){ + size_t found = tmppost.find('='); + varname = urlunescape(tmppost.substr(0, found).c_str()); + tmppost.erase(0, found+1); + size_t found = tmppost.find('&'); + varval = urlunescape(tmppost.substr(0, found).c_str()); + SetVar(varname, varval); + if (found == std::string::npos){ + tmppost.clear(); + }else{ + tmppost.erase(0, found+1); + } + } return true; }else{ return false; @@ -241,3 +256,29 @@ void HTTP::Parser::SendBodyPart(Socket::Connection & conn, std::string bodypart) conn.write(bodypart); } } + +/// Unescapes URLencoded C-strings to a std::string. +/// This function *will* destroy the input data! +std::string HTTP::Parser::urlunescape(char *s){ + char *p; + for (p = s; *s != '\0'; ++s){ + if (*s == '%'){ + if (*++s != '\0'){ + *p = unhex(*s) << 4; + } + if (*++s != '\0'){ + *p++ += unhex(*s); + } + } else { + if (*s == '+'){*p++ = ' ';}else{*p++ = *s;} + } + } + *p = '\0'; + return std::string(s); +} + +/// Helper function for urlunescape. +/// Takes a single char input and outputs its integer hex value. +int HTTP::Parser::unhex(char c){ + return( c >= '0' && c <= '9' ? c - '0' : c >= 'A' && c <= 'F' ? c - 'A' + 10 : c - 'a' + 10 ); +} diff --git a/util/http_parser.h b/util/http_parser.h index d7048eae..542c06e6 100644 --- a/util/http_parser.h +++ b/util/http_parser.h @@ -30,6 +30,7 @@ namespace HTTP{ void SendBodyPart(Socket::Connection & conn, std::string bodypart); void Clean(); bool CleanForNext(); + std::string urlunescape(char *s); ///< Unescapes URLencoded C-strings to a std::string. std::string body; std::string method; std::string url; @@ -43,5 +44,6 @@ namespace HTTP{ std::map headers; std::map vars; void Trim(std::string & s); + int unhex(char c); ///< Helper function for urlunescape. };//HTTP::Parser class };//HTTP namespace diff --git a/util/socket.cpp b/util/socket.cpp index 425d2a70..b0046d02 100644 --- a/util/socket.cpp +++ b/util/socket.cpp @@ -495,27 +495,3 @@ bool Socket::Server::connected(){ /// Returns internal socket number. int Socket::Server::getSocket(){return sock;} - -/// Unescapes URLencoded C-strings to a std::string. -/// This function *will* destroy the incoming data! -std::string Socket::Connection::urlunescape(char *s){ - char *p; - for (p = s; *s != '\0'; ++s){ - if (*s == '%'){ - if (*++s != '\0'){ - *p = unhex(*s) << 4; - } - if (*++s != '\0'){ - *p++ += unhex(*s); - } - } else { - if (*s == '+'){*p++ = ' ';}else{*p++ = *s;} - } - } - *p = '\0'; - return std::string(s); -} - -int Socket::Connection::unhex(char c){ - return( c >= '0' && c <= '9' ? c - '0' : c >= 'A' && c <= 'F' ? c - 'A' + 10 : c - 'a' + 10 ); -} diff --git a/util/socket.h b/util/socket.h index 456a162f..57aca183 100644 --- a/util/socket.h +++ b/util/socket.h @@ -23,7 +23,6 @@ namespace Socket{ private: int sock; ///< Internally saved socket number. std::string remotehost; ///< Stores remote host address. - int unhex(char c); ///< Helper function for urlunescape. public: Connection(); ///< Create a new disconnected base socket. Connection(int sockNo); ///< Create a new base socket. @@ -45,7 +44,6 @@ namespace Socket{ bool swrite(std::string & buffer); ///< Read call that is compatible with std::string. bool iread(std::string & buffer); ///< Incremental write call that is compatible with std::string. bool iwrite(std::string & buffer); ///< Write call that is compatible with std::string. - std::string urlunescape(char *s); ///< Unescapes URLencoded C-strings to a std::string. void close(); ///< Close connection. std::string getHost(); ///< Gets hostname for connection, if available. int getSocket(); ///< Returns internal socket number.