Justin Bradford's proxy support patch. Currently supports only HTTP
[u/mdw/putty] / proxy.h
1 /*
2 * Network proxy abstraction in PuTTY
3 *
4 * A proxy layer, if necessary, wedges itself between the
5 * network code and the higher level backend.
6 *
7 * Supported proxies: HTTP CONNECT, generic telnet
8 * In progress: SOCKS
9 */
10
11 #ifndef PUTTY_PROXY_H
12 #define PUTTY_PROXY_H
13
14 #define PROXY_ERROR_GENERAL 8000
15 #define PROXY_ERROR_UNEXPECTED 8001
16
17 typedef struct Socket_proxy_tag * Proxy_Socket;
18
19 struct Socket_proxy_tag {
20 struct socket_function_table *fn;
21 /* the above variable absolutely *must* be the first in this structure */
22
23 char * error;
24
25 Socket sub_socket;
26 Plug plug;
27 SockAddr remote_addr;
28 int remote_port;
29
30 bufchain pending_output_data;
31 bufchain pending_oob_output_data;
32 int pending_flush;
33 bufchain pending_input_data;
34
35 #define PROXY_STATE_NEW -1
36 #define PROXY_STATE_ACTIVE 0
37
38 int state; /* proxy states greater than 0 are implementation
39 * dependent, but represent various stages/states
40 * of the initialization/setup/negotiation with the
41 * proxy server.
42 */
43 int freeze; /* should we freeze the underlying socket when
44 * we are done with the proxy negotiation? this
45 * simply caches the value of sk_set_frozen calls.
46 */
47
48 #define PROXY_CHANGE_NEW -1
49 #define PROXY_CHANGE_CLOSING 0
50 #define PROXY_CHANGE_SENT 1
51 #define PROXY_CHANGE_RECEIVE 2
52 #define PROXY_CHANGE_ACCEPTING 3
53
54 /* something has changed (a call from the sub socket
55 * layer into our Proxy Plug layer, or we were just
56 * created, etc), so the proxy layer needs to handle
57 * this change (the type of which is the second argument)
58 * and further the proxy negotiation process.
59 */
60
61 int (*negotiate) (Proxy_Socket /* this */, int /* change type */);
62
63 /* current arguments of plug handlers
64 * (for use by proxy's negotiate function)
65 */
66
67 /* closing */
68 char *closing_error_msg;
69 int closing_error_code;
70 int closing_calling_back;
71
72 /* receive */
73 int receive_urgent;
74 char *receive_data;
75 int receive_len;
76
77 /* sent */
78 int sent_bufsize;
79
80 /* accepting */
81 void *accepting_sock;
82
83 /* spin locks, for the critical switch from negotiating
84 * to active state. we have to dump all of our pending
85 * buffers without new events (read, writes, etc) corrupting
86 * things. we should not have built up a large amount of
87 * pending data during negotiation, so hopefully this will
88 * not have a large effect on performance.
89 */
90
91 char lock_close;
92 char lock_write;
93 char lock_write_oob;
94 char lock_receive;
95 char lock_flush;
96 char lock_closing;
97 char lock_sent;
98 char lock_accepting;
99 char lock_freeze;
100
101 };
102
103 typedef struct Plug_proxy_tag * Proxy_Plug;
104
105 struct Plug_proxy_tag {
106 struct plug_function_table *fn;
107 /* the above variable absolutely *must* be the first in this structure */
108
109 Proxy_Socket proxy_socket;
110
111 };
112
113 extern void proxy_activate (Proxy_Socket);
114
115 extern int proxy_http_negotiate (Proxy_Socket, int);
116 extern int proxy_telnet_negotiate (Proxy_Socket, int);
117 extern int proxy_socks_negotiate (Proxy_Socket, int);
118
119 #endif