Commit 62b3db6a authored by jan.koester's avatar jan.koester
Browse files

optimations

parent 66befed1
Loading
Loading
Loading
Loading
+46 −52
Original line number Diff line number Diff line
@@ -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;
@@ -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);

@@ -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){
@@ -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(...){}
}
@@ -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);
@@ -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;
@@ -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;
@@ -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);
+5 −2
Original line number Diff line number Diff line
@@ -144,6 +144,7 @@ namespace libhttppp {
    size_t            getRequestLength();
    const char       *getRequestVersion();
    size_t            getContentLength();
    size_t            getMaxUploadSize();

    /*mobilphone switch*/
    bool isMobile();
@@ -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;
@@ -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;
+12 −0
Original line number Diff line number Diff line
@@ -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
@@ -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: