1 #include "../../include/http/ipagehandler.h"
\r
2 #include "../../include/http/httpdefs.h"
\r
3 #include "../../include/stringfunctions.h"
\r
9 const bool IPageHandler::Handle(shttpd_arg *arg)
\r
11 const char *uri=shttpd_get_env(arg,"REQUEST_URI");
\r
12 const char *method=shttpd_get_env(arg,"REQUEST_METHOD");
\r
13 std::string methodstr="";
\r
19 if(uri && WillHandleURI(std::string(uri)))
\r
21 httpstate *mystate=(httpstate *)arg->state;
\r
22 // this is a new request - create a new arg object
\r
23 if(arg->state==NULL)
\r
25 arg->state=new httpstate;
\r
26 memset(arg->state,0,sizeof(httpstate));
\r
27 mystate=(httpstate *)arg->state;
\r
29 // if post then create input buffer
\r
30 if(methodstr=="POST")
\r
32 const char *lenstr=shttpd_get_header(arg,"Content-Length");
\r
36 StringFunctions::Convert(std::string(lenstr),len);
\r
37 mystate->m_indata=new char[len];
\r
38 mystate->m_indatalen=len;
\r
39 mystate->m_indatapos=0;
\r
44 // we have more POST data to get
\r
48 while(arg->in.num_bytes<arg->in.len)
\r
50 mystate->m_indata[mystate->m_indatapos++]=arg->in.buf[pos++];
\r
52 arg->in.num_bytes=arg->in.len;
\r
55 // we have all POST data (or it was 0 to begin with) - generate the page
\r
56 if(mystate->m_indatalen==mystate->m_indatapos && mystate->m_outdata==NULL)
\r
58 //TODO parse POST data and any QUERY_STRING before generating page
\r
59 std::string page=GeneratePage(methodstr,std::map<std::string,std::string>());
\r
60 mystate->m_outdata=new char[page.size()];
\r
61 memcpy(mystate->m_outdata,page.c_str(),page.size());
\r
62 mystate->m_outdatalen=page.size();
\r
63 mystate->m_outdatapos=0;
\r
66 // if we have output data, push next block of data onto out buffer
\r
67 if(mystate->m_outdata && mystate->m_outdatapos<mystate->m_outdatalen)
\r
70 while(mystate->m_outdatapos<mystate->m_outdatalen && pos<arg->out.len)
\r
72 arg->out.buf[pos++]=mystate->m_outdata[mystate->m_outdatapos++];
\r
74 arg->out.num_bytes=pos;
\r
77 // if we have no more output data to send - delete the data pointers and set end of output flag
\r
78 if(mystate->m_outdata && mystate->m_outdatapos==mystate->m_outdatalen)
\r
80 if(mystate->m_indata)
\r
82 delete mystate->m_indata;
\r
84 if(mystate->m_outdata)
\r
86 delete mystate->m_outdata;
\r
91 arg->flags|=SHTTPD_END_OF_OUTPUT;
\r