Annotation of embedaddon/libpdel/http/http_request.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_request.3,v 1.13 2004/06/02 17:24:36 archie Exp $
39: .\"
40: .Dd April 22, 2002
41: .Dt HTTP_REQUEST 3
42: .Os
43: .Sh NAME
44: .Nm http_request
45: .Nd HTTP request object
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/http/http_defs.h
54: .In pdel/http/http_server.h
55: .\"
56: .Ss Accessors
57: .\"
58: .Ft "const char *"
59: .Fn http_request_get_method "struct http_request *req"
60: .Ft "int"
61: .Fn http_request_set_method "struct http_request *req" "const char *method"
62: .Ft "const char *"
63: .Fn http_request_get_uri "struct http_request *req"
64: .Ft "const char *"
65: .Fn http_request_get_path "struct http_request *req"
66: .Ft "int"
67: .Fn http_request_set_path "struct http_request *req" "const char *path"
68: .Ft "const char *"
69: .Fn http_request_get_version "struct http_request *req"
70: .Ft "const char *"
71: .Fn http_request_get_query_string "struct http_request *req"
72: .Ft "const char *"
73: .Fn http_request_get_host "struct http_request *req"
74: .Ft "struct in_addr"
75: .Fn http_request_get_remote_ip "struct http_request *req"
76: .Ft "u_int16_t"
77: .Fn http_request_get_remote_port "struct http_request *req"
78: .Ft "SSL_CTX *"
79: .Fn http_request_get_ssl "struct http_request *req"
80: .\"
81: .Ss "HTTP Headers"
82: .\"
83: .Ft "const char *"
84: .Fn http_request_get_header "struct http_request *req" "const char *name"
85: .Ft "int"
86: .Fn http_request_num_headers "struct http_request *req"
87: .Ft "int"
88: .Fn http_request_get_header_by_index "struct http_request *req" "u_int index" "const char **namep" "const char **valuep"
89: .Ft "int"
90: .Fn http_request_set_header "struct http_request *req" "int append" "const char *name" "const char *valfmt" "..."
91: .Ft "int"
92: .Fn http_request_remove_header "struct http_request *req" "const char *name"
93: .Ft "int"
94: .Fn http_request_send_headers "struct http_request *req"
95: .\"
96: .Ss "HTTP Body"
97: .\"
98: .Ft "FILE *"
99: .Fn http_request_get_input "struct http_request *req"
100: .Ft "FILE *"
101: .Fn http_request_get_output "struct http_request *req" "int buffer"
102: .\"
103: .Ss "HTTP Basic Authorization"
104: .\"
105: .Ft "const char *"
106: .Fn http_request_get_username "struct http_request *req"
107: .Ft "const char *"
108: .Fn http_request_get_password "struct http_request *req"
109: .Ft "char *"
110: .Fn http_request_encode_basic_auth "const char *mtype" "const char *username" "const char *password"
111: .\"
112: .Ss "Name/Value Pairs"
113: .\"
114: .Ft "const char *"
115: .Fn http_request_get_value "struct http_request *req" "const char *name" "int instance"
116: .Ft "int"
117: .Fn http_request_set_value "struct http_request *req" "const char *name" "const char *value"
118: .Ft int
119: .Fn http_request_get_num_values "struct http_request *req"
120: .Ft int
121: .Fn http_request_get_value_by_index "struct http_request *req" "int index" "const char **name" "const char **value"
122: .Ft "int"
123: .Fn http_request_set_query_from_values "struct http_request *req"
124: .Ft "int"
125: .Fn http_request_read_url_encoded_values "struct http_request *req"
126: .Ft "int"
127: .Fn http_request_write_url_encoded_values "struct http_request *req"
128: .\"
129: .Ss "MIME Multi-Part Support"
130: .\"
131: .Ft int
132: .Fn http_request_get_mime_multiparts "struct http_request *req" "http_mime_handler_t *handler" "void *arg"
133: .Ft "struct mime_multipart *"
134: .Fn http_request_read_mime_multipart "struct http_request *req"
135: .Ft "int"
136: .Fn http_request_file_upload "struct http_request *req" "const char *field" "FILE *fp" "size_t max"
137: .\"
138: .Ss Miscellaneous
139: .\"
140: .Ft "char *"
141: .Fn http_request_url_encode "const char *mtype" "const char *string"
142: .Ft "void"
143: .Fn http_request_url_decode "const char *s" "char *t"
144: .Ft "time_t"
145: .Fn http_request_parse_time "const char *string"
146: .Ft "void "
147: .Fn http_request_set_proxy "struct http_request *req" "int whether"
148: .Ft "int"
149: .Fn http_request_get_raw_socket "struct http_request *req"
150: .\"
151: .Sh DESCRIPTION
152: .\"
153: The
154: .Nm http_request
155: object is used by the PDEL HTTP library to represent an HTTP request.
156: An HTTP request may be associated with an HTTP client (the request is
157: generated locally) or an HTTP server (the request is generated remotely).
158: Some of the functions and values defined below only make sense in one
159: of these cases.
160: .Pp
161: .Nm http_request
162: objects are not created directly; rather, they are obtained from another
163: object which is associated with the HTTP connection.
164: They are freed automatically (and become invalid) when the corresponding
165: HTTP connection object is closed.
166: .\"
167: .Ss Accessors
168: .\"
169: .Fn http_request_get_method
170: returns the HTTP method, typically "GET" or "POST" but others are possible.
171: .Pp
172: .Fn http_request_set_method
173: sets the method for a request when the local side is the client.
174: .Pp
175: .Fn http_request_get_uri
176: gets the URI from the request.
177: This is the requested resource exactly as the client requested it,
178: before any URL-decoding.
179: The first character of this string will always be '/' for non-proxy requests.
180: .Pp
181: .Fn http_request_get_path
182: returns the path part of the URI, after URL-decoding has taken place.
183: This does not include the '?' and query string part, if any.
184: The first character of this string will always be '/'.
185: .Pp
186: .Fn http_request_set_path
187: sets the path for a request.
188: The first character must be '/'.
189: .Pp
190: .Fn http_request_get_version
191: returns the version string for this request.
192: Typically one of "HTTP/0.9", "HTTP/1.0", or "HTTP/1.1".
193: .Pp
194: .Fn http_request_get_query_string
195: returns the HTTP query string (which optionally appears at the end of
196: an URL after a '?' character), or the empty string if there is no query string.
197: The returned string is exactly as it was submitted by the client,
198: i.e., no URL-decoding has been performed on it.
199: .Pp
200: .Fn http_request_get_host
201: returns the hostname specified in the request.
202: This may be
203: .Dv NULL
204: for a non-proxy request if the client fails to send the "Host" header
205: (typically older browsers).
206: This value can be used to implement "virtual hosting".
207: .Pp
208: .Fn http_request_get_remote_ip
209: returns the IP address of the remote side.
210: .Pp
211: .Fn http_request_get_remote_port
212: returns the TCP port of the remote side.
213: .Pp
214: .Fn http_request_get_ssl
215: returns the SSL context for the HTTP connection, or
216: .Dv NULL
217: if the connection is not over SSL.
218: .\"
219: .Ss "HTTP Headers"
220: .\"
221: .Fn http_request_get_header
222: returns the value of the named header, or
223: .Dv NULL
224: if the header is not defined for the request.
225: HTTP header names are case-insensitive.
226: .Pp
227: .Fn http_request_num_headers
228: returns the number of headers in the request.
229: .Pp
230: .Fn http_request_get_header_by_index
231: points
232: .Fa "*namep"
233: at the name and
234: .Fa "*valuep"
235: at the value of the header with index
236: .Fa index ,
237: which must be less than the value returned by
238: .Fn http_request_num_headers .
239: .Pp
240: .Fn http_request_set_header
241: formats and sets a header value.
242: If
243: .Fa append
244: is non-zero, the value is appended to any existing value
245: (after adding a ",\ " separator) rather than replacing it.
246: .Pp
247: .Fn http_request_remove_header
248: removes a header from the request.
249: .Pp
250: .Fn http_request_send_headers
251: causes the client request headers to be sent to the server if they
252: haven't already been sent.
253: This causes the URI to be constructed from the request path (see
254: .Fn http_request_set_path
255: above) and the name/value pairs (see
256: .Fn http_request_set_value
257: below) added as the query string.
258: .\"
259: .Ss "HTTP Body"
260: .\"
261: .Fn http_request_get_input
262: returns the body of the request as an input stream.
263: The local side must be the server for this HTTP connection.
264: .Pp
265: .Fn http_request_get_output
266: returns an output stream that writes into the body of the request.
267: The local side must be the client for this HTTP connection.
268: .Fa buffer
269: determines whether the entire output should be buffered before sending, or
270: should writes to the stream translate immediately into writes to the server.
271: The latter option will force the headers to be sent (if they haven't been
272: sent already) when the first byte is written to the stream.
273: Setting
274: .Fa buffer
275: to zero is also incompatible with keep-alive, unless the user code manually
276: sets the "Content-Length" header (in which case it takes responsibility
277: for writing the correct number of bytes).
278: If
279: .Fa buffer
280: is non-zero, the output will be buffered entirely in memory until the output
281: stream is closed, at which point "Content-Length" is computed automatically.
282: .\"
283: .Ss "HTTP Basic Authorization"
284: .\"
285: .Fn http_request_get_username
286: returns the username from the "Authorization" header, or
287: .Dv NULL
288: if none was specified.
289: This works for "Basic" authentication only.
290: .Pp
291: .Fn http_request_get_password
292: returns the password from the "Authorization" header, or
293: .Dv NULL
294: if none was specified.
295: This works for "Basic" authentication only.
296: .Pp
297: .Fn http_request_encode_basic_auth
298: formats and base-64 encodes the
299: .Fa username
300: and
301: .Fa password
302: into a form suitable for the HTTP "Basic" authentication header.
303: The returned buffer is allocated with
304: .Xr typed_mem 3
305: type
306: .Fa mtype ;
307: the caller must eventually free it.
308: .\"
309: .Ss "Name/Value Pairs"
310: .\"
311: Requests have an internal list of name, value pairs.
312: The names need not be unique.
313: For servers, this list is automatically initialized from the request
314: by parsing the URI query string.
315: For clients, this list is used to automatically generate the URI query
316: string when the request headers are sent for "GET" queries only.
317: .Pp
318: .Fn http_request_get_value
319: returns the value associated with with
320: .Fa name .
321: Since the same name may exist multiple times,
322: .Fa instance
323: should be 0 to retrieve the first value, 1 for the second, etc.
324: .Dv NULL
325: is returned if the value is not found.
326: .Pp
327: .Fn http_request_set_value
328: adds a name, value pair to the internal database.
329: .Pp
330: .Fn http_request_get_num_values
331: returns the number of name, value pairs.
332: .Pp
333: .Fn http_request_get_value_by_index
334: retrieves name, value pair that is at position
335: .Fa index
336: in the list.
337: Note that the list is kept sorted by name.
338: .Pp
339: .Fn http_request_set_query_from_values
340: generates a query string for the request based on the
341: name, value pairs.
342: This is useful if a query string is desired with a non-GET request.
343: .Pp
344: .Fn http_request_read_url_encoded_values
345: reads the request body, interprets it as an URL-encoded query string,
346: and sets the request's name, value pairs from string.
347: This is typically used by a server to input HTML form data that
348: was submitted using the "POST" method.
349: .Pp
350: .Fn http_request_write_url_encoded_values
351: writes out the name, value pairs as URL-encoded query string data.
352: This is typically used by a client to output HTML form data using
353: the "POST" method.
354: .Pp
355: .\"
356: .Ss "MIME Multi-Part Support"
357: .\"
358: These functions operate on requests whose body contains multi-part MIME data.
359: The request must have content type "multipart/form-data" and
360: the body must be properly formatted for multi-part MIME or else these
361: functions will return an error.
362: .Pp
363: .Fn http_request_get_mime_multiparts
364: reads the request body as a multi-part MIME document and invokes the
365: .Fa handler
366: for each part:
367: .Pp
368: .Bd -literal -compact
369: typedef int http_mime_handler_t(void *arg,
370: struct mime_part *part, FILE *fp);
371: .Ed
372: .Pp
373: The
374: .Fa arg
375: is passed untouched to the handler.
376: .Fa fp
377: is an input stream that reads only the MIME part being processed.
378: The handler should read as much of the MIME part as desired and then return
379: 0 to continue with subsequent parts, or else
380: -1 (with
381: .Va errno
382: set) to abort processing.
383: In the latter case,
384: .Fn http_request_get_mime_multiparts
385: will return -1.
386: In no case should
387: the handler close the stream
388: .Fa fp
389: or free
390: .Fa part .
391: See
392: .Xr http_mime 3
393: for a description of how to use
394: .Fa part .
395: .Pp
396: .Fn http_request_read_mime_multipart
397: reads an entire multi-part MIME request body into memory and returns
398: the result, which the caller is responsible for eventually freeing.
399: See
400: .Xr http_mime 3
401: for a description of how to use the return value.
402: .Pp
403: .Fn http_request_file_upload
404: reads only the value of the field
405: .Fa field
406: from a multi-part MIME request body and writes it to the output stream
407: .Fa fp .
408: The data is transferred in an on-line fasion so that the entire value
409: does not need to fit in memory at once.
410: This is useful for HTML form file uploads of large files.
411: All MIME parts other than the first part with name
412: .Fa field
413: are discarded.
414: If
415: .Fa max
416: is non-zero and the length of the field is more than
417: .Fa max
418: bytes, an error is generated with
419: .Va errno
420: set to
421: .Er EFBIG.
422: This is useful for avoiding disk-filling attacks.
423: .\"
424: .Ss Miscellaneous
425: .\"
426: .Fn http_request_url_encode
427: URL-encodes the string
428: .Fa s
429: into a buffer allocated with
430: .Xr typed_mem 3
431: type
432: .Fa mtype
433: and returns the result, which the caller must eventually free.
434: .Pp
435: .Fn http_request_url_decode
436: URL-decodes the string
437: .Fa s
438: and puts the result in the buffer
439: .Fa t ,
440: which must have length at least
441: .Li "strlen(s) + 1" .
442: .Pp
443: .Fn http_request_parse_time
444: parses an HTTP time string and returns the result, or -1 on failure.
445: .Pp
446: .Fn http_request_set_proxy
447: sets or clears the proxy bit for a client request.
448: When this bit is set, the client will make a proxy HTTP request instead
449: of a normal HTTP request.
450: .Pp
451: .Fn http_request_get_raw_socket
452: returns the underlying file descriptor for the HTTP connection.
453: This is a huge layering violation fraught with danger, but necessary
454: for implementing a proxy server that supports the "CONNECT" method.
455: This function will fail for SSL connections.
456: The returned file descriptor should not be closed.
457: .Sh RETURN VALUES
458: All of the above routines that can return an error return
459: .Dv NULL
460: or -1 to indicate this and set
461: .Va errno
462: to an appropriate value.
463: Success is indicated by a normal return value or zero.
464: .Sh SEE ALSO
465: .Xr http_client 3 ,
466: .Xr http_mime 3 ,
467: .Xr http_response 3 ,
468: .Xr http_server 3 ,
469: .Xr http_servlet 3 ,
470: .Xr libpdel 3 ,
471: .Xr typed_mem 3
472: .Rs
473: .%A R. Fielding
474: .%A J. Gettys
475: .%A J. Mogul
476: .%A H. Frystyk
477: .%A L. Masinter
478: .%A P. Leach
479: .%A T. Berners-Lee
480: .%T "Hypertext Transfer Protocol -- HTTP/1.1"
481: .%O RFC 2616
482: .Re
483: .Rs
484: .%A N. Freed
485: .%A N. Borenstein
486: .%T "Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types"
487: .%O RFC 2046
488: .Re
489: .Sh HISTORY
490: The PDEL library was developed at Packet Design, LLC.
491: .Dv "http://www.packetdesign.com/"
492: .Sh AUTHORS
493: .An Archie Cobbs Aq archie@freebsd.org
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>