version 0.1.6
[fms.git] / src / http / ipagehandler.cpp
1 #include "../../include/http/ipagehandler.h"\r
2 #include "../../include/http/httpdefs.h"\r
3 #include "../../include/stringfunctions.h"\r
4 \r
5 #ifdef XMEM\r
6         #include <xmem.h>\r
7 #endif\r
8 \r
9 const bool IPageHandler::Handle(shttpd_arg *arg)\r
10 {\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
14         if(method)\r
15         {\r
16                 methodstr=method;\r
17         }\r
18 \r
19         if(uri && WillHandleURI(std::string(uri)))\r
20         {\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
24                 {\r
25                         arg->state=new httpstate;\r
26                         memset(arg->state,0,sizeof(httpstate));\r
27                         mystate=(httpstate *)arg->state;\r
28 \r
29                         // if post then create input buffer\r
30                         if(methodstr=="POST")\r
31                         {\r
32                                 const char *lenstr=shttpd_get_header(arg,"Content-Length");\r
33                                 if(lenstr)\r
34                                 {\r
35                                         long len;\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
40                                 }\r
41                         }\r
42                 }\r
43 \r
44                 // we have more POST data to get\r
45                 if(arg->in.len>0)\r
46                 {\r
47                         int pos=0;\r
48                         while(arg->in.num_bytes<arg->in.len)\r
49                         {\r
50                                 mystate->m_indata[mystate->m_indatapos++]=arg->in.buf[pos++];\r
51                         }\r
52                         arg->in.num_bytes=arg->in.len;\r
53                 }\r
54 \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
57                 {\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
64                 }\r
65 \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
68                 {\r
69                         int pos=0;\r
70                         while(mystate->m_outdatapos<mystate->m_outdatalen && pos<arg->out.len)\r
71                         {\r
72                                 arg->out.buf[pos++]=mystate->m_outdata[mystate->m_outdatapos++];\r
73                         }\r
74                         arg->out.num_bytes=pos;\r
75                 }\r
76 \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
79                 {\r
80                         if(mystate->m_indata)\r
81                         {\r
82                                 delete mystate->m_indata;\r
83                         }\r
84                         if(mystate->m_outdata)\r
85                         {\r
86                                 delete mystate->m_outdata;\r
87                         }\r
88                         delete mystate;\r
89                         arg->state=NULL;\r
90 \r
91                         arg->flags|=SHTTPD_END_OF_OUTPUT;\r
92                 }\r
93 \r
94                 return true;\r
95         }\r
96         else\r
97         {\r
98                 return false;\r
99         }\r
100 }\r