X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fhttp%2Fipagehandler.cpp;fp=src%2Fhttp%2Fipagehandler.cpp;h=230da65e55e04491936e56f65a5726d5aba2f579;hb=d8ccfe2b3944adf07d35534459cdda19d15217c8;hp=0000000000000000000000000000000000000000;hpb=21f835f30b4e092c847bf4569a00995774f7330e;p=fms.git diff --git a/src/http/ipagehandler.cpp b/src/http/ipagehandler.cpp new file mode 100644 index 0000000..230da65 --- /dev/null +++ b/src/http/ipagehandler.cpp @@ -0,0 +1,100 @@ +#include "../../include/http/ipagehandler.h" +#include "../../include/http/httpdefs.h" +#include "../../include/stringfunctions.h" + +#ifdef XMEM + #include +#endif + +const bool IPageHandler::Handle(shttpd_arg *arg) +{ + const char *uri=shttpd_get_env(arg,"REQUEST_URI"); + const char *method=shttpd_get_env(arg,"REQUEST_METHOD"); + std::string methodstr=""; + if(method) + { + methodstr=method; + } + + if(uri && WillHandleURI(std::string(uri))) + { + httpstate *mystate=(httpstate *)arg->state; + // this is a new request - create a new arg object + if(arg->state==NULL) + { + arg->state=new httpstate; + memset(arg->state,0,sizeof(httpstate)); + mystate=(httpstate *)arg->state; + + // if post then create input buffer + if(methodstr=="POST") + { + const char *lenstr=shttpd_get_header(arg,"Content-Length"); + if(lenstr) + { + long len; + StringFunctions::Convert(std::string(lenstr),len); + mystate->m_indata=new char[len]; + mystate->m_indatalen=len; + mystate->m_indatapos=0; + } + } + } + + // we have more POST data to get + if(arg->in.len>0) + { + int pos=0; + while(arg->in.num_bytesin.len) + { + mystate->m_indata[mystate->m_indatapos++]=arg->in.buf[pos++]; + } + arg->in.num_bytes=arg->in.len; + } + + // 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()); + 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; + } + + // 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; + } + + // 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; + + arg->flags|=SHTTPD_END_OF_OUTPUT; + } + + return true; + } + else + { + return false; + } +}