b8bef90e378c2aa43c8c481fa13bd3bc4f28223a
[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         // get any multiparts\r
76         std::map<std::string,std::string> mpvars=mpp.GetVars();\r
77         for(std::map<std::string,std::string>::iterator i=mpvars.begin(); i!=mpvars.end(); i++)\r
78         {\r
79                 vars[(*i).first]=(*i).second;\r
80         }\r
81 \r
82 }\r
83 \r
84 void IPageHandler::handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response)\r
85 {\r
86         m_log->trace("IPageHandler::handleRequest from "+request.clientAddress().toString());\r
87 \r
88         std::map<std::string,std::string> vars;\r
89 \r
90         CreateQueryVarMap(request,vars);\r
91 \r
92         response.setChunkedTransferEncoding(true);\r
93         response.setContentType("text/html");\r
94 \r
95         std::ostream &ostr = response.send();\r
96         ostr << GeneratePage(request.getMethod(),vars);\r
97 \r
98 }\r
99 \r
100 const std::string IPageHandler::SanitizeOutput(const std::string &input)\r
101 {\r
102         // must do & first because all other elements have & in them!\r
103         std::string output=StringFunctions::Replace(input,"&","&amp;");\r
104         output=StringFunctions::Replace(output,"<","&lt;");\r
105         output=StringFunctions::Replace(output,">","&gt;");\r
106         output=StringFunctions::Replace(output,"\"","&quot;");\r
107         output=StringFunctions::Replace(output," ","&nbsp;");\r
108         return output;\r
109 }\r