OSDN Git Service

7347e9d1dc0f25d9ca5d629c3b719dba21284b80
[hmh/hhml.git] / lib / app.cc
1 #include "app.h"
2 #include "motorenv.h"
3 #include "util_const.h"
4 #include "util_check.h"
5 #include "util_string.h"
6 #include <boost/lexical_cast.hpp>
7 #include <string.h>
8 #include <iostream>
9 #include <stdlib.h>
10 #include <fcntl.h>
11
12 static bool  pcmp (char** a, const char* b, int n) {
13     int  rc = strncmp (*a, b, n);
14     if (rc == 0) {
15         *a += n;
16         return true;
17     } else {
18         return false;
19     }
20 }
21 #define cmp(a,b)        pcmp (&(a), (b), sizeof (b) - 1)
22 #define zcmp(a,b)       (strcmp ((a), (b)) == 0)
23
24 /*DOC:
25 =ml=
26
27 |table:|
28 |datastore:NAME|
29 |get-html:FILENAME|
30 |post-html:FILENAME|
31 |post-file-html:FILENAME|
32 |html:FILENAME|
33 |error-html:FILENAME|
34 |get-ml:FILENAME|
35 |post-ml:FILENAME|
36 |post-file-ml:FILENAME|
37 |ml:FILENAME|
38 |type:MIME-TYPE|
39 |to-code:ENCODING|
40 |post-limit:DATASIZE|
41 |post-file-limit:DATASIZE|
42 |random-cookie|
43 |random-url|
44 |no-cache|
45 |frame-options:[DENY|SAMEORIGIN]|
46 |dump|
47
48 */
49
50 void  AppEnv::readOption (int argc, char** argv, MotorEnv* env) {
51     int  i;
52     char*  p;
53
54     arg0 = ustring (argv[0]);
55
56 #ifdef TARGET_MLDUMP
57     debugDump = true;
58 #endif
59
60     for (i = 1; i < argc; i ++) {
61         p = argv[i];
62         if (cmp (p, "datastore:")) {
63             datastore = ustring (p);
64             if (! checkName (datastore))
65                 throw (datastore + uErrorBadDatastore);
66         } else if (cmp (p, "get-html:")) {
67             getHtml = ustring (p);
68             if (getHtml != uDash && ! checkResourceName (getHtml))
69                 throw (getHtml + uErrorBadFile);
70         } else if (cmp (p, "post-html:")) {
71             postHtml = ustring (p);
72             if (postHtml != uDash && ! checkResourceName (postHtml))
73                 throw (postHtml + uErrorBadFile);
74         } else if (cmp (p, "post-file-html:")) {
75             postFileHtml = ustring (p);
76             if (postFileHtml != uDash && ! checkResourceName (postFileHtml))
77                 throw (postFileHtml + uErrorBadFile);
78         } else if (cmp (p, "html:")) {
79             postFileHtml = postHtml = getHtml = ustring (p);
80             if (getHtml != uDash && ! checkResourceName (getHtml))
81                 throw (getHtml + uErrorBadFile);
82         } else if (cmp (p, "error-html:")) {
83             errorHtml = ustring (p);
84             if (errorHtml != uDash && ! checkResourceName (errorHtml))
85                 throw (errorHtml + uErrorBadFile);
86         } else if (cmp (p, "get-ml:")) {
87             getML = ustring (p);
88             if (getML != uDash && ! checkResourceName (getML))
89                 throw (getML + uErrorBadFile);
90         } else if (cmp (p, "post-ml:")) {
91             postML = ustring (p);
92             if (postML != uDash && ! checkResourceName (postML))
93                 throw (postML + uErrorBadFile);
94         } else if (cmp (p, "post-file-ml:")) {
95             postFileML = ustring (p);
96             if (postFileML != uDash && ! checkResourceName (postFileML))
97                 throw (postFileML + uErrorBadFile);
98         } else if (cmp (p, "ml:")) {
99             postML = getML = ustring (p);
100             if (getML != uDash && ! checkResourceName (getML))
101                 throw (getML + uErrorBadFile);
102         } else if (cmp (p, "type:")) {
103             mimetype = ustring (p);
104             if (! checkMimeType (mimetype))
105                 throw (mimetype + ": bad mime type.");
106         } else if (cmp (p, "to-code:")) {
107             ocode = ustring (p);
108             if (! checkName (ocode))
109                 throw (ocode + ": bad encoding name.");
110         } else if (cmp (p, "post-limit:")) {
111             postlimit = boost::lexical_cast <size_t> (p);
112             if (postlimit < 0) {
113                 postlimit = cPOSTLIMITDEFAULT;
114             } else if (postlimit > cPOSTLIMITHARD) {
115                 *env->log << "post-limit:" << postlimit << ": limit exceeded.\n";
116                 postlimit = cPOSTLIMITHARD;
117             }
118         } else if (cmp (p, "postfile-limit:")
119                    || cmp (p, "post-file-limit:")) {
120             postfilelimit = boost::lexical_cast <size_t> (p);
121             if (postfilelimit < 0) {
122                 postfilelimit = cPOSTFILELIMITDEFAULT;
123             } else if (postfilelimit > cPOSTFILELIMITHARD) {
124                 *env->log << "post-file-limit:" << postfilelimit << ": limit exceeded.\n";
125                 postfilelimit = cPOSTFILELIMITHARD;
126             }
127         } else if (zcmp (p, "random-cookie")) {
128             cacheControl = CC_COOKIE;
129         } else if (zcmp (p, "random-url")) {
130             cacheControl = CC_URL;
131         } else if (zcmp (p, "no-cache")) {
132             cacheControl = CC_NOCACHE;
133         } else if (cmp (p, "frame-options:")) {
134             if (zcmp (p, "DENY")) {
135                 frameOpt = FOPT_DENY;
136             } else if (zcmp (p, "SAMEORIGIN")) {
137                 frameOpt = FOPT_SAMEORIGIN;
138             } else {
139                 throw (ustring (CharConst ("frame-options:")) + p + ustring (CharConst (" bad option.")));
140             }
141         } else if (zcmp (p, "dump")) {
142             debugDump = true;
143         } else if (p[0] == ';' || p[0] == '(' || p[0] == '<') {
144             break;
145         } else {
146             throw (ustring (p) + ustring (": unrecognized parameter"));
147         }
148     }
149 }
150
151 void  AppEnv::setDefault () {
152     if (mimetype.size () == 0)
153         mimetype = ustring (CharConst (kMIME_HTML));
154     if (cacheControl == CC_NONE)
155         cacheControl = CC_COOKIE;
156 }
157
158 ustring  AppEnv::scriptName () {
159     return getenvString (kSCRIPT_FILENAME);
160 }
161
162 void  AppEnv::dump (std::ostream& out) {
163     out << arg0 << "\n";
164     if (datastore.size () > 0)
165         out << "        datastore:" << datastore << "\n";
166     if (getML.size () > 0) {
167         if (getML == postML) {
168             out << "    ml:" << getML << "\n";
169         } else {
170             out << "    get-ml:" << getML << "\n";
171             if (postML.size () > 0)
172                 out << "        post-ml:" << postML << "\n";
173         }
174     } else if (postML.size () > 0) {
175         out << "        post-ml:" << postML << "\n";
176     }
177     if (postFileML.size () > 0) {
178         out << "        post-file-ml:" << postFileML << "\n";
179     }
180     if (getHtml.size () > 0) {
181         if (getHtml == postHtml) {
182             out << "    html:" << getHtml << "\n";
183         } else {
184             out << "    get-html:" << getHtml << "\n";
185             if (postHtml.size () > 0)
186                 out << "        post-html:" << postHtml << "\n";
187         }
188     } else if (postHtml.size () > 0) {
189         out << "        post-html:" << postHtml << "\n";
190     }
191     if (postFileHtml.size () > 0) {
192         out << "        post-file-html:" << postFileHtml << "\n";
193     }
194     if (errorHtml.size () > 0)
195         out << "        error-html:" << errorHtml << "\n";
196     if (mimetype.size () > 0)
197         out << "        type:" << mimetype << "\n";
198     if (postlimit != cPOSTLIMITDEFAULT)
199         out << "        post-limit:" << postlimit << "\n";
200     if (postfilelimit != cPOSTFILELIMITDEFAULT)
201         out << "        post-file-limit:" << postfilelimit << "\n";
202     switch (cacheControl) {
203     case CC_COOKIE:
204         out << "        random-cookie\n";
205         break;
206     case CC_URL:
207         out << "        random-url\n";
208         break;
209     case CC_NOCACHE:
210         out << "        no-cache\n";
211         break;
212     }
213     switch (frameOpt) {
214     case FOPT_NONE:
215         break;
216     case FOPT_DENY:
217         out << "        frame-options:DENY\n";
218         break;
219     case FOPT_SAMEORIGIN:
220         out << "        frame-options:SAMEORIGIN\n";
221         break;
222     case FOPT_ALLOWFROM:
223         out << "        frame-options:ALLOW-FROM " << foptUri << "\n";
224         break;
225     default:;
226     }
227 #ifndef TARGET_MLDUMP
228     if (debugDump)
229         out << "        dump\n";
230 #endif
231 }
232
233 void  AppEnv::setErrorLog (const ustring& path, bool fappend) {
234     int  flag = O_WRONLY | O_CREAT;
235
236     if (fappend)
237         flag |= O_APPEND;
238     close (2);
239     open (path.c_str (), flag, 0666);
240 }