Commit ba97398c authored by jan.koester's avatar jan.koester
Browse files

a lot of work done of httpform parser

parent c104b1a1
Loading
Loading
Loading
Loading
+11 −14
Original line number Diff line number Diff line
@@ -72,29 +72,26 @@ public:
    const char *getData(const char *key){
        libhttppp::HttpForm curform;
        curform.parse(_Curreq);
        if(curform.getUrlcodedFormData()){
            for(libhttppp::HttpForm::UrlcodedFormData *cururlform=curform.getUrlcodedFormData(); cururlform; 
                cururlform=cururlform->nextUrlcodedFormData()){
        for(libhttppp::HttpForm::UrlcodedForm::Data *cururlform=curform.UrlFormData.getFormData() ; cururlform;
            cururlform=cururlform->nextData()){
            if(strcmp(key,cururlform->getKey())==0)
                return cururlform->getValue();
        }
        }

        return nullptr;
    }
    
    int getDataInt(const char *key){
        libhttppp::HttpForm curform;
        curform.parse(_Curreq);
        if(curform.getUrlcodedFormData()){
            for(libhttppp::HttpForm::UrlcodedFormData *cururlform=curform.getUrlcodedFormData(); cururlform; 
                cururlform=cururlform->nextUrlcodedFormData()){
        for(libhttppp::HttpForm::UrlcodedForm::Data *cururlform=curform.UrlFormData.getFormData(); cururlform;
            cururlform=cururlform->nextData()){
            if(strcmp(key,cururlform->getKey())==0){
                    char ktmp[255];
                    memcpy(ktmp,cururlform->getValue(),strlen(cururlform->getValue())+1);
                    return atoi(ktmp);
                }
        }
        }
        return 0;
    }
    
+16 −17
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string.h>

#include <iostream>
#include <netplus/eventapi.h>
#include <netplus/exception.h>

#include <htmlpp/html.h>

@@ -69,7 +69,7 @@ private:

        if (curform.getBoundary()) {
            condat << "Boundary: " << curform.getBoundary() << "<br>";
            for (libhttppp::HttpForm::MultipartFormData* curformdat = curform.getMultipartFormData(); curformdat; curformdat = curformdat->nextMultipartFormData()) {
            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())
@@ -82,12 +82,12 @@ private:
                    << "<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>";
                }
                // 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>";
                // }
                condat << "\r\n<br></div>";
            }
        }
@@ -96,15 +96,14 @@ private:
    void URlform(libhttppp::HttpRequest* curreq, libhtmlpp::HtmlString& condat) {
        libhttppp::HttpForm curform;
        curform.parse(curreq);
        if (curform.getUrlcodedFormData()) {
            for (libhttppp::HttpForm::UrlcodedFormData* cururlform = curform.getUrlcodedFormData(); cururlform;
                cururlform = cururlform->nextUrlcodedFormData()) {

        for (libhttppp::HttpForm::UrlcodedForm::Data* cururlform = curform.UrlFormData.getFormData(); cururlform;
             cururlform = cururlform->nextData()) {
            condat << "<span>"
                   << "Key: " << cururlform->getKey()
                   << " Value: " << cururlform->getValue()
                   << "</span><br/>";
        }
        }
    };

    void sendResponse(libhttppp::HttpRequest* curreq, libhtmlpp::HtmlString formdat) {
@@ -191,7 +190,7 @@ public:
    try {
      Controller controller(getServerSocket());
      controller.runEventloop();
    }catch(libhttppp::HTTPException &e){
    }catch(netplus::NetException &e){
      std::cerr << e.what() << std::endl;
    }
  };
+15 −9
Original line number Diff line number Diff line
@@ -25,10 +25,9 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/

#include <string.h>

#include <iostream>
#include <netplus/eventapi.h>

#include <netplus/exception.h>

#include "http.h"
#include "httpd.h"
@@ -43,7 +42,7 @@ public:
            libhttppp::HttpResponse curres;
            const char *hello="<!DOCTYPE html><html><head><title>hello</title></head><body>Hello World</body></html>";
            curres.setContentType("text/html");
            curres.send(curreq,hello,strlen(hello));
            curres.send(curreq,hello,85);
        }catch(libhttppp::HTTPException &e){
            std::cerr << e.what() << std::endl;
        }
@@ -58,13 +57,20 @@ public:
    try {
        Controller controller(getServerSocket());
        controller.runEventloop();
    }catch(libhttppp::HTTPException &e){
      std::cout << e.what() << std::endl;
    }catch(netplus::NetException &e){
        httpexception[libhttppp::HTTPException::Critical] << e.what();
        throw httpexception;
    }
  };
private:
};

int main(int argc, char** argv){
  try {
    HttpConD(argc,argv);
    return 0;
  }catch(libhttppp::HTTPException &e){
    std::cout << e.what() << std::endl;
    return -1;
  }
}
+224 −320

File changed.

Preview size limit exceeded, changes collapsed.

+67 −65
Original line number Diff line number Diff line
@@ -168,78 +168,87 @@ namespace libhttppp {
  
  class HttpForm {
  public:
    class MultipartFormData{
    class MultipartForm{
    public:
      class Content{
      class Data{
        class ContentDisposition{
        public:
          const char *getKey();
          const char *getValue();
          Content    *nextContent();

          void setKey(const char *key);
          void setValue(const char *value);

          ContentDisposition();
          ~ContentDisposition();

          ContentDisposition *nextContentDisposition();

        private:
         Content(const char *key,const char *value);
         ~Content();
         char    *_Key;
         char    *_Value;
         Content *_nextContent;
          ContentDisposition *_nextContentDisposition;
          std::vector<char>   _Key;
          std::vector<char>   _Value;
          friend class HttpForm;
          friend class MultipartFormData;
        };
      class ContentDisposition{
      public:
        char *getDisposition();
        char *getName();
        char *getFilename();
        
        void  setDisposition(const char *disposition);
        void  setName(const char *name);
        void  setFilename(const char *filename);
        ContentDisposition *getDisposition();
        void                addDisposition(ContentDisposition disposition);
      private:
        ContentDisposition();
        ~ContentDisposition();
        char *_Disposition;
        char *_Name;
        char *_Filename;
        Data();
        ~Data();
        ContentDisposition *_firstDisposition;
        ContentDisposition *_lastDisposition;
        std::vector<char>   _Value;
        Data               *_nextData;
        friend class HttpForm;
        friend class MultipartFormData;
      };
      ContentDisposition *getContentDisposition();
      
      const char         *getData();
      size_t              getDataSize();

      void                addContent(const char *key,const char *value);
      const char         *getContent(const char *key);
      const char         *getContentType();
      
      MultipartFormData  *nextMultipartFormData();
    private:
      MultipartFormData();
      ~MultipartFormData();
      Data               *nextData();

      Content            *_firstContent;
      Content            *_lastContent;
      MultipartForm();
      ~MultipartForm();
    private:
      Data               *_firstData;
      Data               *_lastData;

      void                _parseContentDisposition(const char *disposition);
      ContentDisposition *_ContentDisposition;

      const char         *_Data;
      size_t              _Datasize;
      MultipartFormData  *_nextMultipartFormData;
      friend class HttpForm;
    };
    
    class UrlcodedFormData{
    class UrlcodedForm{
    public:
      class Data {
        public:
          Data(Data &fdat);
          Data(const char *key,const char *value);
          ~Data();
          const char   *getKey();
          const char   *getValue();
      
          void          setKey(const char *key);
          void          setValue(const char *value);
      UrlcodedFormData  *nextUrlcodedFormData();
          Data         *nextData();
        private:
      UrlcodedFormData();
      ~UrlcodedFormData();
          std::string        _Key;
          std::string        _Value;
      UrlcodedFormData  *_nextUrlcodedFormData;
          Data              *_next;
          friend class HttpForm;
      };

      UrlcodedForm();
      ~UrlcodedForm();

      void  addFormData(Data &formdat);
      Data *getFormData();
    private:
      Data *_firstData;
      Data *_lastData;
      friend class HttpForm;
    };
    
@@ -249,28 +258,21 @@ namespace libhttppp {
    const char         *getContentType();
    /*urldecoded form*/
    ssize_t             urlDecode(const char *urlin,size_t urlinsize,char **urlout);
    UrlcodedFormData   *addUrlcodedFormData();
    UrlcodedFormData   *getUrlcodedFormData();
    
    UrlcodedForm        UrlFormData;
    /*multiform*/
    const char         *getBoundary();
    size_t              getBoundarySize();
    
    MultipartFormData  *getMultipartFormData();
    MultipartFormData  *addMultipartFormData();
    MultipartForm       MultipartFormData;
  private:
    /*urldecoded*/
    void               _parseUrlDecode(HttpRequest *request);
    UrlcodedFormData  *_firstUrlcodedFormData;
    UrlcodedFormData  *_lastUrlcodedFormData;

    /*multiform*/
    void               _parseMulitpart(HttpRequest *request);
    void               _parseMultiSection(const char *section,size_t sectionsize);
    void               _parseMultiSection(std::vector<char> &data,size_t start, size_t end);
    void               _parseBoundary(const char *contenttype);
    char              *_Boundary;
    size_t             _BoundarySize;
    MultipartFormData *_firstMultipartFormData;
    MultipartFormData *_lastMultipartFormData;
    
    /*both methods*/
    inline int         _ishex(int x);