/*****************************************************************************/
/*
                                 Proxy.h

08-AUG-1998  MGD  initial
*/
/*****************************************************************************/

#ifndef PROXY_H_LOADED
#define PROXY_H_LOADED 1

#include "proxystruct.h"
#include "proxytunnel.h"

/* some defaults */
#define PROXY_CACHE_NEGATIVE_SECONDS   300
#define PROXY_CONNECT_PERSIST_MAX      100
#define PROXY_CONNECT_PERSIST_SECONDS   30
#define PROXY_LOCATION_REBUILD_BUFFER 1024
#define PROXY_HEADER_REBUILD_LARGESSE 1024

/* proxy scheme */
#define PROXY_SCHEME_CONNECT   1
#define PROXY_SCHEME_HTTP      2
#define PROXY_SCHEME_HTTPSSL   3
#define PROXY_SCHEME_FTP       4

/* controlling the HTTP->SSL proxy gateway */
#define PROXY_HTTPSSL_NONE        0
#define PROXY_HTTPSSL_443       443
#define PROXY_HTTPSSL_ALL        -1

/*#   define PROXY_ERROR_HOST_UNKNOWN       0x000182b2*/
    /* this is an SS$_ENDOFFILE */
#define PROXY_ERROR_HOST_UNKNOWN       0x00000870
#define PROXY_ERROR_CONNECT_REFUSED    0x00000294
#define PROXY_ERROR_HOST_UNREACHABLE   0x00002094
#define PROXY_ERROR_HOST_DISCONNECTED  0x0000207c
#define PROXY_ERROR_HOST_TIMEOUT       0x0000022c

/* any FTP proxy specific behaviour that needs to be specially accomodated */
#define PROXY_FTP_SPECIFIC_NONE     0x0
#define PROXY_FTP_SPECIFIC_MADGOAT  0x1

#define PROXY_FORWARDED_DISABLED      0
#define PROXY_FORWARDED_BY            1
#define PROXY_FORWARDED_FOR           2
#define PROXY_FORWARDED_ADDRESS       3
#define PROXY_FORWARDED_NONE          4  /* used by mapping rules */

#define PROXY_XFORWARDEDFOR_DISABLED  0
#define PROXY_XFORWARDEDFOR_ENABLED   1
#define PROXY_XFORWARDEDFOR_ADDRESS   2
#define PROXY_XFORWARDEDFOR_UNKNOWN   3
#define PROXY_XFORWARDEDFOR_NONE      4  /* used by mapping rules */

/* prefix to cookie name */
#define PROXY_AFFINITY_COOKIE_PREFIX "WASDproxyAffinity_"

/***********************/
/* function prototypes */
/***********************/

ProxyEnd (PROXY_TASK*);
ProxyEndClientShutdownAst (REQUEST_STRUCT*);
ProxyEndProxyShutdownAst (PROXY_TASK*);
ProxyReadResponseAst (PROXY_TASK*);
ProxyReadResponseCacheWrite (PROXY_TASK*);
ProxyReadResponseCacheWriteAst (PROXY_TASK*);
int ProxyResponseChunked (PROXY_TASK*);
int ProxyResponseHeader (PROXY_TASK*);
void ProxyResponseNetRead (PROXY_TASK*);
void ProxyResponseNetWrite (PROXY_TASK*);
void ProxyResponseNetWriteAst (REQUEST_STRUCT*);
ProxyReadCacheFailed (PROXY_TASK*);
char* ProxyRebuildLocation (PROXY_TASK*, char*);
int ProxyRequestBegin (REQUEST_STRUCT*);
int ProxyRequestParse (REQUEST_STRUCT*);
ProxyRequestRebuild (PROXY_TASK*);
ProxyResponseRebuild (PROXY_TASK*, char*, int);
int ProxyServiceCount ();
ProxyWriteRequest (PROXY_TASK*);
ProxyWriteRequestAst (PROXY_TASK*);
ProxyWriteRequestBody (REQUEST_STRUCT*);
ProxyWriteRequestBodyAst (PROXY_TASK*);

void ProxyReworkBody (PROXY_TASK*);
void ProxyReworkBuffer (PROXY_TASK*);
void ProxyReworkHeader (PROXY_TASK*);
void ProxyReworkProcess (PROXY_TASK*);
BOOL ProxyReworkResponse (PROXY_TASK*);
BOOL ProxyReworkSniffHtml (PROXY_TASK*);
void ProxyReworkWriteBody (REQUEST_STRUCT*);
void ProxyReworkEnd (REQUEST_STRUCT*);

#endif /* PROXY_H_LOADED */

/*****************************************************************************/

