#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
{\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
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
// we have all POST data (or it was 0 to begin with) - generate the page\r
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
+ //parse POST data and any QUERY_STRING before generating page\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
+ // replace + with space before UriDecoding\r
+ parts[0]=StringFunctions::Replace(parts[0],"+"," ");\r
+ args[StringFunctions::UriDecode(parts[0])];\r
+ if(parts.size()>1)\r
+ {\r
+ // replace + with space before UriDecoding\r
+ parts[1]=StringFunctions::Replace(parts[1],"+"," ");\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
{\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
return false;\r
}\r
}\r
+\r
+const std::string IPageHandler::SanitizeOutput(const std::string &input)\r
+{\r
+ // must do & first because all other elements have & in them!\r
+ std::string output=StringFunctions::Replace(input,"&","&");\r
+ output=StringFunctions::Replace(output,"<","<");\r
+ output=StringFunctions::Replace(output,">",">");\r
+ output=StringFunctions::Replace(output,"\"",""");\r
+ output=StringFunctions::Replace(output," "," ");\r
+ return output;\r
+}\r