#ifndef _CUPS_HTTP_H_
# define _CUPS_HTTP_H_
# include <string.h>
# include <time.h>
# ifdef WIN32
# include <winsock.h>
# else
# include <unistd.h>
# include <sys/time.h>
# include <sys/types.h>
# include <sys/socket.h>
# include <netdb.h>
# include <netinet/in.h>
# include <arpa/inet.h>
# include <netinet/in_systm.h>
# include <netinet/ip.h>
# if !defined(__APPLE__) || !defined(TCP_NODELAY)
# include <netinet/tcp.h>
# endif
# endif
# include "md5.h"
# ifdef __cplusplus
extern "C" {
# endif
# define HTTP_MAX_URI 1024
# define HTTP_MAX_HOST 256
# define HTTP_MAX_BUFFER 2048
# define HTTP_MAX_VALUE 256
typedef enum
{
HTTP_WAITING,
HTTP_OPTIONS,
HTTP_GET,
HTTP_GET_SEND,
HTTP_HEAD,
HTTP_POST,
HTTP_POST_RECV,
HTTP_POST_SEND,
HTTP_PUT,
HTTP_PUT_RECV,
HTTP_DELETE,
HTTP_TRACE,
HTTP_CLOSE,
HTTP_STATUS
} http_state_t;
typedef enum
{
HTTP_0_9 = 9,
HTTP_1_0 = 100,
HTTP_1_1 = 101
} http_version_t;
typedef enum
{
HTTP_KEEPALIVE_OFF = 0,
HTTP_KEEPALIVE_ON
} http_keepalive_t;
typedef enum
{
HTTP_ENCODE_LENGTH,
HTTP_ENCODE_CHUNKED
} http_encoding_t;
typedef enum
{
HTTP_ENCRYPT_IF_REQUESTED,
HTTP_ENCRYPT_NEVER,
HTTP_ENCRYPT_REQUIRED,
HTTP_ENCRYPT_ALWAYS
} http_encryption_t;
typedef enum
{
HTTP_AUTH_NONE,
HTTP_AUTH_BASIC,
HTTP_AUTH_MD5,
HTTP_AUTH_MD5_SESS,
HTTP_AUTH_MD5_INT,
HTTP_AUTH_MD5_SESS_INT
} http_auth_t;
typedef enum
{
HTTP_ERROR = -1,
HTTP_CONTINUE = 100,
HTTP_SWITCHING_PROTOCOLS,
HTTP_OK = 200,
HTTP_CREATED,
HTTP_ACCEPTED,
HTTP_NOT_AUTHORITATIVE,
HTTP_NO_CONTENT,
HTTP_RESET_CONTENT,
HTTP_PARTIAL_CONTENT,
HTTP_MULTIPLE_CHOICES = 300,
HTTP_MOVED_PERMANENTLY,
HTTP_MOVED_TEMPORARILY,
HTTP_SEE_OTHER,
HTTP_NOT_MODIFIED,
HTTP_USE_PROXY,
HTTP_BAD_REQUEST = 400,
HTTP_UNAUTHORIZED,
HTTP_PAYMENT_REQUIRED,
HTTP_FORBIDDEN,
HTTP_NOT_FOUND,
HTTP_METHOD_NOT_ALLOWED,
HTTP_NOT_ACCEPTABLE,
HTTP_PROXY_AUTHENTICATION,
HTTP_REQUEST_TIMEOUT,
HTTP_CONFLICT,
HTTP_GONE,
HTTP_LENGTH_REQUIRED,
HTTP_PRECONDITION,
HTTP_REQUEST_TOO_LARGE,
HTTP_URI_TOO_LONG,
HTTP_UNSUPPORTED_MEDIATYPE,
HTTP_UPGRADE_REQUIRED = 426,
HTTP_SERVER_ERROR = 500,
HTTP_NOT_IMPLEMENTED,
HTTP_BAD_GATEWAY,
HTTP_SERVICE_UNAVAILABLE,
HTTP_GATEWAY_TIMEOUT,
HTTP_NOT_SUPPORTED
} http_status_t;
typedef enum
{
HTTP_FIELD_UNKNOWN = -1,
HTTP_FIELD_ACCEPT_LANGUAGE,
HTTP_FIELD_ACCEPT_RANGES,
HTTP_FIELD_AUTHORIZATION,
HTTP_FIELD_CONNECTION,
HTTP_FIELD_CONTENT_ENCODING,
HTTP_FIELD_CONTENT_LANGUAGE,
HTTP_FIELD_CONTENT_LENGTH,
HTTP_FIELD_CONTENT_LOCATION,
HTTP_FIELD_CONTENT_MD5,
HTTP_FIELD_CONTENT_RANGE,
HTTP_FIELD_CONTENT_TYPE,
HTTP_FIELD_CONTENT_VERSION,
HTTP_FIELD_DATE,
HTTP_FIELD_HOST,
HTTP_FIELD_IF_MODIFIED_SINCE,
HTTP_FIELD_IF_UNMODIFIED_SINCE,
HTTP_FIELD_KEEP_ALIVE,
HTTP_FIELD_LAST_MODIFIED,
HTTP_FIELD_LINK,
HTTP_FIELD_LOCATION,
HTTP_FIELD_RANGE,
HTTP_FIELD_REFERER,
HTTP_FIELD_RETRY_AFTER,
HTTP_FIELD_TRANSFER_ENCODING,
HTTP_FIELD_UPGRADE,
HTTP_FIELD_USER_AGENT,
HTTP_FIELD_WWW_AUTHENTICATE,
HTTP_FIELD_MAX
} http_field_t;
typedef struct
{
int fd;
int blocking;
int error;
time_t activity;
http_state_t state;
http_status_t status;
http_version_t version;
http_keepalive_t keep_alive;
struct sockaddr_in hostaddr;
char hostname[HTTP_MAX_HOST],
fields[HTTP_FIELD_MAX][HTTP_MAX_VALUE];
char *data;
http_encoding_t data_encoding;
int data_remaining;
int used;
char buffer[HTTP_MAX_BUFFER];
int auth_type;
md5_state_t md5_state;
char nonce[HTTP_MAX_VALUE];
int nonce_count;
void *tls;
http_encryption_t encryption;
fd_set *input_set;
http_status_t expect;
char *cookie;
} http_t;
# define httpBlocking(http,b) (http)->blocking = (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 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 encrypt);
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 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 struct hostent *httpGetHostByName(const char *name);
extern char *httpGetSubField(http_t *http, http_field_t field,
const char *name, char *value);
extern int httpHead(http_t *http, const char *uri);
extern void httpInitialize(void);
extern int httpOptions(http_t *http, const char *uri);
extern int httpPost(http_t *http, const char *uri);
extern int httpPrintf(http_t *http, const char *format, ...)
# ifdef __GNUC__
__attribute__ ((__format__ (__printf__, 2, 3)))
# endif
;
extern int httpPut(http_t *http, const char *uri);
extern int httpRead(http_t *http, char *buffer, int length);
extern int httpReconnect(http_t *http);
extern void httpSeparate(const char *uri, char *method,
char *username, char *host, int *port,
char *resource);
extern void httpSetField(http_t *http, http_field_t field,
const char *value);
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 char *httpEncode64(char *out, const char *in);
extern char *httpDecode64(char *out, const char *in);
extern int httpGetLength(http_t *http);
extern char *httpMD5(const char *, const char *, const char *,
char [33]);
extern char *httpMD5Final(const char *, const char *, const char *,
char [33]);
extern char *httpMD5String(const md5_byte_t *, char [33]);
extern void httpClearCookie(http_t *http);
#define httpGetCookie(http) ((http)->cookie)
extern void httpSetCookie(http_t *http, const char *cookie);
extern int httpWait(http_t *http, int msec);
# ifdef __cplusplus
}
# endif
#endif