1: /*************************************************************************
2: * (C) 2012 AITNET ltd - Sofia/Bulgaria - <misho@aitnet.org>
3: * by Michael Pounov <misho@elwix.org>
4: *
5: * $Author: misho $
6: * $Id: aitwww.h,v 1.4.2.1 2012/08/06 11:08:08 misho Exp $
7: *
8: **************************************************************************
9: The ELWIX and AITNET software is distributed under the following
10: terms:
11:
12: All of the documentation and software included in the ELWIX and AITNET
13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
14:
15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
16: by Michael Pounov <misho@elwix.org>. All rights reserved.
17:
18: Redistribution and use in source and binary forms, with or without
19: modification, are permitted provided that the following conditions
20: are met:
21: 1. Redistributions of source code must retain the above copyright
22: notice, this list of conditions and the following disclaimer.
23: 2. Redistributions in binary form must reproduce the above copyright
24: notice, this list of conditions and the following disclaimer in the
25: documentation and/or other materials provided with the distribution.
26: 3. All advertising materials mentioning features or use of this software
27: must display the following acknowledgement:
28: This product includes software developed by Michael Pounov <misho@elwix.org>
29: ELWIX - Embedded LightWeight unIX and its contributors.
30: 4. Neither the name of AITNET nor the names of its contributors
31: may be used to endorse or promote products derived from this software
32: without specific prior written permission.
33:
34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37: ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44: SUCH DAMAGE.
45: */
46: #ifndef __AITWWW_H
47: #define __AITWWW_H
48:
49:
50: #include <sys/types.h>
51: #include <sys/queue.h>
52: #include <sys/uio.h>
53: #include <aitio.h>
54:
55:
56: /* URL staff ... */
57:
58: typedef struct _tagURLItem {
59: int vallen;
60: char *value;
61: } url_Item_t;
62:
63: struct tagIOURL {
64: unsigned char url_line[BUFSIZ];
65:
66: url_Item_t url_tech;
67: url_Item_t url_user;
68: url_Item_t url_pass;
69: url_Item_t url_host;
70: url_Item_t url_port;
71: url_Item_t url_path;
72: url_Item_t url_args;
73:
74: char *url_reserved;
75: };
76:
77: struct tagReqXML {
78: unsigned char xml_line[BUFSIZ];
79:
80: url_Item_t xml_namespace;
81: union {
82: url_Item_t container;
83: url_Item_t path;
84: } xml_node;
85: url_Item_t xml_data;
86: url_Item_t xml_attribute;
87: url_Item_t xml_value;
88: };
89:
90: /* CGI variables */
91:
92: struct tagCGI {
93: ait_val_t *cgi_name;
94: ait_val_t *cgi_value;
95:
96: SLIST_ENTRY(tagCGI) cgi_node;
97: };
98: typedef SLIST_HEAD(, tagCGI) cgi_t;
99:
100: struct tagMIME;
101: typedef SLIST_HEAD(, tagMIME) mime_t;
102:
103: struct tagMIME {
104: cgi_t mime_header;
105:
106: struct iovec mime_body;
107: struct iovec mime_prolog;
108: struct iovec mime_epilog;
109:
110: mime_t *mime_attach;
111:
112: SLIST_ENTRY(tagMIME) mime_node;
113: };
114:
115: typedef int (*list_cb_t)(struct tagCGI *, void *);
116:
117:
118: // www_GetErrno() Get error code of last operation
119: inline int www_GetErrno();
120: // www_GetError() Get error text of last operation
121: inline const char *www_GetError();
122:
123:
124: /*
125: * www_initCGI() - Init CGI program
126: *
127: * return: NULL error or allocated cgi session
128: */
129: cgi_t *www_initCGI(void);
130: /*
131: * www_closeCGI() - Close and free all CGI resources
132: *
133: * @cgi = Inited cgi session
134: * return: none
135: */
136: void www_closeCGI(cgi_t ** __restrict cgi);
137: #define www_freeAttributes www_closeCGI
138: /*
139: * www_parseQuery() - Parse CGI query string
140: *
141: * @str = String
142: * return: NULL error or allocated cgi session
143: */
144: cgi_t *www_parseQuery(const char *str);
145: /*
146: * www_parseMultiPart() - Parse Multi part POST CGI query string
147: *
148: * @str = String
149: * @ctlen = Content length
150: * @ct = Content type
151: * return: NULL error or allocated cgi session
152: */
153: cgi_t *www_parseMultiPart(const char *str, int ctlen, const char *ct);
154: /*
155: * www_getValue() - Get Value from CGI session
156: *
157: * @cgi = Inited cgi session
158: * @name = Name of cgi variable
159: * return: NULL not found or !=NULL value
160: */
161: inline const char *www_getValue(cgi_t * __restrict cgi, const char *name);
162: /*
163: * www_addValue() - Add new or update if exists CGI variable
164: *
165: * @cgi = Inited cgi session
166: * @name = Name of cgi variable
167: * @value = Value of cgi variable
168: * return: -1 error, 0 add new one or 1 updated variable
169: */
170: int www_addValue(cgi_t * __restrict cgi, const char *name, const char *value);
171: /*
172: * www_delPair() - Delete CGI variable from session
173: *
174: * @cgi = Inited cgi session
175: * @name = Name of cgi variable
176: * return: -1 error, 0 not found or 1 deleted ok
177: */
178: int www_delPair(cgi_t * __restrict cgi, const char *name);
179: /*
180: * www_listPairs() - Walk over CGI session variables
181: *
182: * @cgi = Cgi session
183: * @func = If !=NULL call function for each element
184: * @arg = Optional argument pass through callback
185: * return: -1 error or >-1 number of elements
186: */
187: inline int www_listPairs(cgi_t * __restrict cgi, list_cb_t func, void *arg);
188:
189: /*
190: * www_header() - Output initial html header
191: *
192: * @output = file handle
193: * return: <1 error or >0 writed bytes
194: */
195: inline int www_header(FILE *output);
196:
197: /*
198: * www_parseAttributes() - Parse attributes
199: *
200: * @ct = Content type
201: * return: NULL error or !=NULL attributes
202: */
203: inline cgi_t *www_parseAttributes(const char **ct);
204: /*
205: * www_getAttribute() - Get Attribute from attribute session
206: *
207: * @cgi = Inited attribute session
208: * @name = Name of attribute variable
209: * return: NULL not found or !=NULL value
210: */
211: inline ait_val_t *www_getAttribute(cgi_t * __restrict cgi, const char *name);
212:
213:
214: /*
215: * www_cmp() - Compare two string
216: *
217: * @ct = content text from www
218: * @s = string
219: * return: 0 are equal or !0 are different
220: */
221: int www_cmp(const char *ct, const char *s);
222: /*
223: * www_cmptype() - Compare context type
224: *
225: * @ct = content text from www
226: * @type = content type
227: * return: 0 are equal or !0 are different
228: */
229: int www_cmptype(const char *ct, const char *type);
230: /*
231: * www_getpair() - Get AV pair from WWW query string
232: *
233: * @str = query string
234: * @delim = delimiter
235: * return: NULL error or AV pair, must be io_free() after use!
236: */
237: ait_val_t *www_getpair(char ** __restrict str, const char *delim);
238: /*
239: * www_x2c() - Hex from string to digit
240: *
241: * @str = string
242: * return: digit
243: */
244: inline char www_x2c(const char *str);
245: /*
246: * www_unescape() - Unescape/decode WWW query string to host string
247: *
248: * @str = string
249: * return: none
250: */
251: inline void www_unescape(char * __restrict str);
252: /*
253: * www_undot() - Undotted and clean WWW query filename
254: *
255: * @fname = query filename
256: * return: none
257: */
258: void www_undot(const char * __restrict fname);
259:
260:
261: /*
262: * www_URLGet() - Parse and get data from input URL
263: *
264: * @csURL = Input URL line
265: * @url = Output parsed URL
266: * return: 0 error format not find tech:// and return URL like path;
267: * -1 error:: can`t read; >0 ok, up bits for known elements
268: */
269: int www_URLGet(const char *csURL, struct tagIOURL *url);
270: /*
271: * www_URLGetFile() - Get file from parsed URL
272: *
273: * @url = Input parsed URL
274: * @psValue = Return filename, if not specified file in url path, replace with /
275: * @valLen = Size of psValue array
276: * return: -1 error:: can`t read; 0 ok
277: */
278: int www_URLGetFile(struct tagIOURL *url, char * __restrict psValue, int valLen);
279:
280: /*
281: * www_XMLGet() - Parse and get data from input XML request string
282: * [ns:]container[|attribute[=value]][?data]
283: *
284: * @csXML = Input XML request line
285: * @xml = Output parsed XML request
286: * return: 0 error format incorrect, -1 error:: can`t read; >0 ok readed elements bits
287: */
288: int www_XMLGet(const char *csXML, struct tagReqXML *xml);
289:
290:
291: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>