X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fhttp%2Fipagehandler.cpp;h=c4ebbb9c2aceb469754fcc0b745d82e7d3af81b8;hb=b9c3763a932cebaa015a27fe111017f6f34dfbaa;hp=230da65e55e04491936e56f65a5726d5aba2f579;hpb=d8ccfe2b3944adf07d35534459cdda19d15217c8;p=fms.git diff --git a/src/http/ipagehandler.cpp b/src/http/ipagehandler.cpp index 230da65..c4ebbb9 100644 --- a/src/http/ipagehandler.cpp +++ b/src/http/ipagehandler.cpp @@ -6,6 +6,31 @@ #include #endif +void IPageHandler::CreateArgArray(const std::map &vars, const std::string &basename, std::vector &args) +{ + for(std::map::const_iterator i=vars.begin(); i!=vars.end(); i++) + { + if((*i).first.find(basename)==0 && (*i).first.find("[")!=std::string::npos && (*i).first.find("]")!=std::string::npos) + { + int index; + std::string indexstr; + std::string::size_type startpos; + std::string::size_type endpos; + startpos=(*i).first.find("["); + endpos=(*i).first.find("]"); + + indexstr=(*i).first.substr(startpos+1,(endpos-startpos)-1); + StringFunctions::Convert(indexstr,index); + + while(args.size()m_indata=new char[len]; + mystate->m_indata=new char[len+1]; + mystate->m_indata[len]=NULL; mystate->m_indatalen=len; mystate->m_indatapos=0; } @@ -45,7 +71,7 @@ const bool IPageHandler::Handle(shttpd_arg *arg) if(arg->in.len>0) { int pos=0; - while(arg->in.num_bytesin.len) + while(posin.len) { mystate->m_indata[mystate->m_indatapos++]=arg->in.buf[pos++]; } @@ -55,8 +81,37 @@ const bool IPageHandler::Handle(shttpd_arg *arg) // we have all POST data (or it was 0 to begin with) - generate the page if(mystate->m_indatalen==mystate->m_indatapos && mystate->m_outdata==NULL) { - //TODO parse POST data and any QUERY_STRING before generating page - std::string page=GeneratePage(methodstr,std::map()); + //parse POST data and any QUERY_STRING before generating page + std::map args; + std::vector argparts; + + if(mystate->m_indata) + { + StringFunctions::Split(mystate->m_indata,"&",argparts); + } + if(shttpd_get_env(arg,"QUERY_STRING")) + { + StringFunctions::Split(shttpd_get_env(arg,"QUERY_STRING"),"&",argparts); + } + for(std::vector::iterator argi=argparts.begin(); argi!=argparts.end(); argi++) + { + std::vector parts; + StringFunctions::Split((*argi),"=",parts); + if(parts.size()>0) + { + // replace + with space before UriDecoding + parts[0]=StringFunctions::Replace(parts[0],"+"," "); + args[StringFunctions::UriDecode(parts[0])]; + if(parts.size()>1) + { + // replace + with space before UriDecoding + parts[1]=StringFunctions::Replace(parts[1],"+"," "); + args[StringFunctions::UriDecode(parts[0])]=StringFunctions::UriDecode(parts[1]); + } + } + } + + std::string page=GeneratePage(methodstr,args); mystate->m_outdata=new char[page.size()]; memcpy(mystate->m_outdata,page.c_str(),page.size()); mystate->m_outdatalen=page.size(); @@ -79,11 +134,11 @@ const bool IPageHandler::Handle(shttpd_arg *arg) { if(mystate->m_indata) { - delete mystate->m_indata; + delete [] mystate->m_indata; } if(mystate->m_outdata) { - delete mystate->m_outdata; + delete [] mystate->m_outdata; } delete mystate; arg->state=NULL; @@ -98,3 +153,14 @@ const bool IPageHandler::Handle(shttpd_arg *arg) return false; } } + +const std::string IPageHandler::SanitizeOutput(const std::string &input) +{ + // must do & first because all other elements have & in them! + std::string output=StringFunctions::Replace(input,"&","&"); + output=StringFunctions::Replace(output,"<","<"); + output=StringFunctions::Replace(output,">",">"); + output=StringFunctions::Replace(output,"\"","""); + output=StringFunctions::Replace(output," "," "); + return output; +}