X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fhttp%2Fipagehandler.cpp;h=b8bef90e378c2aa43c8c481fa13bd3bc4f28223a;hb=dec33c63afafabf83c3039e916725cac6faef9b3;hp=3565aabb20707637d88160a6e6f604b764996f25;hpb=ee580d19b7920904587e18d72a3465d52eab6204;p=fms.git diff --git a/src/http/ipagehandler.cpp b/src/http/ipagehandler.cpp index 3565aab..b8bef90 100644 --- a/src/http/ipagehandler.cpp +++ b/src/http/ipagehandler.cpp @@ -1,6 +1,10 @@ #include "../../include/http/ipagehandler.h" -#include "../../include/http/httpdefs.h" #include "../../include/stringfunctions.h" +#include "../../include/http/multipartparser.h" + +#include + +#include #ifdef XMEM #include @@ -31,232 +35,66 @@ 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+=""; - // 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) - { - if(mystate->m_indata) - { - delete [] mystate->m_indata; - } - if(mystate->m_outdata) - { - delete [] mystate->m_outdata; - } - delete mystate; - arg->state=NULL; + return rval; +} - arg->flags|=SHTTPD_END_OF_OUTPUT; - } +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; + } - return true; + // 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; } - 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)