version 0.1.7
[fms.git] / src / http / ipagehandler.cpp
index 230da65..fc77815 100644 (file)
@@ -6,6 +6,31 @@
        #include <xmem.h>\r
 #endif\r
 \r
+void IPageHandler::CreateArgArray(const std::map<std::string,std::string> &vars, const std::string &basename, std::vector<std::string> &args)\r
+{\r
+       for(std::map<std::string,std::string>::const_iterator i=vars.begin(); i!=vars.end(); i++)\r
+       {\r
+               if((*i).first.find(basename)==0 && (*i).first.find("[")!=std::string::npos && (*i).first.find("]")!=std::string::npos)\r
+               {\r
+                       int index;\r
+                       std::string indexstr;\r
+                       std::string::size_type startpos;\r
+                       std::string::size_type endpos;\r
+                       startpos=(*i).first.find("[");\r
+                       endpos=(*i).first.find("]");\r
+\r
+                       indexstr=(*i).first.substr(startpos+1,(endpos-startpos)-1);\r
+                       StringFunctions::Convert(indexstr,index);\r
+\r
+                       while(args.size()<index+1)\r
+                       {\r
+                               args.push_back("");\r
+                       }\r
+                       args[index]=(*i).second;\r
+               }\r
+       }\r
+}\r
+\r
 const bool IPageHandler::Handle(shttpd_arg *arg)\r
 {\r
        const char *uri=shttpd_get_env(arg,"REQUEST_URI");\r
@@ -34,7 +59,8 @@ const bool IPageHandler::Handle(shttpd_arg *arg)
                                {\r
                                        long len;\r
                                        StringFunctions::Convert(std::string(lenstr),len);\r
-                                       mystate->m_indata=new char[len];\r
+                                       mystate->m_indata=new char[len+1];\r
+                                       mystate->m_indata[len]=NULL;\r
                                        mystate->m_indatalen=len;\r
                                        mystate->m_indatapos=0;\r
                                }\r
@@ -45,7 +71,7 @@ const bool IPageHandler::Handle(shttpd_arg *arg)
                if(arg->in.len>0)\r
                {\r
                        int pos=0;\r
-                       while(arg->in.num_bytes<arg->in.len)\r
+                       while(pos<arg->in.len)\r
                        {\r
                                mystate->m_indata[mystate->m_indatapos++]=arg->in.buf[pos++];\r
                        }\r
@@ -56,7 +82,32 @@ const bool IPageHandler::Handle(shttpd_arg *arg)
                if(mystate->m_indatalen==mystate->m_indatapos && mystate->m_outdata==NULL)\r
                {\r
                        //TODO parse POST data and any QUERY_STRING before generating page\r
-                       std::string page=GeneratePage(methodstr,std::map<std::string,std::string>());\r
+                       std::map<std::string,std::string> args;\r
+                       std::vector<std::string> argparts;\r
+                       \r
+                       if(mystate->m_indata)\r
+                       {\r
+                               StringFunctions::Split(mystate->m_indata,"&",argparts);\r
+                       }\r
+                       if(shttpd_get_env(arg,"QUERY_STRING"))\r
+                       {\r
+                               StringFunctions::Split(shttpd_get_env(arg,"QUERY_STRING"),"&",argparts);\r
+                       }\r
+                       for(std::vector<std::string>::iterator argi=argparts.begin(); argi!=argparts.end(); argi++)\r
+                       {\r
+                               std::vector<std::string> parts;\r
+                               StringFunctions::Split((*argi),"=",parts);\r
+                               if(parts.size()>0)\r
+                               {\r
+                                       args[StringFunctions::UriDecode(parts[0])];\r
+                                       if(parts.size()>1)\r
+                                       {\r
+                                               args[StringFunctions::UriDecode(parts[0])]=StringFunctions::UriDecode(parts[1]);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       std::string page=GeneratePage(methodstr,args);\r
                        mystate->m_outdata=new char[page.size()];\r
                        memcpy(mystate->m_outdata,page.c_str(),page.size());\r
                        mystate->m_outdatalen=page.size();\r
@@ -79,11 +130,11 @@ const bool IPageHandler::Handle(shttpd_arg *arg)
                {\r
                        if(mystate->m_indata)\r
                        {\r
-                               delete mystate->m_indata;\r
+                               delete [] mystate->m_indata;\r
                        }\r
                        if(mystate->m_outdata)\r
                        {\r
-                               delete mystate->m_outdata;\r
+                               delete [] mystate->m_outdata;\r
                        }\r
                        delete mystate;\r
                        arg->state=NULL;\r