Loading src/http.cpp +37 −39 Original line number Diff line number Diff line Loading @@ -489,8 +489,6 @@ size_t libhttppp::HttpRequest::parse(){ int pos=0; endpos+=4; std::move(RecvData.begin()+endpos,RecvData.end(),RecvData.begin()); RecvData.resize(endpos); for(size_t cpos=pos; cpos< header.size(); ++cpos){ Loading Loading @@ -709,14 +707,12 @@ void libhttppp::HttpForm::parse(libhttppp::HttpRequest* request){ if(request->getRequestType()==POSTREQUEST){ HttpHeader::HeaderData *ctype=request->getData("content-type"); if(request->RecvData.size()<= request->getContentLength()){; if(ctype && strncmp(request->getData(ctype),"multipart/form-data",16)==0){ if(request->getContentLength() <= request->RecvData.size()){ if(ctype && strncmp(request->getData(ctype),"multipart/form-data",17)==0){ _parseBoundary(request->getData(ctype)); _parseMulitpart(request->RecvData); } if(ctype && strncmp(request->getData(ctype),"application/x-www-form-urlencoded",34)==0){ _parseUrlDecode(request->RecvData); }else if(ctype && strncmp(request->getData(ctype),"application/x-www-form-urlencoded",34)==0){ _parseUrlDecode(request->RecvData,request->getContentLength()); } } } Loading @@ -733,7 +729,7 @@ void libhttppp::HttpForm::parse(libhttppp::HttpRequest* request){ } if(rdelimter!=-1){ std::copy(rurl+rdelimter,rurl+rurlsize,std::inserter<netplus::condata<char>>(urldat,urldat.begin())); _parseUrlDecode(urldat); _parseUrlDecode(urldat,rurlsize); } }catch(...){} } Loading @@ -742,25 +738,28 @@ const char *libhttppp::HttpForm::getContentType(){ return _ContentType; } inline int libhttppp::HttpForm::_ishex(int x){ return (x >= '0' && x <= '9') || (x >= 'a' && x <= 'f') || (x >= 'A' && x <= 'F'); } ssize_t libhttppp::HttpForm::urlDecode(const std::vector<char> in,std::vector<char> &out){ for (auto i = in.begin(), nd = in.end(); i < nd; ++i) { auto c = ( *i ); ssize_t libhttppp::HttpForm::urlDecode(const char *urlin,size_t urlinsize,std::vector<char> &out){ char *o; const char *end = urlin + urlinsize; int c; while(urlin <= end) { c = *urlin++; if (c == '+'){ c = ' '; }else if (c == '%' && (!_ishex(*urlin++)|| !_ishex(*urlin++) || !sscanf(urlin - 2, "%2x", &c))){ return -1; switch(c) { case '%': if (i[1] && i[2]) { char hs[]{ i[1], i[2] }; out.push_back(static_cast<char>(strtol(hs, nullptr, 16))); i += 2; } break; case '+': out.push_back(' '); break; default: out.push_back(c); } } return out.size(); } Loading Loading @@ -1129,34 +1128,33 @@ void libhttppp::HttpForm::MultipartForm::Data::addContent(Content content){ } } void libhttppp::HttpForm::_parseUrlDecode(const netplus::condata<char> &data){ void libhttppp::HttpForm::_parseUrlDecode(const netplus::condata<char> &data,size_t csize){ HTTPException httpexception; size_t fdatstpos=0; size_t keyendpos=0; for(size_t fdatpos=0; fdatpos<=data.size(); fdatpos++){ if(data.at(fdatpos) == '&' || fdatpos==data.size()){ for(size_t fdatpos=0; fdatpos<=csize; ++fdatpos){ if(fdatpos==csize || data.at(fdatpos) == '&'){ if(keyendpos > fdatstpos && keyendpos < fdatpos){ std::vector<char> key,ukey;; size_t vlstpos=keyendpos+1; std::vector<char> value,uvalue; char *urldecdKey=nullptr; std::copy(data.begin()+fdatstpos,data.begin()+keyendpos,std::inserter<std::vector<char>>(key,key.begin())); key.push_back('\0'); urlDecode(key,ukey); if(vlstpos<=data.size()){ std::copy(data.begin()+vlstpos,data.begin()+fdatpos,std::inserter<std::vector<char>>(value,value.begin())); value.push_back('\0'); urlDecode(value.data(),value.size(),uvalue); urlDecode(value,uvalue); } urlDecode(key.data(),key.size(),ukey); UrlcodedForm::Data urldat(ukey.data(),uvalue.data()); UrlFormData.addFormData(urldat); fdatstpos=fdatpos; ++fdatstpos; } fdatstpos=fdatpos+1; }else if( data.at(fdatpos) == '=' ){ keyendpos=fdatpos; }; } } } Loading src/http.h +2 −3 Original line number Diff line number Diff line Loading @@ -285,7 +285,7 @@ namespace libhttppp { void parse(HttpRequest *request); const char *getContentType(); /*urldecoded form*/ ssize_t urlDecode(const char *urlin,size_t urlinsize,std::vector<char> &out); ssize_t urlDecode(const std::vector<char> in,std::vector<char> &out); UrlcodedForm UrlFormData; /*multiform*/ const char *getBoundary(); Loading @@ -293,7 +293,7 @@ namespace libhttppp { MultipartForm MultipartFormData; private: /*urldecoded*/ void _parseUrlDecode(const netplus::condata<char> &data); void _parseUrlDecode(const netplus::condata<char> &data,size_t csize); /*multiform*/ void _parseMulitpart(const netplus::condata<char> &data); Loading @@ -302,7 +302,6 @@ namespace libhttppp { std::vector<char> _Boundary; /*both methods*/ inline int _ishex(int x); size_t _Elements; const char* _ContentType; }; Loading Loading
src/http.cpp +37 −39 Original line number Diff line number Diff line Loading @@ -489,8 +489,6 @@ size_t libhttppp::HttpRequest::parse(){ int pos=0; endpos+=4; std::move(RecvData.begin()+endpos,RecvData.end(),RecvData.begin()); RecvData.resize(endpos); for(size_t cpos=pos; cpos< header.size(); ++cpos){ Loading Loading @@ -709,14 +707,12 @@ void libhttppp::HttpForm::parse(libhttppp::HttpRequest* request){ if(request->getRequestType()==POSTREQUEST){ HttpHeader::HeaderData *ctype=request->getData("content-type"); if(request->RecvData.size()<= request->getContentLength()){; if(ctype && strncmp(request->getData(ctype),"multipart/form-data",16)==0){ if(request->getContentLength() <= request->RecvData.size()){ if(ctype && strncmp(request->getData(ctype),"multipart/form-data",17)==0){ _parseBoundary(request->getData(ctype)); _parseMulitpart(request->RecvData); } if(ctype && strncmp(request->getData(ctype),"application/x-www-form-urlencoded",34)==0){ _parseUrlDecode(request->RecvData); }else if(ctype && strncmp(request->getData(ctype),"application/x-www-form-urlencoded",34)==0){ _parseUrlDecode(request->RecvData,request->getContentLength()); } } } Loading @@ -733,7 +729,7 @@ void libhttppp::HttpForm::parse(libhttppp::HttpRequest* request){ } if(rdelimter!=-1){ std::copy(rurl+rdelimter,rurl+rurlsize,std::inserter<netplus::condata<char>>(urldat,urldat.begin())); _parseUrlDecode(urldat); _parseUrlDecode(urldat,rurlsize); } }catch(...){} } Loading @@ -742,25 +738,28 @@ const char *libhttppp::HttpForm::getContentType(){ return _ContentType; } inline int libhttppp::HttpForm::_ishex(int x){ return (x >= '0' && x <= '9') || (x >= 'a' && x <= 'f') || (x >= 'A' && x <= 'F'); } ssize_t libhttppp::HttpForm::urlDecode(const std::vector<char> in,std::vector<char> &out){ for (auto i = in.begin(), nd = in.end(); i < nd; ++i) { auto c = ( *i ); ssize_t libhttppp::HttpForm::urlDecode(const char *urlin,size_t urlinsize,std::vector<char> &out){ char *o; const char *end = urlin + urlinsize; int c; while(urlin <= end) { c = *urlin++; if (c == '+'){ c = ' '; }else if (c == '%' && (!_ishex(*urlin++)|| !_ishex(*urlin++) || !sscanf(urlin - 2, "%2x", &c))){ return -1; switch(c) { case '%': if (i[1] && i[2]) { char hs[]{ i[1], i[2] }; out.push_back(static_cast<char>(strtol(hs, nullptr, 16))); i += 2; } break; case '+': out.push_back(' '); break; default: out.push_back(c); } } return out.size(); } Loading Loading @@ -1129,34 +1128,33 @@ void libhttppp::HttpForm::MultipartForm::Data::addContent(Content content){ } } void libhttppp::HttpForm::_parseUrlDecode(const netplus::condata<char> &data){ void libhttppp::HttpForm::_parseUrlDecode(const netplus::condata<char> &data,size_t csize){ HTTPException httpexception; size_t fdatstpos=0; size_t keyendpos=0; for(size_t fdatpos=0; fdatpos<=data.size(); fdatpos++){ if(data.at(fdatpos) == '&' || fdatpos==data.size()){ for(size_t fdatpos=0; fdatpos<=csize; ++fdatpos){ if(fdatpos==csize || data.at(fdatpos) == '&'){ if(keyendpos > fdatstpos && keyendpos < fdatpos){ std::vector<char> key,ukey;; size_t vlstpos=keyendpos+1; std::vector<char> value,uvalue; char *urldecdKey=nullptr; std::copy(data.begin()+fdatstpos,data.begin()+keyendpos,std::inserter<std::vector<char>>(key,key.begin())); key.push_back('\0'); urlDecode(key,ukey); if(vlstpos<=data.size()){ std::copy(data.begin()+vlstpos,data.begin()+fdatpos,std::inserter<std::vector<char>>(value,value.begin())); value.push_back('\0'); urlDecode(value.data(),value.size(),uvalue); urlDecode(value,uvalue); } urlDecode(key.data(),key.size(),ukey); UrlcodedForm::Data urldat(ukey.data(),uvalue.data()); UrlFormData.addFormData(urldat); fdatstpos=fdatpos; ++fdatstpos; } fdatstpos=fdatpos+1; }else if( data.at(fdatpos) == '=' ){ keyendpos=fdatpos; }; } } } Loading
src/http.h +2 −3 Original line number Diff line number Diff line Loading @@ -285,7 +285,7 @@ namespace libhttppp { void parse(HttpRequest *request); const char *getContentType(); /*urldecoded form*/ ssize_t urlDecode(const char *urlin,size_t urlinsize,std::vector<char> &out); ssize_t urlDecode(const std::vector<char> in,std::vector<char> &out); UrlcodedForm UrlFormData; /*multiform*/ const char *getBoundary(); Loading @@ -293,7 +293,7 @@ namespace libhttppp { MultipartForm MultipartFormData; private: /*urldecoded*/ void _parseUrlDecode(const netplus::condata<char> &data); void _parseUrlDecode(const netplus::condata<char> &data,size_t csize); /*multiform*/ void _parseMulitpart(const netplus::condata<char> &data); Loading @@ -302,7 +302,6 @@ namespace libhttppp { std::vector<char> _Boundary; /*both methods*/ inline int _ishex(int x); size_t _Elements; const char* _ContentType; }; Loading