Annotation of embedaddon/libpdel/http/servlet/http_servlet_tmpl.3, revision 1.1.1.1
1.1 misho 1: .\" Copyright (c) 2001-2002 Packet Design, LLC.
2: .\" All rights reserved.
3: .\"
4: .\" Subject to the following obligations and disclaimer of warranty,
5: .\" use and redistribution of this software, in source or object code
6: .\" forms, with or without modifications are expressly permitted by
7: .\" Packet Design; provided, however, that:
8: .\"
9: .\" (i) Any and all reproductions of the source or object code
10: .\" must include the copyright notice above and the following
11: .\" disclaimer of warranties; and
12: .\" (ii) No rights are granted, in any manner or form, to use
13: .\" Packet Design trademarks, including the mark "PACKET DESIGN"
14: .\" on advertising, endorsements, or otherwise except as such
15: .\" appears in the above copyright notice or in the software.
16: .\"
17: .\" THIS SOFTWARE IS BEING PROVIDED BY PACKET DESIGN "AS IS", AND
18: .\" TO THE MAXIMUM EXTENT PERMITTED BY LAW, PACKET DESIGN MAKES NO
19: .\" REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING
20: .\" THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED
21: .\" WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
22: .\" OR NON-INFRINGEMENT. PACKET DESIGN DOES NOT WARRANT, GUARANTEE,
23: .\" OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS
24: .\" OF THE USE OF THIS SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY,
25: .\" RELIABILITY OR OTHERWISE. IN NO EVENT SHALL PACKET DESIGN BE
26: .\" LIABLE FOR ANY DAMAGES RESULTING FROM OR ARISING OUT OF ANY USE
27: .\" OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY DIRECT,
28: .\" INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE, OR CONSEQUENTIAL
29: .\" DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF
30: .\" USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY THEORY OF
31: .\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32: .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
33: .\" THE USE OF THIS SOFTWARE, EVEN IF PACKET DESIGN IS ADVISED OF
34: .\" THE POSSIBILITY OF SUCH DAMAGE.
35: .\"
36: .\" Author: Archie Cobbs <archie@freebsd.org>
37: .\"
38: .\" $Id: http_servlet_tmpl.3,v 1.13 2004/06/02 17:24:37 archie Exp $
39: .\"
40: .Dd April 22, 2002
41: .Dt HTTP_SERVLET_TMPL 3
42: .Os
43: .Sh NAME
44: .Nm http_servlet_tmpl
45: .Nd HTTP servlet for template files
46: .Sh LIBRARY
47: PDEL Library (libpdel, \-lpdel)
48: .Sh SYNOPSIS
49: .In sys/types.h
50: .In stdio.h
51: .In netinet/in.h
52: .In openssl/ssl.h
53: .In pdel/tmpl/tmpl.h
54: .In pdel/http/http_defs.h
55: .In pdel/http/http_server.h
56: .In pdel/http/servlet/tmpl.h
57: .Ft "struct http_servlet *"
58: .Fn http_servlet_tmpl_create "struct http_servlet_tmpl_info *info"
59: .Vt extern tmpl_handler_t http_servlet_tmpl_func_query ;
60: .Vt extern tmpl_handler_t http_servlet_tmpl_func_query_exists ;
61: .Vt extern tmpl_handler_t http_servlet_tmpl_func_query_string ;
62: .Vt extern tmpl_handler_t http_servlet_tmpl_func_get_header ;
63: .Vt extern tmpl_handler_t http_servlet_tmpl_func_set_header ;
64: .Vt extern tmpl_handler_t http_servlet_tmpl_func_remove_header ;
65: .Vt extern tmpl_handler_t http_servlet_tmpl_func_redirect ;
66: .Vt extern tmpl_handler_t http_servlet_tmpl_func_unbuffer ;
67: .Sh DESCRIPTION
68: .Fn http_servlet_tmpl_create
69: creates a new servlet that serves HTTP requests by executing a
70: .Xr tmpl 3
71: template file.
72: The output of the template is sent as the body of the HTTP response.
73: By default, the template output is buffered in memory and after
74: template execution has finished the HTTP response is sent.
75: .Pp
76: .Fa info
77: is a pointer to a
78: .Li "struct http_servlet_tmpl_info" ,
79: which contains a
80: .Li "struct http_servlet_tmpl_tinfo" :
81: .Pp
82: .Bd -literal -compact -offset 3n
83: /* Function to free user 'arg' */
84: typedef void http_servlet_tmpl_free_t(void *arg);
85:
86: /* Information required by tmpl(3) library */
87: struct http_servlet_tmpl_tinfo {
88: int flags; /* tmpl_execute() flags */
89: const char *mtype; /* tmpl string mem type */
90: tmpl_handler_t *handler; /* tmpl function handler */
91: tmpl_errfmtr_t *errfmtr; /* tmpl error formatter */
92: void *arg; /* opaque argument */
93: http_servlet_tmpl_free_t *freer; /* destructor for 'arg' */
94: };
95:
96: /* Information required for the tmpl servlet */
97: struct http_servlet_tmpl_info {
98: const char *path; /* template file */
99: const char *mime_type; /* default mime type */
100: const char *mime_encoding; /* default mime encoding */
101: http_logger_t *logger; /* http error logger */
102: struct http_servlet_tmpl_tinfo tinfo; /* info for tmpl(3) */
103: };
104: .Ed
105: .Pp
106: .Fa path
107: is the pathname of the template file.
108: The file is parsed when the servlet is first executed, and the parsed
109: template is cached for use by subsequent servlet invocations.
110: If the file modification timestamp changes, the file is parsed again.
111: .Pp
112: .Fa mime_type
113: and
114: .Fa mime_encoding
115: specify the default MIME type and encoding for the template output.
116: The template itself may change the MIME type however.
117: If
118: .Fa mime_type
119: is
120: .Dv NULL ,
121: "text/html; charset=iso-8859-1" is used.
122: .Pp
123: The
124: .Fa logger
125: is a logging function whose type is defined in
126: .Xr http_server 3 .
127: .Pp
128: The
129: .Fa tinfo
130: structure provides information required by the
131: .Xr tmpl 3
132: library in order to create and execute the template.
133: The
134: .Fa mtype ,
135: .Fa handler ,
136: and
137: .Fa errfmtr
138: fields are passed to
139: .Fn tmpl_ctx_create ;
140: The
141: .Fa flags
142: field is passed to
143: .Fn tmpl_execute .
144: .Pp
145: The
146: .Fa arg
147: field is copied into a
148: .Li "struct http_servlet_tmpl_arg" ,
149: and a pointer to this structure is used as the user cookie field
150: .Fa arg
151: passed to
152: .Fn tmpl_ctx_create :
153: .Pp
154: .Bd -literal -compact -offset 3n
155: struct http_servlet_tmpl_arg {
156: void *arg; /* arg from 'tinfo' */
157: struct http_request *req; /* http request */
158: struct http_response *resp; /* http response */
159: };
160: .Ed
161: .Pp
162: Therefore, by casting the pointer returned from
163: .Fn tmpl_ctx_get_arg
164: to a
165: .Li "struct http_servlet_tmpl_arg *" ,
166: .Fn handler
167: can access both the original
168: .Fa arg
169: as well as the HTTP request and response objects.
170: .Pp
171: For an HTTP POST with MIME type
172: .Dq application/x-www-form-urlencoded
173: the servlet will automatically read in the URL-encoded name, value pairs,
174: making them accessible via
175: .Xr http_request_get_value 3
176: (see also
177: .Fn http_servlet_tmpl_func_query
178: below).
179: .Pp
180: When the servlet is destroyed, if the
181: .Fa freer
182: field is not
183: .Dv NULL ,
184: it is invoked to release resources associated with
185: .Fa arg .
186: .\"
187: .Ss Built-in template functions
188: .\"
189: The
190: .Nm http_servlet_tmpl
191: servlet includes the following built-in
192: .Xr tmpl 3
193: user functions.
194: These functions all assume the
195: .Xr tmpl 3
196: user cookie is a
197: .Li "struct http_servlet_tmpl_arg *".
198: .Pp
199: .Bl -hang -offset 3n -width 3n
200: .It Fn http_servlet_tmpl_func_query
201: This function takes exactly one argument, which is the name of a field
202: in an HTML form, and returns the value of that field as submitted by
203: the remote client.
204: This function works for both GET and POST form submissions.
205: If no such field was submitted, the empty string is returned.
206: .It Fn http_servlet_tmpl_func_query_exists
207: This function takes exactly one argument, which is the name of a field
208: in an HTML form, and returns "1" or "0" depending on whether a field
209: having that name was submitted by the client.
210: .It Fn http_servlet_tmpl_func_query_string
211: Takes zero arguments. Returns the HTTP query string.
212: .It Fn http_servlet_tmpl_func_get_header
213: Takes one argument, and returns the contents of the HTTP header having
214: that name.
215: .It Fn http_servlet_tmpl_func_set_header
216: Takes two arguments, the name of an HTTP header and its value, and
217: sets the corresponding HTTP response header.
218: This function has no effect if the headers have already been sent.
219: .It Fn http_servlet_tmpl_func_remove_header
220: Takes one argument, the name of an HTTP header, and removes the
221: corresponding HTTP response header.
222: This function has no effect if the headers have already been sent.
223: .It Fn http_servlet_tmpl_func_redirect
224: Takes one argument, which must be a valid URL.
225: Forces an HTTP redirect response to the URL.
226: This function only works if the servlet has not created any output yet.
227: .It Fn http_servlet_tmpl_func_unbuffer
228: Takes zero arguments.
229: Unbuffers the servlet output, so that the output is written
230: directly to the network instead of first into a memory buffer.
231: This is done by calling
232: .Xr http_response_send_headers 3
233: with a non-zero
234: .Fa unbuffer
235: argument.
236: This function should be called in servlets that produce a high
237: volume of output.
238: You can't modify the HTTP response headers once this has been called.
239: .El
240: .Pp
241: The
242: .Nm http_servlet_tmpl
243: servlet by default buffers the entire template output
244: to facilitate HTTP keep-alive.
245: For templates that generate voluminous output, this could consume
246: excessive memory.
247: The solution is to implement a template function using
248: .Fn http_servlet_tmpl_func_unbuffer
249: and invoke this function within those templates.
250: .Sh IMPLEMENTATION NOTES
251: Multiple instances of the same
252: .Nm http_servlet_tmpl
253: servlet may be executing at the same time.
254: Therefore, any user-supplied template functions called must
255: be thread-safe.
256: .Pp
257: Since it's running as a servlet, the thread executing
258: .Fn handler
259: and
260: .Fn errfmtr
261: may be canceled at any cancellation point.
262: Therefore, these functions should be written so as to not leak
263: resources if this happens.
264: .Sh RETURN VALUES
265: On failure,
266: .Fn http_servlet_tmpl_create
267: returns
268: .Dv NULL
269: and sets
270: .Va errno
271: to an appropriate value.
272: .Pp
273: The built-in
274: .Xr tmpl 3
275: user functions return
276: .Dv NULL
277: with
278: .Va errno
279: set to
280: .Er EINVAL
281: if the wrong number of arguments is passed.
282: They may also return
283: .Dv NULL
284: with
285: .Va errno
286: set as a result of other system errors.
287: .Sh SEE ALSO
288: .Xr http_request 3 ,
289: .Xr http_response 3 ,
290: .Xr http_server 3 ,
291: .Xr http_servlet 3 ,
292: .Xr libpdel 3 ,
293: .Xr tmpl 3
294: .Sh HISTORY
295: The PDEL library was developed at Packet Design, LLC.
296: .Dv "http://www.packetdesign.com/"
297: .Sh AUTHORS
298: .An Archie Cobbs Aq archie@freebsd.org
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>