Loading src/http.cpp +46 −52 Original line number Diff line number Diff line Loading @@ -528,7 +528,7 @@ size_t libhttppp::HttpRequest::parse(){ } for(size_t cpos=pos; cpos<header.size(); ++cpos){ if(header[cpos]==' ' && (cpos-pos)<255){ if(header[cpos]=='\n' && (cpos-pos)<255){ std::copy(header.begin()+pos,header.begin()+cpos,std::inserter<std::string>(_RequestVersion,_RequestVersion.begin())); _RequestVersion.push_back('\0'); ++pos; Loading Loading @@ -576,14 +576,6 @@ size_t libhttppp::HttpRequest::parse(){ } } if(_RequestType==POSTREQUEST){ if( RecvData.size() > _MaxUploadSize){ RecvData.clear(); excep[HTTPException::Note] << "Upload too big increase Max Upload Size"; throw excep; } } std::move(RecvData.begin()+endpos,RecvData.end(),RecvData.begin()); RecvData.resize(RecvData.size()-endpos); Loading Loading @@ -644,6 +636,11 @@ size_t libhttppp::HttpRequest::getContentLength(){ return getDataInt(_ContentLength); } size_t libhttppp::HttpRequest::getMaxUploadSize(){ return _MaxUploadSize; } bool libhttppp::HttpRequest::isMobile(){ for(HttpHeader::HeaderData *curdat=_firstHeaderData; curdat; curdat=nextHeaderData(curdat)){ if(strcmp(getKey(curdat),"user-agent")==0){ Loading Loading @@ -723,18 +720,39 @@ libhttppp::HttpForm::~HttpForm(){ void libhttppp::HttpForm::parse(libhttppp::HttpRequest* request){ try{ if(request->getRequestType()==POSTREQUEST){ std::vector<char> bodydat; HttpHeader::HeaderData *ctype=request->getData("content-type"); _ContentType = request->getData(ctype); if(_ContentType && strncmp(_ContentType,"multipart/form-data",16)==0){ _parseMulitpart(request); _parseMulitpart(bodydat); }else{ _parseUrlDecode(request); size_t clen = request->getDataSizet(request->_ContentLength); if(request->RecvData.size()>= clen){ std::copy(request->RecvData.begin(),request->RecvData.begin()+clen, std::inserter<std::vector<char>>(bodydat,bodydat.begin())); bodydat.push_back('\0'); _parseUrlDecode(bodydat); } }else{ _parseUrlDecode(request); } } std::vector<char> urldat; const char *rurl=request->getRequest(); size_t rurlsize=strlen(rurl); ssize_t rdelimter=-1; for(size_t cpos=0; cpos<rurlsize; cpos++){ if(rurl[cpos]=='?'){ rdelimter=cpos; rdelimter++; break; } } if(rdelimter!=-1){ std::copy(rurl+rdelimter,rurl+rurlsize,std::inserter<std::vector<char>>(urldat,urldat.begin())); _parseUrlDecode(urldat); } }catch(...){} } Loading Loading @@ -810,7 +828,7 @@ void libhttppp::HttpForm::_parseBoundary(const char* contenttype){ _Boundary.push_back('\0'); } void libhttppp::HttpForm::_parseMulitpart(libhttppp::HttpRequest* request){ void libhttppp::HttpForm::_parseMulitpart(const std::vector<char> &data){ _parseBoundary(_ContentType); std::vector<char> realboundary; realboundary.resize(_Boundary.size()+2); Loading @@ -820,7 +838,7 @@ void libhttppp::HttpForm::_parseMulitpart(libhttppp::HttpRequest* request){ std::vector<char> req; std::copy(request->RecvData.begin(),request->RecvData.begin()+request->getContentLength(), std::copy(data.begin(),data.end(), std::inserter<std::vector<char>>(req,req.begin())); size_t realboundarypos=0; Loading Loading @@ -1137,37 +1155,13 @@ void libhttppp::HttpForm::MultipartForm::Data::addContent(Content content){ } void libhttppp::HttpForm::_parseUrlDecode(libhttppp::HttpRequest* request){ void libhttppp::HttpForm::_parseUrlDecode(const std::vector<char> &data){ HTTPException httpexception; std::string formdat; if(request->getRequestType()==POSTREQUEST){ size_t clen = request->getDataSizet(request->_ContentLength); if(request->RecvData.size()>= clen){ std::copy(request->RecvData.begin(),request->RecvData.begin()+clen,std::inserter<std::string>(formdat,formdat.begin())); formdat.push_back('\0'); } }else if(request->getRequestType()==GETREQUEST){ const char *rurl=request->getRequest(); size_t rurlsize=strlen(rurl); ssize_t rdelimter=-1; for(size_t cpos=0; cpos<rurlsize; cpos++){ if(rurl[cpos]=='?'){ rdelimter=cpos; rdelimter++; break; } } if(rdelimter!=-1){ formdat.append(rurl+rdelimter,rurlsize-rdelimter); } }else{ httpexception[HTTPException::Error] << "HttpForm unknown Requestype"; throw httpexception; } size_t fdatstpos=0; size_t keyendpos=0; for(size_t fdatpos=0; fdatpos<=formdat.length(); fdatpos++){ switch(formdat[fdatpos]){ for(size_t fdatpos=0; fdatpos<=data.size(); fdatpos++){ switch(data[fdatpos]){ case '&': case '\0':{ if(keyendpos >fdatstpos && keyendpos<fdatpos){ std::string key; Loading @@ -1175,9 +1169,9 @@ void libhttppp::HttpForm::_parseUrlDecode(libhttppp::HttpRequest* request){ std::string value; char *urldecdValue=nullptr; char *urldecdKey=nullptr; key=formdat.substr(fdatstpos,keyendpos-fdatstpos); if(vlstpos<=formdat.length()){ value=formdat.substr(vlstpos,(fdatpos-vlstpos)); std::copy(data.begin()+fdatstpos,data.begin()+keyendpos,std::inserter<std::string>(key,key.begin())); if(vlstpos<=data.size()){ std::copy(data.begin()+vlstpos,data.begin()+fdatpos,std::inserter<std::string>(value,value.begin())); urlDecode(value.c_str(),value.length(),&urldecdValue); } urlDecode(key.c_str(),key.length(),&urldecdKey); Loading src/http.h +5 −2 Original line number Diff line number Diff line Loading @@ -144,6 +144,7 @@ namespace libhttppp { size_t getRequestLength(); const char *getRequestVersion(); size_t getContentLength(); size_t getMaxUploadSize(); /*mobilphone switch*/ bool isMobile(); Loading @@ -155,7 +156,9 @@ namespace libhttppp { /*only for post Reuquesttype*/ void setRequestData(const char *data,size_t len); void setMaxUploadSize(size_t upsize); void send(std::shared_ptr<netplus::socket> src,std::shared_ptr<netplus::socket> dest); private: std::string _Request; int _RequestType; Loading Loading @@ -292,10 +295,10 @@ namespace libhttppp { MultipartForm MultipartFormData; private: /*urldecoded*/ void _parseUrlDecode(HttpRequest *request); void _parseUrlDecode(const std::vector<char> &data); /*multiform*/ void _parseMulitpart(HttpRequest *request); void _parseMulitpart(const std::vector<char> &data); void _parseMultiSection(std::vector<char> &data,size_t start, size_t end); void _parseBoundary(const char *contenttype); std::vector<char> _Boundary; Loading src/httpd.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ #include "http.h" #include "httpd.h" #include "exception.h" #include "config.h" #define MAXDEFAULTCONN 1024 #define MBEDTLS_PSA_CRYPTO_CONFIG true Loading Loading @@ -77,9 +78,20 @@ void libhttppp::HttpEvent::RequestEvent(netplus::con* curcon){ cureq->clear(); break; case POSTREQUEST: if( cureq->RecvData.size() > cureq->getMaxUploadSize()){ HTTPException excep; excep[HTTPException::Note] << "Upload too big increase Max Upload Size"; throw excep; } if(cureq->getContentLength()<=cureq->RecvData.size()){ RequestEvent(cureq); cureq->clear(); if(cureq->getContentLength()==cureq->RecvData.size()) cureq->RecvData.clear(); else std::move(cureq->RecvData.begin()+cureq->getContentLength(),cureq->RecvData.end(), std::inserter<std::vector<char>>(cureq->RecvData,cureq->RecvData.begin())); } break; default: Loading Loading
src/http.cpp +46 −52 Original line number Diff line number Diff line Loading @@ -528,7 +528,7 @@ size_t libhttppp::HttpRequest::parse(){ } for(size_t cpos=pos; cpos<header.size(); ++cpos){ if(header[cpos]==' ' && (cpos-pos)<255){ if(header[cpos]=='\n' && (cpos-pos)<255){ std::copy(header.begin()+pos,header.begin()+cpos,std::inserter<std::string>(_RequestVersion,_RequestVersion.begin())); _RequestVersion.push_back('\0'); ++pos; Loading Loading @@ -576,14 +576,6 @@ size_t libhttppp::HttpRequest::parse(){ } } if(_RequestType==POSTREQUEST){ if( RecvData.size() > _MaxUploadSize){ RecvData.clear(); excep[HTTPException::Note] << "Upload too big increase Max Upload Size"; throw excep; } } std::move(RecvData.begin()+endpos,RecvData.end(),RecvData.begin()); RecvData.resize(RecvData.size()-endpos); Loading Loading @@ -644,6 +636,11 @@ size_t libhttppp::HttpRequest::getContentLength(){ return getDataInt(_ContentLength); } size_t libhttppp::HttpRequest::getMaxUploadSize(){ return _MaxUploadSize; } bool libhttppp::HttpRequest::isMobile(){ for(HttpHeader::HeaderData *curdat=_firstHeaderData; curdat; curdat=nextHeaderData(curdat)){ if(strcmp(getKey(curdat),"user-agent")==0){ Loading Loading @@ -723,18 +720,39 @@ libhttppp::HttpForm::~HttpForm(){ void libhttppp::HttpForm::parse(libhttppp::HttpRequest* request){ try{ if(request->getRequestType()==POSTREQUEST){ std::vector<char> bodydat; HttpHeader::HeaderData *ctype=request->getData("content-type"); _ContentType = request->getData(ctype); if(_ContentType && strncmp(_ContentType,"multipart/form-data",16)==0){ _parseMulitpart(request); _parseMulitpart(bodydat); }else{ _parseUrlDecode(request); size_t clen = request->getDataSizet(request->_ContentLength); if(request->RecvData.size()>= clen){ std::copy(request->RecvData.begin(),request->RecvData.begin()+clen, std::inserter<std::vector<char>>(bodydat,bodydat.begin())); bodydat.push_back('\0'); _parseUrlDecode(bodydat); } }else{ _parseUrlDecode(request); } } std::vector<char> urldat; const char *rurl=request->getRequest(); size_t rurlsize=strlen(rurl); ssize_t rdelimter=-1; for(size_t cpos=0; cpos<rurlsize; cpos++){ if(rurl[cpos]=='?'){ rdelimter=cpos; rdelimter++; break; } } if(rdelimter!=-1){ std::copy(rurl+rdelimter,rurl+rurlsize,std::inserter<std::vector<char>>(urldat,urldat.begin())); _parseUrlDecode(urldat); } }catch(...){} } Loading Loading @@ -810,7 +828,7 @@ void libhttppp::HttpForm::_parseBoundary(const char* contenttype){ _Boundary.push_back('\0'); } void libhttppp::HttpForm::_parseMulitpart(libhttppp::HttpRequest* request){ void libhttppp::HttpForm::_parseMulitpart(const std::vector<char> &data){ _parseBoundary(_ContentType); std::vector<char> realboundary; realboundary.resize(_Boundary.size()+2); Loading @@ -820,7 +838,7 @@ void libhttppp::HttpForm::_parseMulitpart(libhttppp::HttpRequest* request){ std::vector<char> req; std::copy(request->RecvData.begin(),request->RecvData.begin()+request->getContentLength(), std::copy(data.begin(),data.end(), std::inserter<std::vector<char>>(req,req.begin())); size_t realboundarypos=0; Loading Loading @@ -1137,37 +1155,13 @@ void libhttppp::HttpForm::MultipartForm::Data::addContent(Content content){ } void libhttppp::HttpForm::_parseUrlDecode(libhttppp::HttpRequest* request){ void libhttppp::HttpForm::_parseUrlDecode(const std::vector<char> &data){ HTTPException httpexception; std::string formdat; if(request->getRequestType()==POSTREQUEST){ size_t clen = request->getDataSizet(request->_ContentLength); if(request->RecvData.size()>= clen){ std::copy(request->RecvData.begin(),request->RecvData.begin()+clen,std::inserter<std::string>(formdat,formdat.begin())); formdat.push_back('\0'); } }else if(request->getRequestType()==GETREQUEST){ const char *rurl=request->getRequest(); size_t rurlsize=strlen(rurl); ssize_t rdelimter=-1; for(size_t cpos=0; cpos<rurlsize; cpos++){ if(rurl[cpos]=='?'){ rdelimter=cpos; rdelimter++; break; } } if(rdelimter!=-1){ formdat.append(rurl+rdelimter,rurlsize-rdelimter); } }else{ httpexception[HTTPException::Error] << "HttpForm unknown Requestype"; throw httpexception; } size_t fdatstpos=0; size_t keyendpos=0; for(size_t fdatpos=0; fdatpos<=formdat.length(); fdatpos++){ switch(formdat[fdatpos]){ for(size_t fdatpos=0; fdatpos<=data.size(); fdatpos++){ switch(data[fdatpos]){ case '&': case '\0':{ if(keyendpos >fdatstpos && keyendpos<fdatpos){ std::string key; Loading @@ -1175,9 +1169,9 @@ void libhttppp::HttpForm::_parseUrlDecode(libhttppp::HttpRequest* request){ std::string value; char *urldecdValue=nullptr; char *urldecdKey=nullptr; key=formdat.substr(fdatstpos,keyendpos-fdatstpos); if(vlstpos<=formdat.length()){ value=formdat.substr(vlstpos,(fdatpos-vlstpos)); std::copy(data.begin()+fdatstpos,data.begin()+keyendpos,std::inserter<std::string>(key,key.begin())); if(vlstpos<=data.size()){ std::copy(data.begin()+vlstpos,data.begin()+fdatpos,std::inserter<std::string>(value,value.begin())); urlDecode(value.c_str(),value.length(),&urldecdValue); } urlDecode(key.c_str(),key.length(),&urldecdKey); Loading
src/http.h +5 −2 Original line number Diff line number Diff line Loading @@ -144,6 +144,7 @@ namespace libhttppp { size_t getRequestLength(); const char *getRequestVersion(); size_t getContentLength(); size_t getMaxUploadSize(); /*mobilphone switch*/ bool isMobile(); Loading @@ -155,7 +156,9 @@ namespace libhttppp { /*only for post Reuquesttype*/ void setRequestData(const char *data,size_t len); void setMaxUploadSize(size_t upsize); void send(std::shared_ptr<netplus::socket> src,std::shared_ptr<netplus::socket> dest); private: std::string _Request; int _RequestType; Loading Loading @@ -292,10 +295,10 @@ namespace libhttppp { MultipartForm MultipartFormData; private: /*urldecoded*/ void _parseUrlDecode(HttpRequest *request); void _parseUrlDecode(const std::vector<char> &data); /*multiform*/ void _parseMulitpart(HttpRequest *request); void _parseMulitpart(const std::vector<char> &data); void _parseMultiSection(std::vector<char> &data,size_t start, size_t end); void _parseBoundary(const char *contenttype); std::vector<char> _Boundary; Loading
src/httpd.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ #include "http.h" #include "httpd.h" #include "exception.h" #include "config.h" #define MAXDEFAULTCONN 1024 #define MBEDTLS_PSA_CRYPTO_CONFIG true Loading Loading @@ -77,9 +78,20 @@ void libhttppp::HttpEvent::RequestEvent(netplus::con* curcon){ cureq->clear(); break; case POSTREQUEST: if( cureq->RecvData.size() > cureq->getMaxUploadSize()){ HTTPException excep; excep[HTTPException::Note] << "Upload too big increase Max Upload Size"; throw excep; } if(cureq->getContentLength()<=cureq->RecvData.size()){ RequestEvent(cureq); cureq->clear(); if(cureq->getContentLength()==cureq->RecvData.size()) cureq->RecvData.clear(); else std::move(cureq->RecvData.begin()+cureq->getContentLength(),cureq->RecvData.end(), std::inserter<std::vector<char>>(cureq->RecvData,cureq->RecvData.begin())); } break; default: Loading