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>