X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fhttp%2Fipagehandler.cpp;h=53211b116dfbcacdf401be05c3c03123258fd1cc;hb=023b2219068d481cd6a300982427c99bacd88a12;hp=8599c230271806f67a7fb19aec187b3fccb5ce7b;hpb=44f964d9b2b2d55a5b5672e9297717bd25fa8ee2;p=fms.git diff --git a/src/http/ipagehandler.cpp b/src/http/ipagehandler.cpp index 8599c23..53211b1 100644 --- a/src/http/ipagehandler.cpp +++ b/src/http/ipagehandler.cpp @@ -1,6 +1,8 @@ #include "../../include/http/ipagehandler.h" -#include "../../include/http/httpdefs.h" #include "../../include/stringfunctions.h" +#include "../../include/http/multipartparser.h" + +#include #include @@ -33,232 +35,79 @@ void IPageHandler::CreateArgArray(const std::map &vars, } } -const bool IPageHandler::Handle(shttpd_arg *arg) +const std::string IPageHandler::CreateTrueFalseDropDown(const std::string &name, const std::string &selected) { - const char *uri=shttpd_get_env(arg,"REQUEST_URI"); - const char *method=shttpd_get_env(arg,"REQUEST_METHOD"); - std::string methodstr=""; - if(method) + std::string rval=""; + + rval+=""; - 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]); - } - } - } - } + return rval; +} - 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(); - mystate->m_outdatapos=0; - } +void IPageHandler::CreateQueryVarMap(Poco::Net::HTTPServerRequest &request, std::map &vars) +{ + for(Poco::Net::HTTPServerRequest::ConstIterator i=request.begin(); i!=request.end(); i++) + { + vars[(*i).first]=(*i).second; + } - // if we have output data, push next block of data onto out buffer - if(mystate->m_outdata && mystate->m_outdataposm_outdatalen) - { - int pos=0; - while(mystate->m_outdataposm_outdatalen && posout.len) - { - arg->out.buf[pos++]=mystate->m_outdata[mystate->m_outdatapos++]; - } - arg->out.num_bytes=pos; - } + // handle HTMLForm and multiparts + MultiPartParser mpp; + Poco::Net::HTMLForm form(request,request.stream(),mpp); + for(Poco::Net::HTMLForm::ConstIterator i=form.begin(); i!=form.end(); i++) + { + vars[(*i).first]=(*i).second; + } - // if we have no more output data to send - delete the data pointers and set end of output flag - if(mystate->m_outdata && mystate->m_outdatapos==mystate->m_outdatalen) + // for a POST method, the HTMLForm won't grab vars off the query string so we + // temporarily set the method to GET and parse with the HTMLForm again + if(request.getMethod()=="POST") + { + request.setMethod("GET"); + Poco::Net::HTMLForm form1(request,request.stream(),mpp); + for(Poco::Net::HTMLForm::ConstIterator i=form1.begin(); i!=form1.end(); i++) { - if(mystate->m_indata) - { - delete [] mystate->m_indata; - } - if(mystate->m_outdata) - { - delete [] mystate->m_outdata; - } - delete mystate; - arg->state=NULL; - - arg->flags|=SHTTPD_END_OF_OUTPUT; + vars[(*i).first]=(*i).second; } - - return true; + request.setMethod("POST"); } - else + + // get any multiparts + std::map mpvars=mpp.GetVars(); + for(std::map::iterator i=mpvars.begin(); i!=mpvars.end(); i++) { - return false; + vars[(*i).first]=(*i).second; } + } -void IPageHandler::HandleMultiPartData(const std::string &contenttypeheader, char *data, const long datalen, std::map &args) +void IPageHandler::handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response) { - if(data) - { - std::string datastr(data,data+datalen); - std::vector parts; - std::string boundary=""; - std::string::size_type pos=contenttypeheader.find("boundary="); + m_log->trace("IPageHandler::handleRequest from "+request.clientAddress().toString()); - // find boundary - if(pos!=std::string::npos) - { - boundary=contenttypeheader.substr(pos+9); - // strip off any " and ; - boundary=StringFunctions::Replace(boundary,"\"",""); - boundary=StringFunctions::Replace(boundary,";",""); - } + std::map vars; - // split into parts separated by boundary - StringFunctions::Split(datastr,"--"+boundary+"\r\n",parts); - - // go through each part and get name=value - for(std::vector::iterator i=parts.begin(); i!=parts.end(); i++) - { - std::string data=""; - std::string name=""; + CreateQueryVarMap(request,vars); - // find name - pos=(*i).find("name="); - if(pos!=std::string::npos) - { - std::string::size_type pos2=(*i).find(";",pos); - if(pos2!=std::string::npos) - { - name=(*i).substr(pos+5,pos2-(pos+5)); - } - else - { - pos2=(*i).find("\r\n",pos); - if(pos2!=std::string::npos) - { - name=(*i).substr(pos+5,pos2-(pos+5)); - } - } + response.setChunkedTransferEncoding(true); + response.setContentType("text/html"); - name=StringFunctions::Replace(name,"\"",""); - } + std::ostream &ostr = response.send(); + ostr << GeneratePage(request.getMethod(),vars); - // find header boundary - pos=(*i).find("\r\n\r\n"); - if(pos!=std::string::npos) - { - data=(*i).substr(pos+4); - // strip off final \r\n from data - if(data.size()>2 && data.rfind("\r\n")==data.size()-2) - { - data.erase(data.size()-2); - } - } - if(name!="" && data!="") - { - args[name]=data; - } - } - } } const std::string IPageHandler::SanitizeOutput(const std::string &input)