Home | History | Annotate | Download | only in cups
      1 /*
      2  * Hyper-Text Transport Protocol definitions for CUPS.
      3  *
      4  * Copyright 2007-2014 by Apple Inc.
      5  * Copyright 1997-2007 by Easy Software Products, all rights reserved.
      6  *
      7  * These coded instructions, statements, and computer programs are the
      8  * property of Apple Inc. and are protected by Federal copyright
      9  * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
     10  * which should have been included with this file.  If this file is
     11  * missing or damaged, see the license at "http://www.cups.org/".
     12  *
     13  * This file is subject to the Apple OS-Developed Software exception.
     14  */
     15 
     16 #ifndef _CUPS_HTTP_H_
     17 #  define _CUPS_HTTP_H_
     18 
     19 /*
     20  * Include necessary headers...
     21  */
     22 
     23 #  include "versioning.h"
     24 #  include "array.h"
     25 #  include <string.h>
     26 #  include <time.h>
     27 #  include <sys/types.h>
     28 #  ifdef WIN32
     29 #    ifndef __CUPS_SSIZE_T_DEFINED
     30 #      define __CUPS_SSIZE_T_DEFINED
     31 /* Windows does not support the ssize_t type, so map it to off_t... */
     32 typedef off_t ssize_t;			/* @private@ */
     33 #    endif /* !__CUPS_SSIZE_T_DEFINED */
     34 #    include <winsock2.h>
     35 #    include <ws2tcpip.h>
     36 #  else
     37 #    include <unistd.h>
     38 #    include <sys/time.h>
     39 #    include <sys/socket.h>
     40 #    include <netdb.h>
     41 #    include <netinet/in.h>
     42 #    include <arpa/inet.h>
     43 #    include <netinet/in_systm.h>
     44 #    include <netinet/ip.h>
     45 #    if !defined(__APPLE__) || !defined(TCP_NODELAY)
     46 #      include <netinet/tcp.h>
     47 #    endif /* !__APPLE__ || !TCP_NODELAY */
     48 #    if defined(AF_UNIX) && !defined(AF_LOCAL)
     49 #      define AF_LOCAL AF_UNIX		/* Older UNIX's have old names... */
     50 #    endif /* AF_UNIX && !AF_LOCAL */
     51 #    ifdef AF_LOCAL
     52 #      include <sys/un.h>
     53 #    endif /* AF_LOCAL */
     54 #    if defined(LOCAL_PEERCRED) && !defined(SO_PEERCRED)
     55 #      define SO_PEERCRED LOCAL_PEERCRED
     56 #    endif /* LOCAL_PEERCRED && !SO_PEERCRED */
     57 #  endif /* WIN32 */
     58 
     59 
     60 /*
     61  * C++ magic...
     62  */
     63 
     64 #  ifdef __cplusplus
     65 extern "C" {
     66 #  endif /* __cplusplus */
     67 
     68 
     69 /*
     70  * Oh, the wonderful world of IPv6 compatibility.  Apparently some
     71  * implementations expose the (more logical) 32-bit address parts
     72  * to everyone, while others only expose it to kernel code...  To
     73  * make supporting IPv6 even easier, each vendor chose different
     74  * core structure and union names, so the same defines or code
     75  * can't be used on all platforms.
     76  *
     77  * The following will likely need tweaking on new platforms that
     78  * support IPv6 - the "s6_addr32" define maps to the 32-bit integer
     79  * array in the in6_addr union, which is named differently on various
     80  * platforms.
     81  */
     82 
     83 #if defined(AF_INET6) && !defined(s6_addr32)
     84 #  if defined(__sun)
     85 #    define s6_addr32	_S6_un._S6_u32
     86 #  elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)|| defined(__DragonFly__)
     87 #    define s6_addr32	__u6_addr.__u6_addr32
     88 #  elif defined(WIN32)
     89 /*
     90  * Windows only defines byte and 16-bit word members of the union and
     91  * requires special casing of all raw address code...
     92  */
     93 #    define s6_addr32	error_need_win32_specific_code
     94 #  endif /* __sun */
     95 #endif /* AF_INET6 && !s6_addr32 */
     96 
     97 
     98 /*
     99  * Limits...
    100  */
    101 
    102 #  define HTTP_MAX_URI		1024	/* Max length of URI string */
    103 #  define HTTP_MAX_HOST		256	/* Max length of hostname string */
    104 #  define HTTP_MAX_BUFFER	2048	/* Max length of data buffer */
    105 #  define HTTP_MAX_VALUE	256	/* Max header field value length */
    106 
    107 
    108 /*
    109  * Types and structures...
    110  */
    111 
    112 typedef enum http_auth_e		/**** HTTP authentication types ****/
    113 {
    114   HTTP_AUTH_NONE,			/* No authentication in use */
    115   HTTP_AUTH_BASIC,			/* Basic authentication in use */
    116   HTTP_AUTH_MD5,			/* Digest authentication in use */
    117   HTTP_AUTH_MD5_SESS,			/* MD5-session authentication in use */
    118   HTTP_AUTH_MD5_INT,			/* Digest authentication in use for body */
    119   HTTP_AUTH_MD5_SESS_INT,		/* MD5-session authentication in use for body */
    120   HTTP_AUTH_NEGOTIATE			/* GSSAPI authentication in use @since CUPS 1.3/macOS 10.5@ */
    121 } http_auth_t;
    122 
    123 typedef enum http_encoding_e		/**** HTTP transfer encoding values ****/
    124 {
    125   HTTP_ENCODING_LENGTH,			/* Data is sent with Content-Length */
    126   HTTP_ENCODING_CHUNKED,		/* Data is chunked */
    127   HTTP_ENCODING_FIELDS			/* Sending HTTP fields */
    128 
    129 #  ifndef _CUPS_NO_DEPRECATED
    130 #    define HTTP_ENCODE_LENGTH	HTTP_ENCODING_LENGTH
    131 #    define HTTP_ENCODE_CHUNKED	HTTP_ENCODING_CHUNKED
    132 #    define HTTP_ENCODE_FIELDS	HTTP_ENCODING_FIELDS
    133 #  endif /* !_CUPS_NO_DEPRECATED */
    134 } http_encoding_t;
    135 
    136 typedef enum http_encryption_e		/**** HTTP encryption values ****/
    137 {
    138   HTTP_ENCRYPTION_IF_REQUESTED,		/* Encrypt if requested (TLS upgrade) */
    139   HTTP_ENCRYPTION_NEVER,		/* Never encrypt */
    140   HTTP_ENCRYPTION_REQUIRED,		/* Encryption is required (TLS upgrade) */
    141   HTTP_ENCRYPTION_ALWAYS		/* Always encrypt (SSL) */
    142 
    143 #  ifndef _CUPS_NO_DEPRECATED
    144 #    define HTTP_ENCRYPT_IF_REQUESTED	HTTP_ENCRYPTION_IF_REQUESTED
    145 #    define HTTP_ENCRYPT_NEVER		HTTP_ENCRYPTION_NEVER
    146 #    define HTTP_ENCRYPT_REQUIRED	HTTP_ENCRYPTION_REQUIRED
    147 #    define HTTP_ENCRYPT_ALWAYS		HTTP_ENCRYPTION_ALWAYS
    148 #  endif /* !_CUPS_NO_DEPRECATED */
    149 } http_encryption_t;
    150 
    151 typedef enum http_field_e		/**** HTTP field names ****/
    152 {
    153   HTTP_FIELD_UNKNOWN = -1,		/* Unknown field */
    154   HTTP_FIELD_ACCEPT_LANGUAGE,		/* Accept-Language field */
    155   HTTP_FIELD_ACCEPT_RANGES,		/* Accept-Ranges field */
    156   HTTP_FIELD_AUTHORIZATION,		/* Authorization field */
    157   HTTP_FIELD_CONNECTION,		/* Connection field */
    158   HTTP_FIELD_CONTENT_ENCODING,		/* Content-Encoding field */
    159   HTTP_FIELD_CONTENT_LANGUAGE,		/* Content-Language field */
    160   HTTP_FIELD_CONTENT_LENGTH,		/* Content-Length field */
    161   HTTP_FIELD_CONTENT_LOCATION,		/* Content-Location field */
    162   HTTP_FIELD_CONTENT_MD5,		/* Content-MD5 field */
    163   HTTP_FIELD_CONTENT_RANGE,		/* Content-Range field */
    164   HTTP_FIELD_CONTENT_TYPE,		/* Content-Type field */
    165   HTTP_FIELD_CONTENT_VERSION,		/* Content-Version field */
    166   HTTP_FIELD_DATE,			/* Date field */
    167   HTTP_FIELD_HOST,			/* Host field */
    168   HTTP_FIELD_IF_MODIFIED_SINCE,		/* If-Modified-Since field */
    169   HTTP_FIELD_IF_UNMODIFIED_SINCE,	/* If-Unmodified-Since field */
    170   HTTP_FIELD_KEEP_ALIVE,		/* Keep-Alive field */
    171   HTTP_FIELD_LAST_MODIFIED,		/* Last-Modified field */
    172   HTTP_FIELD_LINK,			/* Link field */
    173   HTTP_FIELD_LOCATION,			/* Location field */
    174   HTTP_FIELD_RANGE,			/* Range field */
    175   HTTP_FIELD_REFERER,			/* Referer field */
    176   HTTP_FIELD_RETRY_AFTER,		/* Retry-After field */
    177   HTTP_FIELD_TRANSFER_ENCODING,		/* Transfer-Encoding field */
    178   HTTP_FIELD_UPGRADE,			/* Upgrade field */
    179   HTTP_FIELD_USER_AGENT,		/* User-Agent field */
    180   HTTP_FIELD_WWW_AUTHENTICATE,		/* WWW-Authenticate field */
    181   HTTP_FIELD_ACCEPT_ENCODING,		/* Accepting-Encoding field @since CUPS 1.7/macOS 10.9@ */
    182   HTTP_FIELD_ALLOW,			/* Allow field @since CUPS 1.7/macOS 10.9@ */
    183   HTTP_FIELD_SERVER,			/* Server field @since CUPS 1.7/macOS 10.9@ */
    184   HTTP_FIELD_MAX			/* Maximum field index */
    185 } http_field_t;
    186 
    187 typedef enum http_keepalive_e		/**** HTTP keep-alive values ****/
    188 {
    189   HTTP_KEEPALIVE_OFF = 0,		/* No keep alive support */
    190   HTTP_KEEPALIVE_ON			/* Use keep alive */
    191 } http_keepalive_t;
    192 
    193 typedef enum http_state_e		/**** HTTP state values; states
    194 					 **** are server-oriented...
    195 					 ****/
    196 {
    197   HTTP_STATE_ERROR = -1,		/* Error on socket */
    198   HTTP_STATE_WAITING,			/* Waiting for command */
    199   HTTP_STATE_OPTIONS,			/* OPTIONS command, waiting for blank line */
    200   HTTP_STATE_GET,			/* GET command, waiting for blank line */
    201   HTTP_STATE_GET_SEND,			/* GET command, sending data */
    202   HTTP_STATE_HEAD,			/* HEAD command, waiting for blank line */
    203   HTTP_STATE_POST,			/* POST command, waiting for blank line */
    204   HTTP_STATE_POST_RECV,			/* POST command, receiving data */
    205   HTTP_STATE_POST_SEND,			/* POST command, sending data */
    206   HTTP_STATE_PUT,			/* PUT command, waiting for blank line */
    207   HTTP_STATE_PUT_RECV,			/* PUT command, receiving data */
    208   HTTP_STATE_DELETE,			/* DELETE command, waiting for blank line */
    209   HTTP_STATE_TRACE,			/* TRACE command, waiting for blank line */
    210   HTTP_STATE_CONNECT,			/* CONNECT command, waiting for blank line */
    211   HTTP_STATE_STATUS,			/* Command complete, sending status */
    212   HTTP_STATE_UNKNOWN_METHOD,		/* Unknown request method, waiting for blank line @since CUPS 1.7/macOS 10.9@ */
    213   HTTP_STATE_UNKNOWN_VERSION		/* Unknown request method, waiting for blank line @since CUPS 1.7/macOS 10.9@ */
    214 
    215 #  ifndef _CUPS_NO_DEPRECATED
    216 #    define HTTP_WAITING	HTTP_STATE_WAITING
    217 #    define HTTP_OPTIONS	HTTP_STATE_OPTIONS
    218 #    define HTTP_GET		HTTP_STATE_GET
    219 #    define HTTP_GET_SEND	HTTP_STATE_GET_SEND
    220 #    define HTTP_HEAD		HTTP_STATE_HEAD
    221 #    define HTTP_POST		HTTP_STATE_POST
    222 #    define HTTP_POST_RECV	HTTP_STATE_POST_RECV
    223 #    define HTTP_POST_SEND	HTTP_STATE_POST_SEND
    224 #    define HTTP_PUT		HTTP_STATE_PUT
    225 #    define HTTP_PUT_RECV	HTTP_STATE_PUT_RECV
    226 #    define HTTP_DELETE		HTTP_STATE_DELETE
    227 #    define HTTP_TRACE		HTTP_STATE_TRACE
    228 #    define HTTP_CLOSE		HTTP_STATE_CONNECT
    229 #    define HTTP_STATUS		HTTP_STATE_STATUS
    230 #  endif /* !_CUPS_NO_DEPRECATED */
    231 } http_state_t;
    232 
    233 typedef enum http_status_e		/**** HTTP status codes ****/
    234 {
    235   HTTP_STATUS_ERROR = -1,		/* An error response from httpXxxx() */
    236   HTTP_STATUS_NONE = 0,			/* No Expect value @since CUPS 1.7/macOS 10.9@ */
    237 
    238   HTTP_STATUS_CONTINUE = 100,		/* Everything OK, keep going... */
    239   HTTP_STATUS_SWITCHING_PROTOCOLS,	/* HTTP upgrade to TLS/SSL */
    240 
    241   HTTP_STATUS_OK = 200,			/* OPTIONS/GET/HEAD/POST/TRACE command was successful */
    242   HTTP_STATUS_CREATED,			/* PUT command was successful */
    243   HTTP_STATUS_ACCEPTED,			/* DELETE command was successful */
    244   HTTP_STATUS_NOT_AUTHORITATIVE,	/* Information isn't authoritative */
    245   HTTP_STATUS_NO_CONTENT,		/* Successful command, no new data */
    246   HTTP_STATUS_RESET_CONTENT,		/* Content was reset/recreated */
    247   HTTP_STATUS_PARTIAL_CONTENT,		/* Only a partial file was received/sent */
    248 
    249   HTTP_STATUS_MULTIPLE_CHOICES = 300,	/* Multiple files match request */
    250   HTTP_STATUS_MOVED_PERMANENTLY,	/* Document has moved permanently */
    251   HTTP_STATUS_MOVED_TEMPORARILY,	/* Document has moved temporarily */
    252   HTTP_STATUS_SEE_OTHER,		/* See this other link... */
    253   HTTP_STATUS_NOT_MODIFIED,		/* File not modified */
    254   HTTP_STATUS_USE_PROXY,		/* Must use a proxy to access this URI */
    255 
    256   HTTP_STATUS_BAD_REQUEST = 400,	/* Bad request */
    257   HTTP_STATUS_UNAUTHORIZED,		/* Unauthorized to access host */
    258   HTTP_STATUS_PAYMENT_REQUIRED,		/* Payment required */
    259   HTTP_STATUS_FORBIDDEN,		/* Forbidden to access this URI */
    260   HTTP_STATUS_NOT_FOUND,		/* URI was not found */
    261   HTTP_STATUS_METHOD_NOT_ALLOWED,	/* Method is not allowed */
    262   HTTP_STATUS_NOT_ACCEPTABLE,		/* Not Acceptable */
    263   HTTP_STATUS_PROXY_AUTHENTICATION,	/* Proxy Authentication is Required */
    264   HTTP_STATUS_REQUEST_TIMEOUT,		/* Request timed out */
    265   HTTP_STATUS_CONFLICT,			/* Request is self-conflicting */
    266   HTTP_STATUS_GONE,			/* Server has gone away */
    267   HTTP_STATUS_LENGTH_REQUIRED,		/* A content length or encoding is required */
    268   HTTP_STATUS_PRECONDITION,		/* Precondition failed */
    269   HTTP_STATUS_REQUEST_TOO_LARGE,	/* Request entity too large */
    270   HTTP_STATUS_URI_TOO_LONG,		/* URI too long */
    271   HTTP_STATUS_UNSUPPORTED_MEDIATYPE,	/* The requested media type is unsupported */
    272   HTTP_STATUS_REQUESTED_RANGE,		/* The requested range is not satisfiable */
    273   HTTP_STATUS_EXPECTATION_FAILED,	/* The expectation given in an Expect header field was not met */
    274   HTTP_STATUS_UPGRADE_REQUIRED = 426,	/* Upgrade to SSL/TLS required */
    275 
    276   HTTP_STATUS_SERVER_ERROR = 500,	/* Internal server error */
    277   HTTP_STATUS_NOT_IMPLEMENTED,		/* Feature not implemented */
    278   HTTP_STATUS_BAD_GATEWAY,		/* Bad gateway */
    279   HTTP_STATUS_SERVICE_UNAVAILABLE,	/* Service is unavailable */
    280   HTTP_STATUS_GATEWAY_TIMEOUT,		/* Gateway connection timed out */
    281   HTTP_STATUS_NOT_SUPPORTED,		/* HTTP version not supported */
    282 
    283   HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED = 1000,
    284 					/* User canceled authorization @since CUPS 1.4@ */
    285   HTTP_STATUS_CUPS_PKI_ERROR,		/* Error negotiating a secure connection @since CUPS 1.5/macOS 10.7@ */
    286   HTTP_STATUS_CUPS_WEBIF_DISABLED	/* Web interface is disabled @private@ */
    287 
    288 #  ifndef _CUPS_NO_DEPRECATED
    289 /* Old names for this enumeration */
    290 #    define HTTP_ERROR			HTTP_STATUS_ERROR
    291 
    292 #    define HTTP_CONTINUE		HTTP_STATUS_CONTINUE
    293 #    define HTTP_SWITCHING_PROTOCOLS	HTTP_STATUS_SWITCHING_PROTOCOLS
    294 
    295 #    define HTTP_OK			HTTP_STATUS_OK
    296 #    define HTTP_CREATED		HTTP_STATUS_CREATED
    297 #    define HTTP_ACCEPTED		HTTP_STATUS_ACCEPTED
    298 #    define HTTP_NOT_AUTHORITATIVE	HTTP_STATUS_NOT_AUTHORITATIVE
    299 #    define HTTP_NO_CONTENT		HTTP_STATUS_NO_CONTENT
    300 #    define HTTP_RESET_CONTENT		HTTP_STATUS_RESET_CONTENT
    301 #    define HTTP_PARTIAL_CONTENT	HTTP_STATUS_PARTIAL_CONTENT
    302 
    303 #    define HTTP_MULTIPLE_CHOICES	HTTP_STATUS_MULTIPLE_CHOICES
    304 #    define HTTP_MOVED_PERMANENTLY	HTTP_STATUS_MOVED_PERMANENTLY
    305 #    define HTTP_MOVED_TEMPORARILY	HTTP_STATUS_MOVED_TEMPORARILY
    306 #    define HTTP_SEE_OTHER		HTTP_STATUS_SEE_OTHER
    307 #    define HTTP_NOT_MODIFIED		HTTP_STATUS_NOT_MODIFIED
    308 #    define HTTP_USE_PROXY		HTTP_STATUS_USE_PROXY
    309 
    310 #    define HTTP_BAD_REQUEST		HTTP_STATUS_BAD_REQUEST
    311 #    define HTTP_UNAUTHORIZED		HTTP_STATUS_UNAUTHORIZED
    312 #    define HTTP_PAYMENT_REQUIRED	HTTP_STATUS_PAYMENT_REQUIRED
    313 #    define HTTP_FORBIDDEN		HTTP_STATUS_FORBIDDEN
    314 #    define HTTP_NOT_FOUND		HTTP_STATUS_NOT_FOUND
    315 #    define HTTP_METHOD_NOT_ALLOWED	HTTP_STATUS_METHOD_NOT_ALLOWED
    316 #    define HTTP_NOT_ACCEPTABLE		HTTP_STATUS_NOT_ACCEPTABLE
    317 #    define HTTP_PROXY_AUTHENTICATION	HTTP_STATUS_PROXY_AUTHENTICATION
    318 #    define HTTP_REQUEST_TIMEOUT	HTTP_STATUS_REQUEST_TIMEOUT
    319 #    define HTTP_CONFLICT		HTTP_STATUS_CONFLICT
    320 #    define HTTP_GONE			HTTP_STATUS_GONE
    321 #    define HTTP_LENGTH_REQUIRED	HTTP_STATUS_LENGTH_REQUIRED
    322 #    define HTTP_PRECONDITION		HTTP_STATUS_PRECONDITION
    323 #    define HTTP_REQUEST_TOO_LARGE	HTTP_STATUS_REQUEST_TOO_LARGE
    324 #    define HTTP_URI_TOO_LONG		HTTP_STATUS_URI_TOO_LONG
    325 #    define HTTP_UNSUPPORTED_MEDIATYPE	HTTP_STATUS_UNSUPPORTED_MEDIATYPE
    326 #    define HTTP_REQUESTED_RANGE	HTTP_STATUS_REQUESTED_RANGE
    327 #    define HTTP_EXPECTATION_FAILED	HTTP_STATUS_EXPECTATION_FAILED
    328 #    define HTTP_UPGRADE_REQUIRED	HTTP_STATUS_UPGRADE_REQUIRED
    329 
    330 #    define HTTP_SERVER_ERROR		HTTP_STATUS_SERVER_ERROR
    331 #    define HTTP_NOT_IMPLEMENTED	HTTP_STATUS_NOT_IMPLEMENTED
    332 #    define HTTP_BAD_GATEWAY		HTTP_STATUS_BAD_GATEWAY
    333 #    define HTTP_SERVICE_UNAVAILABLE	HTTP_STATUS_SERVICE_UNAVAILABLE
    334 #    define HTTP_GATEWAY_TIMEOUT	HTTP_STATUS_GATEWAY_TIMEOUT
    335 #    define HTTP_NOT_SUPPORTED		HTTP_STATUS_NOT_SUPPORTED
    336 
    337 #    define HTTP_AUTHORIZATION_CANCELED	HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED
    338 #    define HTTP_PKI_ERROR		HTTP_STATUS_CUPS_PKI_ERROR
    339 #    define HTTP_WEBIF_DISABLED		HTTP_STATUS_CUPS_WEBIF_DISABLED
    340 #  endif /* !_CUPS_NO_DEPRECATED */
    341 } http_status_t;
    342 
    343 typedef enum http_trust_e		/**** Level of trust for credentials @since CUPS 2.0/OS 10.10@ */
    344 {
    345   HTTP_TRUST_OK = 0,			/* Credentials are OK/trusted */
    346   HTTP_TRUST_INVALID,			/* Credentials are invalid */
    347   HTTP_TRUST_CHANGED,			/* Credentials have changed */
    348   HTTP_TRUST_EXPIRED,			/* Credentials are expired */
    349   HTTP_TRUST_RENEWED,			/* Credentials have been renewed */
    350   HTTP_TRUST_UNKNOWN,			/* Credentials are unknown/new */
    351 } http_trust_t;
    352 
    353 typedef enum http_uri_status_e		/**** URI separation status @since CUPS 1.2@ ****/
    354 {
    355   HTTP_URI_STATUS_OVERFLOW = -8,	/* URI buffer for httpAssembleURI is too small */
    356   HTTP_URI_STATUS_BAD_ARGUMENTS = -7,	/* Bad arguments to function (error) */
    357   HTTP_URI_STATUS_BAD_RESOURCE = -6,	/* Bad resource in URI (error) */
    358   HTTP_URI_STATUS_BAD_PORT = -5,	/* Bad port number in URI (error) */
    359   HTTP_URI_STATUS_BAD_HOSTNAME = -4,	/* Bad hostname in URI (error) */
    360   HTTP_URI_STATUS_BAD_USERNAME = -3,	/* Bad username in URI (error) */
    361   HTTP_URI_STATUS_BAD_SCHEME = -2,	/* Bad scheme in URI (error) */
    362   HTTP_URI_STATUS_BAD_URI = -1,		/* Bad/empty URI (error) */
    363   HTTP_URI_STATUS_OK = 0,		/* URI decoded OK */
    364   HTTP_URI_STATUS_MISSING_SCHEME,	/* Missing scheme in URI (warning) */
    365   HTTP_URI_STATUS_UNKNOWN_SCHEME,	/* Unknown scheme in URI (warning) */
    366   HTTP_URI_STATUS_MISSING_RESOURCE	/* Missing resource in URI (warning) */
    367 
    368 #  ifndef _CUPS_NO_DEPRECATED
    369 #    define HTTP_URI_OVERFLOW		HTTP_URI_STATUS_OVERFLOW
    370 #    define HTTP_URI_BAD_ARGUMENTS	HTTP_URI_STATUS_BAD_ARGUMENTS
    371 #    define HTTP_URI_BAD_RESOURCE	HTTP_URI_STATUS_BAD_RESOURCE
    372 #    define HTTP_URI_BAD_PORT		HTTP_URI_STATUS_BAD_PORT
    373 #    define HTTP_URI_BAD_HOSTNAME	HTTP_URI_STATUS_BAD_HOSTNAME
    374 #    define HTTP_URI_BAD_USERNAME	HTTP_URI_STATUS_BAD_USERNAME
    375 #    define HTTP_URI_BAD_SCHEME		HTTP_URI_STATUS_BAD_SCHEME
    376 #    define HTTP_URI_BAD_URI		HTTP_URI_STATUS_BAD_URI
    377 #    define HTTP_URI_OK			HTTP_URI_STATUS_OK
    378 #    define HTTP_URI_MISSING_SCHEME	HTTP_URI_STATUS_MISSING_SCHEME
    379 #    define HTTP_URI_UNKNOWN_SCHEME	HTTP_URI_STATUS_UNKNOWN_SCHEME
    380 #    define HTTP_URI_MISSING_RESOURCE	HTTP_URI_STATUS_MISSING_RESOURCE
    381 #  endif /* !_CUPS_NO_DEPRECATED */
    382 } http_uri_status_t;
    383 
    384 typedef enum http_uri_coding_e		/**** URI en/decode flags ****/
    385 {
    386   HTTP_URI_CODING_NONE = 0,		/* Don't en/decode anything */
    387   HTTP_URI_CODING_USERNAME = 1,		/* En/decode the username portion */
    388   HTTP_URI_CODING_HOSTNAME = 2,		/* En/decode the hostname portion */
    389   HTTP_URI_CODING_RESOURCE = 4,		/* En/decode the resource portion */
    390   HTTP_URI_CODING_MOST = 7,		/* En/decode all but the query */
    391   HTTP_URI_CODING_QUERY = 8,		/* En/decode the query portion */
    392   HTTP_URI_CODING_ALL = 15,		/* En/decode everything */
    393   HTTP_URI_CODING_RFC6874 = 16		/* Use RFC 6874 address format */
    394 } http_uri_coding_t;
    395 
    396 typedef enum http_version_e		/**** HTTP version numbers ****/
    397 {
    398   HTTP_VERSION_0_9 = 9,			/* HTTP/0.9 */
    399   HTTP_VERSION_1_0 = 100,		/* HTTP/1.0 */
    400   HTTP_VERSION_1_1 = 101		/* HTTP/1.1 */
    401 
    402 #  ifndef _CUPS_NO_DEPRECATED
    403 #    define HTTP_0_9	HTTP_VERSION_0_9
    404 #    define HTTP_1_0	HTTP_VERSION_1_0
    405 #    define HTTP_1_1	HTTP_VERSION_1_1
    406 #  endif /* !_CUPS_NO_DEPRECATED */
    407 } http_version_t;
    408 
    409 typedef union _http_addr_u		/**** Socket address union, which
    410 					 **** makes using IPv6 and other
    411 					 **** address types easier and
    412 					 **** more portable. @since CUPS 1.2/macOS 10.5@
    413 					 ****/
    414 {
    415   struct sockaddr	addr;		/* Base structure for family value */
    416   struct sockaddr_in	ipv4;		/* IPv4 address */
    417 #ifdef AF_INET6
    418   struct sockaddr_in6	ipv6;		/* IPv6 address */
    419 #endif /* AF_INET6 */
    420 #ifdef AF_LOCAL
    421   struct sockaddr_un	un;		/* Domain socket file */
    422 #endif /* AF_LOCAL */
    423   char			pad[256];	/* Padding to ensure binary compatibility */
    424 } http_addr_t;
    425 
    426 typedef struct http_addrlist_s		/**** Socket address list, which is
    427 					 **** used to enumerate all of the
    428 					 **** addresses that are associated
    429 					 **** with a hostname. @since CUPS 1.2/macOS 10.5@
    430 					 ****/
    431 {
    432   struct http_addrlist_s *next;		/* Pointer to next address in list */
    433   http_addr_t		addr;		/* Address */
    434 } http_addrlist_t;
    435 
    436 typedef struct _http_s http_t;		/**** HTTP connection type ****/
    437 
    438 typedef struct http_credential_s	/**** HTTP credential data @since CUPS 1.5/macOS 10.7@ ****/
    439 {
    440   void		*data;			/* Pointer to credential data */
    441   size_t	datalen;		/* Credential length */
    442 } http_credential_t;
    443 
    444 typedef int (*http_timeout_cb_t)(http_t *http, void *user_data);
    445 					/**** HTTP timeout callback @since CUPS 1.5/macOS 10.7@ ****/
    446 
    447 
    448 
    449 /*
    450  * Prototypes...
    451  */
    452 
    453 extern void		httpBlocking(http_t *http, int b);
    454 extern int		httpCheck(http_t *http);
    455 extern void		httpClearFields(http_t *http);
    456 extern void		httpClose(http_t *http);
    457 extern http_t		*httpConnect(const char *host, int port)
    458 			             _CUPS_DEPRECATED_1_7_MSG("Use httpConnect2 instead.");
    459 extern http_t		*httpConnectEncrypt(const char *host, int port,
    460 			                    http_encryption_t encryption)
    461 			                    _CUPS_DEPRECATED_1_7_MSG("Use httpConnect2 instead.");
    462 extern int		httpDelete(http_t *http, const char *uri);
    463 extern int		httpEncryption(http_t *http, http_encryption_t e);
    464 extern int		httpError(http_t *http);
    465 extern void		httpFlush(http_t *http);
    466 extern int		httpGet(http_t *http, const char *uri);
    467 extern char		*httpGets(char *line, int length, http_t *http);
    468 extern const char	*httpGetDateString(time_t t);
    469 extern time_t		httpGetDateTime(const char *s);
    470 extern const char	*httpGetField(http_t *http, http_field_t field);
    471 extern struct hostent	*httpGetHostByName(const char *name);
    472 extern char		*httpGetSubField(http_t *http, http_field_t field,
    473 			                 const char *name, char *value);
    474 extern int		httpHead(http_t *http, const char *uri);
    475 extern void		httpInitialize(void);
    476 extern int		httpOptions(http_t *http, const char *uri);
    477 extern int		httpPost(http_t *http, const char *uri);
    478 extern int		httpPrintf(http_t *http, const char *format, ...)
    479 			__attribute__ ((__format__ (__printf__, 2, 3)));
    480 extern int		httpPut(http_t *http, const char *uri);
    481 extern int		httpRead(http_t *http, char *buffer, int length) _CUPS_DEPRECATED_MSG("Use httpRead2 instead.");
    482 extern int		httpReconnect(http_t *http) _CUPS_DEPRECATED_1_6_MSG("Use httpReconnect2 instead.");
    483 extern void		httpSeparate(const char *uri, char *method,
    484 			             char *username, char *host, int *port,
    485 				     char *resource) _CUPS_DEPRECATED_MSG("Use httpSeparateURI instead.");
    486 extern void		httpSetField(http_t *http, http_field_t field,
    487 			             const char *value);
    488 extern const char	*httpStatus(http_status_t status);
    489 extern int		httpTrace(http_t *http, const char *uri);
    490 extern http_status_t	httpUpdate(http_t *http);
    491 extern int		httpWrite(http_t *http, const char *buffer, int length) _CUPS_DEPRECATED_MSG("Use httpWrite2 instead.");
    492 extern char		*httpEncode64(char *out, const char *in) _CUPS_DEPRECATED_MSG("Use httpEncode64_2 instead.");
    493 extern char		*httpDecode64(char *out, const char *in) _CUPS_DEPRECATED_MSG("Use httpDecode64_2 instead.");
    494 extern int		httpGetLength(http_t *http) _CUPS_DEPRECATED_MSG("Use httpGetLength2 instead.");
    495 extern char		*httpMD5(const char *, const char *, const char *,
    496 			         char [33]);
    497 extern char		*httpMD5Final(const char *, const char *, const char *,
    498 			              char [33]);
    499 extern char		*httpMD5String(const unsigned char *, char [33]);
    500 
    501 /**** New in CUPS 1.1.19 ****/
    502 extern void		httpClearCookie(http_t *http) _CUPS_API_1_1_19;
    503 extern const char	*httpGetCookie(http_t *http) _CUPS_API_1_1_19;
    504 extern void		httpSetCookie(http_t *http, const char *cookie) _CUPS_API_1_1_19;
    505 extern int		httpWait(http_t *http, int msec) _CUPS_API_1_1_19;
    506 
    507 /**** New in CUPS 1.1.21 ****/
    508 extern char		*httpDecode64_2(char *out, int *outlen, const char *in) _CUPS_API_1_1_21;
    509 extern char		*httpEncode64_2(char *out, int outlen, const char *in,
    510 			                int inlen) _CUPS_API_1_1_21;
    511 extern void		httpSeparate2(const char *uri,
    512 			              char *method, int methodlen,
    513 			              char *username, int usernamelen,
    514 				      char *host, int hostlen, int *port,
    515 				      char *resource, int resourcelen) _CUPS_DEPRECATED_MSG("Use httpSeparateURI instead.");
    516 
    517 /**** New in CUPS 1.2/macOS 10.5 ****/
    518 extern int		httpAddrAny(const http_addr_t *addr) _CUPS_API_1_2;
    519 extern http_addrlist_t	*httpAddrConnect(http_addrlist_t *addrlist, int *sock) _CUPS_API_1_2;
    520 extern int		httpAddrEqual(const http_addr_t *addr1,
    521 			              const http_addr_t *addr2) _CUPS_API_1_2;
    522 extern void		httpAddrFreeList(http_addrlist_t *addrlist) _CUPS_API_1_2;
    523 extern http_addrlist_t	*httpAddrGetList(const char *hostname, int family,
    524 			                 const char *service) _CUPS_API_1_2;
    525 extern int		httpAddrLength(const http_addr_t *addr) _CUPS_API_1_2;
    526 extern int		httpAddrLocalhost(const http_addr_t *addr) _CUPS_API_1_2;
    527 extern char		*httpAddrLookup(const http_addr_t *addr,
    528                                         char *name, int namelen) _CUPS_API_1_2;
    529 extern char		*httpAddrString(const http_addr_t *addr,
    530 			                char *s, int slen) _CUPS_API_1_2;
    531 extern http_uri_status_t httpAssembleURI(http_uri_coding_t encoding,
    532 			                 char *uri, int urilen,
    533 			        	 const char *scheme,
    534 					 const char *username,
    535 					 const char *host, int port,
    536 					 const char *resource) _CUPS_API_1_2;
    537 extern http_uri_status_t httpAssembleURIf(http_uri_coding_t encoding,
    538 			                  char *uri, int urilen,
    539 			        	  const char *scheme,
    540 					  const char *username,
    541 					  const char *host, int port,
    542 					  const char *resourcef, ...) _CUPS_API_1_2;
    543 extern int		httpFlushWrite(http_t *http) _CUPS_API_1_2;
    544 extern int		httpGetBlocking(http_t *http) _CUPS_API_1_2;
    545 extern const char	*httpGetDateString2(time_t t, char *s, int slen) _CUPS_API_1_2;
    546 extern int		httpGetFd(http_t *http) _CUPS_API_1_2;
    547 extern const char	*httpGetHostname(http_t *http, char *s, int slen) _CUPS_API_1_2;
    548 extern off_t		httpGetLength2(http_t *http) _CUPS_API_1_2;
    549 extern http_status_t	httpGetStatus(http_t *http) _CUPS_API_1_2;
    550 extern char		*httpGetSubField2(http_t *http, http_field_t field,
    551 			                  const char *name, char *value,
    552 					  int valuelen) _CUPS_API_1_2;
    553 extern ssize_t		httpRead2(http_t *http, char *buffer, size_t length) _CUPS_API_1_2;
    554 extern http_uri_status_t httpSeparateURI(http_uri_coding_t decoding,
    555 			                 const char *uri,
    556 			        	 char *scheme, int schemelen,
    557 			        	 char *username, int usernamelen,
    558 					 char *host, int hostlen, int *port,
    559 					 char *resource, int resourcelen) _CUPS_API_1_2;
    560 extern void		httpSetExpect(http_t *http, http_status_t expect) _CUPS_API_1_2;
    561 extern void		httpSetLength(http_t *http, size_t length) _CUPS_API_1_2;
    562 extern ssize_t		httpWrite2(http_t *http, const char *buffer,
    563 			           size_t length) _CUPS_API_1_2;
    564 
    565 /**** New in CUPS 1.3/macOS 10.5 ****/
    566 extern char		*httpGetAuthString(http_t *http) _CUPS_API_1_3;
    567 extern void		httpSetAuthString(http_t *http, const char *scheme,
    568 			                  const char *data) _CUPS_API_1_3;
    569 
    570 /**** New in CUPS 1.5/macOS 10.7 ****/
    571 extern int		httpAddCredential(cups_array_t *credentials,
    572 			                  const void *data, size_t datalen)
    573 					  _CUPS_API_1_5;
    574 extern int		httpCopyCredentials(http_t *http,
    575 					    cups_array_t **credentials)
    576 					    _CUPS_API_1_5;
    577 extern void		httpFreeCredentials(cups_array_t *certs) _CUPS_API_1_5;
    578 extern int		httpSetCredentials(http_t *http, cups_array_t *certs)
    579 					   _CUPS_API_1_5;
    580 extern void		httpSetTimeout(http_t *http, double timeout,
    581 			               http_timeout_cb_t cb, void *user_data)
    582 			               _CUPS_API_1_5;
    583 
    584 /**** New in CUPS 1.6/macOS 10.8 ****/
    585 extern http_addrlist_t	*httpAddrConnect2(http_addrlist_t *addrlist, int *sock,
    586 			                  int msec, int *cancel)
    587 			                  _CUPS_API_1_6;
    588 extern http_state_t	httpGetState(http_t *http) _CUPS_API_1_6;
    589 extern http_version_t	httpGetVersion(http_t *http) _CUPS_API_1_6;
    590 extern int		httpReconnect2(http_t *http, int msec, int *cancel)
    591 			               _CUPS_API_1_6;
    592 
    593 
    594 /**** New in CUPS 1.7/macOS 10.9 ****/
    595 extern http_t		*httpAcceptConnection(int fd, int blocking)
    596 			                      _CUPS_API_1_7;
    597 extern http_addrlist_t	*httpAddrCopyList(http_addrlist_t *src) _CUPS_API_1_7;
    598 extern int		httpAddrListen(http_addr_t *addr, int port)
    599 			               _CUPS_API_1_7;
    600 extern int		httpAddrPort(http_addr_t *addr) _CUPS_API_1_7;
    601 extern char		*httpAssembleUUID(const char *server, int port,
    602 					  const char *name, int number,
    603 					  char *buffer, size_t bufsize)
    604 					  _CUPS_API_1_7;
    605 extern http_t		*httpConnect2(const char *host, int port,
    606 				      http_addrlist_t *addrlist,
    607 				      int family, http_encryption_t encryption,
    608 				      int blocking, int msec, int *cancel)
    609 				      _CUPS_API_1_7;
    610 extern const char	*httpGetContentEncoding(http_t *http) _CUPS_API_1_7;
    611 extern http_status_t	httpGetExpect(http_t *http) _CUPS_API_1_7;
    612 extern ssize_t		httpPeek(http_t *http, char *buffer, size_t length)
    613 			         _CUPS_API_1_7;
    614 extern http_state_t	httpReadRequest(http_t *http, char *resource,
    615 			                size_t resourcelen) _CUPS_API_1_7;
    616 extern void		httpSetDefaultField(http_t *http, http_field_t field,
    617 			                    const char *value) _CUPS_API_1_7;
    618 extern http_state_t	httpWriteResponse(http_t *http,
    619 			                  http_status_t status) _CUPS_API_1_7;
    620 
    621 /* New in CUPS 2.0/macOS 10.10 */
    622 extern int		httpAddrClose(http_addr_t *addr, int fd) _CUPS_API_2_0;
    623 extern int		httpAddrFamily(http_addr_t *addr) _CUPS_API_2_0;
    624 extern int		httpCompareCredentials(cups_array_t *cred1, cups_array_t *cred2) _CUPS_API_2_0;
    625 extern int		httpCredentialsAreValidForName(cups_array_t *credentials, const char *common_name);
    626 extern time_t		httpCredentialsGetExpiration(cups_array_t *credentials) _CUPS_API_2_0;
    627 extern http_trust_t	httpCredentialsGetTrust(cups_array_t *credentials, const char *common_name) _CUPS_API_2_0;
    628 extern size_t		httpCredentialsString(cups_array_t *credentials, char *buffer, size_t bufsize) _CUPS_API_2_0;
    629 extern http_field_t	httpFieldValue(const char *name) _CUPS_API_2_0;
    630 extern time_t		httpGetActivity(http_t *http) _CUPS_API_2_0;
    631 extern http_addr_t	*httpGetAddress(http_t *http) _CUPS_API_2_0;
    632 extern http_encryption_t httpGetEncryption(http_t *http) _CUPS_API_2_0;
    633 extern http_keepalive_t	httpGetKeepAlive(http_t *http) _CUPS_API_2_0;
    634 extern size_t		httpGetPending(http_t *http) _CUPS_API_2_0;
    635 extern size_t		httpGetReady(http_t *http) _CUPS_API_2_0;
    636 extern size_t		httpGetRemaining(http_t *http) _CUPS_API_2_0;
    637 extern int		httpIsChunked(http_t *http) _CUPS_API_2_0;
    638 extern int		httpIsEncrypted(http_t *http) _CUPS_API_2_0;
    639 extern int		httpLoadCredentials(const char *path, cups_array_t **credentials, const char *common_name) _CUPS_API_2_0;
    640 extern const char	*httpResolveHostname(http_t *http, char *buffer, size_t bufsize) _CUPS_API_2_0;
    641 extern int		httpSaveCredentials(const char *path, cups_array_t *credentials, const char *common_name) _CUPS_API_2_0;
    642 extern void		httpSetKeepAlive(http_t *http, http_keepalive_t keep_alive) _CUPS_API_2_0;
    643 extern void		httpShutdown(http_t *http) _CUPS_API_2_0;
    644 extern const char	*httpStateString(http_state_t state) _CUPS_API_2_0;
    645 extern const char	*httpURIStatusString(http_uri_status_t status) _CUPS_API_2_0;
    646 
    647 /*
    648  * C++ magic...
    649  */
    650 
    651 #  ifdef __cplusplus
    652 }
    653 #  endif /* __cplusplus */
    654 #endif /* !_CUPS_HTTP_H_ */
    655