]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - cups/http.h
Load cups into easysw/current.
[thirdparty/cups.git] / cups / http.h
index 1384e6d7db839a563d621135612b0816a4e380cd..72c243ec6b7595fb650b15a72b295cc66c52510f 100644 (file)
@@ -1,26 +1,17 @@
 /*
- * "$Id: http.h 4973 2006-01-25 02:36:02Z mike $"
+ * "$Id: http.h 6649 2007-07-11 21:46:42Z mike $"
  *
  *   Hyper-Text Transport Protocol definitions for the Common UNIX Printing
  *   System (CUPS).
  *
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ *   Copyright 2007 by Apple Inc.
+ *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
- *   property of Easy Software Products and are protected by Federal
- *   copyright law.  Distribution and use rights are outlined in the file
- *   "LICENSE.txt" which should have been included with this file.  If this
- *   file is missing or damaged please contact Easy Software Products
- *   at:
- *
- *       Attn: CUPS Licensing Information
- *       Easy Software Products
- *       44141 Airport View Drive, Suite 204
- *       Hollywood, Maryland 20636 USA
- *
- *       Voice: (301) 373-9600
- *       EMail: cups-info@cups.org
- *         WWW: http://www.cups.org
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
  *
  *   This file is subject to the Apple OS-Developed Software exception.
  */
 #  include <time.h>
 #  include <sys/types.h>
 #  ifdef WIN32
+#    ifndef __CUPS_SSIZE_T_DEFINED
+#      define __CUPS_SSIZE_T_DEFINED
+/* Windows does not support the ssize_t type, so map it to off_t... */
+typedef off_t ssize_t;                 /* @private@ */
+#    endif /* !__CUPS_SSIZE_T_DEFINED */
 #    include <winsock2.h>
 #    include <ws2tcpip.h>
 #  else
+#    ifdef __sgi
+#      define INET6                    /* IRIX IPv6 support... */
+#    endif /* __sgi */
 #    include <unistd.h>
 #    include <sys/time.h>
 #    include <sys/socket.h>
 #    if !defined(__APPLE__) || !defined(TCP_NODELAY)
 #      include <netinet/tcp.h>
 #    endif /* !__APPLE__ || !TCP_NODELAY */
+#    if defined(AF_UNIX) && !defined(AF_LOCAL)
+#      define AF_LOCAL AF_UNIX         /* Older UNIX's have old names... */
+#    endif /* AF_UNIX && !AF_LOCAL */
 #    ifdef AF_LOCAL
 #      include <sys/un.h>
 #    endif /* AF_LOCAL */
+#    if defined(LOCAL_PEERCRED) && !defined(SO_PEERCRED)
+#      define SO_PEERCRED LOCAL_PEERCRED
+#    endif /* LOCAL_PEERCRED && !SO_PEERCRED */
 #  endif /* WIN32 */
 
-#  include "md5.h"
-
 /*
  * With GCC 3.0 and higher, we can mark old APIs "deprecated" so you get
  * a warning at compile-time.
@@ -95,8 +98,10 @@ extern "C" {
 #if defined(AF_INET6) && !defined(s6_addr32)
 #  if defined(__sun)
 #    define s6_addr32  _S6_un._S6_u32
-#  elif defined(__FreeBSD__) || defined(__APPLE__)
+#  elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)
 #    define s6_addr32  __u6_addr.__u6_addr32
+#  elif defined(__osf__)
+#    define s6_addr32  s6_un.sa6_laddr
 #  elif defined(WIN32)
 /*
  * Windows only defines byte and 16-bit word members of the union and
@@ -128,13 +133,15 @@ typedef enum http_auth_e          /**** HTTP authentication types ****/
   HTTP_AUTH_MD5,                       /* Digest authentication in use */
   HTTP_AUTH_MD5_SESS,                  /* MD5-session authentication in use */
   HTTP_AUTH_MD5_INT,                   /* Digest authentication in use for body */
-  HTTP_AUTH_MD5_SESS_INT               /* MD5-session authentication in use for body */
+  HTTP_AUTH_MD5_SESS_INT,              /* MD5-session authentication in use for body */
+  HTTP_AUTH_NEGOTIATE                  /* GSSAPI authentication in use @since CUPS 1.3@ */
 } http_auth_t;
 
 typedef enum http_encoding_e           /**** HTTP transfer encoding values ****/
 {
   HTTP_ENCODE_LENGTH,                  /* Data is sent with Content-Length */
-  HTTP_ENCODE_CHUNKED                  /* Data is chunked */
+  HTTP_ENCODE_CHUNKED,                 /* Data is chunked */
+  HTTP_ENCODE_FIELDS                   /* Sending HTTP fields */
 } http_encoding_t;
 
 typedef enum http_encryption_e         /**** HTTP encryption values ****/
@@ -242,6 +249,8 @@ typedef enum http_status_e          /**** HTTP status codes ****/
   HTTP_REQUEST_TOO_LARGE,              /* Request entity too large */
   HTTP_URI_TOO_LONG,                   /* URI too long */
   HTTP_UNSUPPORTED_MEDIATYPE,          /* The requested media type is unsupported */
+  HTTP_REQUESTED_RANGE,                        /* The requested range is not satisfiable */
+  HTTP_EXPECTATION_FAILED,             /* The expectation given in an Expect header field was not met */
   HTTP_UPGRADE_REQUIRED = 426,         /* Upgrade to SSL/TLS required */
 
   HTTP_SERVER_ERROR = 500,             /* Internal server error */
@@ -268,6 +277,17 @@ typedef enum http_uri_status_e             /**** URI separation status @since CUPS1.2@ ****
   HTTP_URI_MISSING_RESOURCE            /* Missing resource in URI (warning) */
 } http_uri_status_t;
 
+typedef enum http_uri_coding_e         /**** URI en/decode flags ****/
+{
+  HTTP_URI_CODING_NONE = 0,            /* Don't en/decode anything */
+  HTTP_URI_CODING_USERNAME = 1,                /* En/decode the username portion */
+  HTTP_URI_CODING_HOSTNAME = 2,                /* En/decode the hostname portion */
+  HTTP_URI_CODING_RESOURCE = 4,                /* En/decode the resource portion */
+  HTTP_URI_CODING_MOST = 7,            /* En/decode all but the query */
+  HTTP_URI_CODING_QUERY = 8,           /* En/decode the query portion */
+  HTTP_URI_CODING_ALL = 15             /* En/decode everything */
+} http_uri_coding_t;
+
 typedef enum http_version_e            /**** HTTP version numbers ****/
 {
   HTTP_0_9 = 9,                                /* HTTP/0.9 */
@@ -275,7 +295,7 @@ typedef enum http_version_e         /**** HTTP version numbers ****/
   HTTP_1_1 = 101                       /* HTTP/1.1 */
 } http_version_t;
 
-typedef union http_addr_u              /**** Socket address union, which
+typedef union _http_addr_u             /**** Socket address union, which
                                         **** makes using IPv6 and other
                                         **** address types easier and
                                         **** more portable. @since CUPS 1.2@
@@ -302,75 +322,29 @@ typedef struct http_addrlist_s            /**** Socket address list, which is
   http_addr_t          addr;           /* Address */
 } http_addrlist_t;
 
-typedef struct http_s                  /**** HTTP connection structure. ****/
-{
-  int                  fd;             /* File descriptor for this socket */
-  int                  blocking;       /* To block or not to block */
-  int                  error;          /* Last error on read */
-  time_t               activity;       /* Time since last read/write */
-  http_state_t         state;          /* State of client */
-  http_status_t                status;         /* Status of last request */
-  http_version_t       version;        /* Protocol version */
-  http_keepalive_t     keep_alive;     /* Keep-alive supported? */
-  struct sockaddr_in   _hostaddr;      /* Address of connected host @deprecated@ */
-  char                 hostname[HTTP_MAX_HOST],
-                                       /* Name of connected host */
-                       fields[HTTP_FIELD_MAX][HTTP_MAX_VALUE];
-                                       /* Field values */
-  char                 *data;          /* Pointer to data buffer */
-  http_encoding_t      data_encoding;  /* Chunked or not */
-  int                  _data_remaining;/* Number of bytes left @deprecated@ */
-  int                  used;           /* Number of bytes used in buffer */
-  char                 buffer[HTTP_MAX_BUFFER];
-                                       /* Buffer for incoming data */
-  int                  auth_type;      /* Authentication in use */
-  _cups_md5_state_t    md5_state;      /* MD5 state */
-  char                 nonce[HTTP_MAX_VALUE];
-                                       /* Nonce value */
-  int                  nonce_count;    /* Nonce count */
-  void                 *tls;           /* TLS state information */
-  http_encryption_t    encryption;     /* Encryption requirements */
-  /**** New in CUPS 1.1.19 ****/
-  fd_set               *input_set;     /* select() set for httpWait() @since CUPS 1.1.19@ */
-  http_status_t                expect;         /* Expect: header @since CUPS 1.1.19@ */
-  char                 *cookie;        /* Cookie value(s) @since CUPS 1.1.19@ */
-  /**** New in CUPS 1.1.20 ****/
-  char                 authstring[HTTP_MAX_VALUE],
-                                       /* Current Authentication value @since CUPS 1.1.20@ */
-                       userpass[HTTP_MAX_VALUE];
-                                       /* Username:password string @since CUPS 1.1.20@ */
-  int                  digest_tries;   /* Number of tries for digest auth @since CUPS 1.1.20@ */
-  /**** New in CUPS 1.2 ****/
-  off_t                        data_remaining; /* Number of bytes left @since CUPS 1.2@ */
-  http_addr_t          *hostaddr;      /* Current host address and port @since CUPS 1.2@ */
-  http_addrlist_t      *addrlist;      /* List of valid addresses @since CUPS 1.2@ */
-  char                 wbuffer[HTTP_MAX_BUFFER];
-                                       /* Buffer for outgoing data */
-  int                  wused;          /* Write buffer bytes used @since CUPS 1.2@ */
-} http_t;
+typedef struct _http_s http_t;         /**** HTTP connection type ****/
 
 
 /*
  * Prototypes...
  */
 
-#  define              httpBlocking(http,b)    (http)->blocking = (b)
+extern void            httpBlocking(http_t *http, int b);
 extern int             httpCheck(http_t *http);
-#  define              httpClearFields(http)   memset((http)->fields, 0, sizeof((http)->fields)),\
-                                               httpSetField((http), HTTP_FIELD_HOST, (http)->hostname)
+extern void            httpClearFields(http_t *http);
 extern void            httpClose(http_t *http);
 extern http_t          *httpConnect(const char *host, int port);
 extern http_t          *httpConnectEncrypt(const char *host, int port,
                                            http_encryption_t encryption);
 extern int             httpDelete(http_t *http, const char *uri);
 extern int             httpEncryption(http_t *http, http_encryption_t e);
-#  define              httpError(http) ((http)->error)
+extern int             httpError(http_t *http);
 extern void            httpFlush(http_t *http);
 extern int             httpGet(http_t *http, const char *uri);
 extern char            *httpGets(char *line, int length, http_t *http);
 extern const char      *httpGetDateString(time_t t);
 extern time_t          httpGetDateTime(const char *s);
-#  define              httpGetField(http,field)        (http)->fields[field]
+extern const char      *httpGetField(http_t *http, http_field_t field);
 extern struct hostent  *httpGetHostByName(const char *name);
 extern char            *httpGetSubField(http_t *http, http_field_t field,
                                         const char *name, char *value);
@@ -384,7 +358,7 @@ __attribute__ ((__format__ (__printf__, 2, 3)))
 #  endif /* __GNUC__ */
 ;
 extern int             httpPut(http_t *http, const char *uri);
-extern int             httpRead(http_t *http, char *buffer, int length);
+extern int             httpRead(http_t *http, char *buffer, int length) _HTTP_DEPRECATED;
 extern int             httpReconnect(http_t *http);
 extern void            httpSeparate(const char *uri, char *method,
                                     char *username, char *host, int *port,
@@ -394,7 +368,7 @@ extern void         httpSetField(http_t *http, http_field_t field,
 extern const char      *httpStatus(http_status_t status);
 extern int             httpTrace(http_t *http, const char *uri);
 extern http_status_t   httpUpdate(http_t *http);
-extern int             httpWrite(http_t *http, const char *buffer, int length);
+extern int             httpWrite(http_t *http, const char *buffer, int length) _HTTP_DEPRECATED;
 extern char            *httpEncode64(char *out, const char *in) _HTTP_DEPRECATED;
 extern char            *httpDecode64(char *out, const char *in) _HTTP_DEPRECATED;
 extern int             httpGetLength(http_t *http) _HTTP_DEPRECATED;
@@ -406,7 +380,7 @@ extern char         *httpMD5String(const unsigned char *, char [33]);
 
 /**** New in CUPS 1.1.19 ****/
 extern void            httpClearCookie(http_t *http);
-#define httpGetCookie(http) ((http)->cookie)
+extern const char      *httpGetCookie(http_t *http);
 extern void            httpSetCookie(http_t *http, const char *cookie);
 extern int             httpWait(http_t *http, int msec);
 
@@ -434,29 +408,39 @@ extern char               *httpAddrLookup(const http_addr_t *addr,
                                         char *name, int namelen);
 extern char            *httpAddrString(const http_addr_t *addr,
                                        char *s, int slen);
-extern http_uri_status_t httpAssembleURI(char *uri, int urilen,
+extern http_uri_status_t httpAssembleURI(http_uri_coding_t encoding,
+                                        char *uri, int urilen,
                                         const char *scheme,
                                         const char *username,
                                         const char *host, int port,
                                         const char *resource);
-extern http_uri_status_t httpAssembleURIf(char *uri, int urilen,
+extern http_uri_status_t httpAssembleURIf(http_uri_coding_t encoding,
+                                         char *uri, int urilen,
                                          const char *scheme,
                                          const char *username,
                                          const char *host, int port,
                                          const char *resourcef, ...);
 extern int             httpFlushWrite(http_t *http);
+extern int             httpGetBlocking(http_t *http);
 extern const char      *httpGetDateString2(time_t t, char *s, int slen);
-extern const char      *httpGetHostname(char *s, int slen);
+extern int             httpGetFd(http_t *http);
+extern const char      *httpGetHostname(http_t *http, char *s, int slen);
 extern off_t           httpGetLength2(http_t *http);
+extern http_status_t   httpGetStatus(http_t *http);
 extern char            *httpGetSubField2(http_t *http, http_field_t field,
                                          const char *name, char *value,
                                          int valuelen);
-extern http_uri_status_t httpSeparateURI(const char *uri,
+extern ssize_t         httpRead2(http_t *http, char *buffer, size_t length);
+extern http_uri_status_t httpSeparateURI(http_uri_coding_t decoding,
+                                        const char *uri,
                                         char *scheme, int schemelen,
                                         char *username, int usernamelen,
                                         char *host, int hostlen, int *port,
                                         char *resource, int resourcelen);
+extern void            httpSetExpect(http_t *http, http_status_t expect);
 extern void            httpSetLength(http_t *http, size_t length);
+extern ssize_t         httpWrite2(http_t *http, const char *buffer,
+                                  size_t length);
 
 
 /*
@@ -469,5 +453,5 @@ extern void         httpSetLength(http_t *http, size_t length);
 #endif /* !_CUPS_HTTP_H_ */
 
 /*
- * End of "$Id: http.h 4973 2006-01-25 02:36:02Z mike $".
+ * End of "$Id: http.h 6649 2007-07-11 21:46:42Z mike $".
  */