version 0.3.4
[fms.git] / src / http / ipagehandler.cpp
1 #include "../../include/http/ipagehandler.h"\r
2 #include "../../include/stringfunctions.h"\r
3 #include "../../include/http/multipartparser.h"\r
4 \r
5 #include <Poco/Net/HTMLForm.h>\r
6 \r
7 #include <cstring>\r
8 \r
9 #ifdef XMEM\r
10         #include <xmem.h>\r
11 #endif\r
12 \r
13 void IPageHandler::CreateArgArray(const std::map<std::string,std::string> &vars, const std::string &basename, std::vector<std::string> &args)\r
14 {\r
15         for(std::map<std::string,std::string>::const_iterator i=vars.begin(); i!=vars.end(); i++)\r
16         {\r
17                 if((*i).first.find(basename)==0 && (*i).first.find("[")!=std::string::npos && (*i).first.find("]")!=std::string::npos)\r
18                 {\r
19                         int index=0;\r
20                         std::string indexstr;\r
21                         std::string::size_type startpos;\r
22                         std::string::size_type endpos;\r
23                         startpos=(*i).first.find("[");\r
24                         endpos=(*i).first.find("]");\r
25 \r
26                         indexstr=(*i).first.substr(startpos+1,(endpos-startpos)-1);\r
27                         StringFunctions::Convert(indexstr,index);\r
28 \r
29                         while(args.size()<index+1)\r
30                         {\r
31                                 args.push_back("");\r
32                         }\r
33                         args[index]=(*i).second;\r
34                 }\r
35         }\r
36 }\r
37 \r
38 const std::string IPageHandler::CreateTrueFalseDropDown(const std::string &name, const std::string &selected)\r
39 {\r
40         std::string rval="";\r
41 \r
42         rval+="<select name=\""+name+"\">";\r
43         rval+="<option value=\"true\"";\r
44         if(selected=="true")\r
45         {\r
46                 rval+=" SELECTED";\r
47         }\r
48         rval+=">true</option>";\r
49         rval+="<option value=\"false\"";\r
50         if(selected=="false")\r
51         {\r
52                 rval+=" SELECTED";\r
53         }\r
54         rval+=">false</option>";\r
55         rval+="</select>";\r
56 \r
57         return rval;\r
58 }\r
59 \r
60 void IPageHandler::CreateQueryVarMap(Poco::Net::HTTPServerRequest &request, std::map<std::string,std::string> &vars)\r
61 {\r
62         for(Poco::Net::HTTPServerRequest::ConstIterator i=request.begin(); i!=request.end(); i++)\r
63         {\r
64                 vars[(*i).first]=(*i).second;\r
65         }\r
66 \r
67         // handle HTMLForm and multiparts\r
68         MultiPartParser mpp;\r
69         Poco::Net::HTMLForm form(request,request.stream(),mpp);\r
70         for(Poco::Net::HTMLForm::ConstIterator i=form.begin(); i!=form.end(); i++)\r
71         {\r
72                 vars[(*i).first]=(*i).second;\r
73         }\r
74 \r
75         // for a POST method, the HTMLForm won't grab vars off the query string so we\r
76         // temporarily set the method to GET and parse with the HTMLForm again\r
77         if(request.getMethod()=="POST")\r
78         {\r
79                 request.setMethod("GET");\r
80                 Poco::Net::HTMLForm form1(request,request.stream(),mpp);\r
81                 for(Poco::Net::HTMLForm::ConstIterator i=form1.begin(); i!=form1.end(); i++)\r
82                 {\r
83                         vars[(*i).first]=(*i).second;\r
84                 }\r
85                 request.setMethod("POST");\r
86         }\r
87 \r
88         // get any multiparts\r
89         std::map<std::string,std::string> mpvars=mpp.GetVars();\r
90         for(std::map<std::string,std::string>::iterator i=mpvars.begin(); i!=mpvars.end(); i++)\r
91         {\r
92                 vars[(*i).first]=(*i).second;\r
93         }\r
94 \r
95 }\r
96 \r
97 void IPageHandler::handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response)\r
98 {\r
99         m_log->trace("IPageHandler::handleRequest from "+request.clientAddress().toString());\r
100 \r
101         std::map<std::string,std::string> vars;\r
102 \r
103         CreateQueryVarMap(request,vars);\r
104 \r
105         response.setChunkedTransferEncoding(true);\r
106         response.setContentType("text/html");\r
107 \r
108         std::ostream &ostr = response.send();\r
109         ostr << GeneratePage(request.getMethod(),vars);\r
110 \r
111 }\r
112 \r
113 const std::string IPageHandler::SanitizeOutput(const std::string &input)\r
114 {\r
115         // must do & first because all other elements have & in them!\r
116         std::string output=StringFunctions::Replace(input,"&","&amp;");\r
117         output=StringFunctions::Replace(output,"<","&lt;");\r
118         output=StringFunctions::Replace(output,">","&gt;");\r
119         output=StringFunctions::Replace(output,"\"","&quot;");\r
120         output=StringFunctions::Replace(output," ","&nbsp;");\r
121         return output;\r
122 }\r