Commit 3c751a4e authored by jan.koester's avatar jan.koester
Browse files

post value is now parseable

parent ba97398c
Loading
Loading
Loading
Loading
+14 −19
Original line number Diff line number Diff line
@@ -69,25 +69,20 @@ private:

        if (curform.getBoundary()) {
            condat << "Boundary: " << curform.getBoundary() << "<br>";
            for (libhttppp::HttpForm::MultipartForm::Data* curformdat = curform.getMultipartFormData(); curformdat; curformdat = curformdat->nextMultipartFormData()) {
                condat << "Content-Disposition: <br>";
                libhttppp::HttpForm::MultipartFormData::ContentDisposition* curctdisp = curformdat->getContentDisposition();
                if (curctdisp->getDisposition())
                    condat << "Disposition: " << curctdisp->getDisposition() << "<br>";
                if (curctdisp->getName())
                    condat << "Name: " << curctdisp->getName() << "<br>";
                if (curctdisp->getFilename())
                    condat << "Filename: " << curctdisp->getFilename() << "<br>";
                condat << "Multiform Section Data<br>"
                    << "<div style=\"border: thin solid black\">";
                if (curformdat->getContentType())
                    condat << "ContentType: " << curformdat->getContentType() << "<br>\r\n";
                // condat << "Datasize: " << curformdat->getDataSize() << "<br> Data:<br>\n";
                // for (size_t datapos = 0; datapos < curformdat->getDataSize(); datapos++) {
                //     condat.push_back(curformdat->getData()[datapos]);
                //     if (curformdat->getData()[datapos] == '\n')
                //         condat << "<br>";
                // }
            for (libhttppp::HttpForm::MultipartForm::Data* curformdat = curform.MultipartFormData.getFormData(); curformdat; curformdat = curformdat->nextData()) {
                // condat << "Content-Disposition: <br>";
                // libhttppp::HttpForm::MultipartFormData::ContentDisposition* curctdisp = curformdat->getContentDisposition();
                // if (curctdisp->getDisposition())
                //     condat << "Disposition: " << curctdisp->getDisposition() << "<br>";
                // if (curctdisp->getName())
                //     condat << "Name: " << curctdisp->getName() << "<br>";
                // if (curctdisp->getFilename())
                //     condat << "Filename: " << curctdisp->getFilename() << "<br>";
                // condat << "Multiform Section Data<br>"
                //     << "<div style=\"border: thin solid black\">";
                if (!curformdat->Value.empty()){
                    condat.append(curformdat->Value.data());
                }
                condat << "\r\n<br></div>";
            }
        }
+43 −55
Original line number Diff line number Diff line
@@ -715,12 +715,10 @@ libhttppp::HttpRequest::~HttpRequest(){
}

libhttppp::HttpForm::HttpForm(){
  _Boundary=nullptr;
  _Elements=0;
}

libhttppp::HttpForm::~HttpForm(){
  delete[] _Boundary;
}


@@ -730,7 +728,7 @@ void libhttppp::HttpForm::parse(libhttppp::HttpRequest* request){
        HttpHeader::HeaderData *ctype=request->getData("content-type");
        _ContentType = request->getData(ctype);
        if(_ContentType &&
          strncmp(_ContentType,"multipart/form-data",18)==0){
          strncmp(_ContentType,"multipart/form-data",16)==0){
          _parseMulitpart(request);
        }else{
          _parseUrlDecode(request);
@@ -773,11 +771,11 @@ ssize_t libhttppp::HttpForm::urlDecode(const char *urlin,size_t urlinsize,char *
}

const char *libhttppp::HttpForm::getBoundary(){
  return _Boundary;  
  return _Boundary.data();
}

size_t libhttppp::HttpForm::getBoundarySize(){
  return _BoundarySize;
  return _Boundary.size();
}


@@ -807,56 +805,40 @@ void libhttppp::HttpForm::_parseBoundary(const char* contenttype){
    ctendpos=strlen(contenttype);
  /*cut boundary=*/
  ctstartpos+=strlen(boundary);
  if(_Boundary)
     delete[] _Boundary;
  _BoundarySize=(ctendpos-ctstartpos);
  _Boundary=new char[_BoundarySize+1];
  memcpy(_Boundary,contenttype+ctstartpos,(ctendpos-ctstartpos));
  _Boundary[(ctendpos-ctstartpos)]='\0';
  std::copy(contenttype+ctstartpos,contenttype+ctendpos,
            std::inserter<std::vector<char>>(_Boundary,_Boundary.begin()));
  _Boundary.push_back('\0');
}

void libhttppp::HttpForm::_parseMulitpart(libhttppp::HttpRequest* request){
    _parseBoundary(_ContentType);
    char *realboundary = new char[_BoundarySize+3];
    memcpy(realboundary+2,_Boundary,_BoundarySize+1);
    std::vector<char> realboundary;
    realboundary.resize(_Boundary.size()+2);
    std::copy(_Boundary.begin(),_Boundary.end(),realboundary.begin()+2);
    realboundary[0]='-';
    realboundary[1]='-';
    size_t realboundarylen=_BoundarySize+2;

    std::vector<char> req;

    std::copy(request->RecvData.begin(),request->RecvData.begin()+request->getContentLength(),
              std::inserter<std::vector<char>>(req,req.begin()));

    size_t realboundarypos=0;
    size_t datalength = 0;
    size_t datastart=std::string::npos;
    size_t oldpos=0;
    size_t cr=0;
    while(cr < req.size()){
    size_t oldpos=std::string::npos;

    for(size_t cr=0; cr < req.size(); cr++){
        //check if boundary
        if((char)tolower(req[cr++])==realboundary[realboundarypos++]){
        if((char)tolower(req[cr])==realboundary[realboundarypos++]){
            //check if boundary completed
            if((realboundarypos+1)==realboundarylen){
            if(realboundarypos==realboundary.size()-1){
                //ceck if boundary before found set data end
                if(datastart!=std::string::npos){
                    if(datalength>0)
                        _parseMultiSection(req,datastart,cr);
                    datastart=std::string::npos;
                }
                //set cr one higher to cut boundary
                cr++;
                //cut first new line
                while(req[cr]=='\r' || req[cr]=='\n'){
                    cr++;
                }
                datastart=req.at(cr);
                //store pos dor datalength
                oldpos=cr;
                if(oldpos!=std::string::npos)
                   _parseMultiSection(req,oldpos,cr-realboundary.size());
                oldpos=cr++;
                //check if boundary finished
                if(req[cr]=='-' && req[cr+1]=='-'){
                    //boundary finished
                    realboundarylen=0;
                    delete[] realboundary;
                    realboundary.clear();
                    return;
                }
            }
@@ -865,17 +847,16 @@ void libhttppp::HttpForm::_parseMulitpart(libhttppp::HttpRequest* request){
            realboundarypos=0;
        }
    }
    delete[] realboundary;
}

void libhttppp::HttpForm::_parseMultiSection(std::vector<char> &data,size_t start, size_t end){

  auto searchElement = [data](size_t start,size_t end, const char *word){
  auto searchElement = [data](size_t starts,size_t ends, const char *word){
    size_t wsize=strlen(word);
    for(size_t i=start; i< end; ++i){
    for(size_t i=starts; i< ends; ++i){
      for(size_t ii=0; ii<=wsize; ++ii){
        if(ii==wsize){
          return i-wsize;
          return i;
        }
        if( data[i]==word[ii]){
          ++i;
@@ -887,10 +868,8 @@ void libhttppp::HttpForm::_parseMultiSection(std::vector<char> &data,size_t star
    return std::string::npos;
  };

  size_t findel=start;
  size_t findel=searchElement(start,end,"\r\n\r\n");

  while(findel!=std::string::npos){
      findel=searchElement(findel,end,"\r\n\r\n");
  if(findel!=std::string::npos){
      if(MultipartFormData._firstData){
         MultipartFormData._lastData->_nextData =new MultipartForm::Data;
@@ -899,13 +878,22 @@ void libhttppp::HttpForm::_parseMultiSection(std::vector<char> &data,size_t star
         MultipartFormData._firstData=new MultipartForm::Data;
         MultipartFormData._lastData=MultipartFormData._firstData;
      }
          std::copy(data.begin()+findel,data.begin()+end,std::inserter<std::vector<char>>(MultipartFormData._lastData->_Value,
                                                                                          MultipartFormData._lastData->_Value.begin()));
      std::copy(data.begin()+findel,data.begin()+end,std::inserter<std::vector<char>>(MultipartFormData._lastData->Value,
                                                                                          MultipartFormData._lastData->Value.begin()));
  }

}

libhttppp::HttpForm::MultipartForm::Data * libhttppp::HttpForm::MultipartForm::Data::nextData(){
  return _nextData;
}


libhttppp::HttpForm::MultipartForm::Data * libhttppp::HttpForm::MultipartForm::getFormData(){
  return _firstData;
}


libhttppp::HttpForm::MultipartForm::MultipartForm(){
  _firstData=nullptr;
  _lastData=nullptr;
+6 −7
Original line number Diff line number Diff line
@@ -192,23 +192,23 @@ namespace libhttppp {
          friend class MultipartFormData;
        };
      public:

        ContentDisposition *getDisposition();
        void                addDisposition(ContentDisposition disposition);

        std::vector<char>   Value;
        Data               *nextData();
      private:
        Data();
        ~Data();
        ContentDisposition *_firstDisposition;
        ContentDisposition *_lastDisposition;
        std::vector<char>   _Value;
        Data               *_nextData;
        friend class HttpForm;
        friend class MultipartFormData;
      };
      

      const char         *getContentType();
      
      Data               *nextData();
      Data               *getFormData();

      MultipartForm();
      ~MultipartForm();
@@ -271,8 +271,7 @@ namespace libhttppp {
    void               _parseMulitpart(HttpRequest *request);
    void               _parseMultiSection(std::vector<char> &data,size_t start, size_t end);
    void               _parseBoundary(const char *contenttype);
    char              *_Boundary;
    size_t             _BoundarySize;
    std::vector<char>  _Boundary;
    
    /*both methods*/
    inline int         _ishex(int x);