1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
|
/*
* Copyright (C) Igor Sysoev
*/
#ifndef _NGX_HTTP_PROXY_HANDLER_H_INCLUDED_
#define _NGX_HTTP_PROXY_HANDLER_H_INCLUDED_
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>
#include <ngx_event_connect.h>
#include <ngx_event_pipe.h>
#include <ngx_http.h>
typedef enum {
NGX_HTTP_PROXY_CACHE_PASS = 1,
NGX_HTTP_PROXY_CACHE_BYPASS,
NGX_HTTP_PROXY_CACHE_AUTH,
NGX_HTTP_PROXY_CACHE_PGNC,
NGX_HTTP_PROXY_CACHE_MISS,
NGX_HTTP_PROXY_CACHE_EXPR,
NGX_HTTP_PROXY_CACHE_AGED,
NGX_HTTP_PROXY_CACHE_HIT
} ngx_http_proxy_state_e;
typedef enum {
NGX_HTTP_PROXY_CACHE_BPS = 1,
NGX_HTTP_PROXY_CACHE_XAE,
NGX_HTTP_PROXY_CACHE_CTL,
NGX_HTTP_PROXY_CACHE_EXP,
NGX_HTTP_PROXY_CACHE_MVD,
NGX_HTTP_PROXY_CACHE_LMF,
NGX_HTTP_PROXY_CACHE_PDE
} ngx_http_proxy_reason_e;
typedef struct {
ngx_str_t url;
ngx_str_t host;
ngx_str_t uri;
ngx_str_t host_header;
ngx_str_t port_text;
ngx_str_t *location;
in_port_t port;
unsigned default_port:1;
} ngx_http_proxy_upstream_conf_t;
typedef struct {
size_t send_lowat;
size_t header_buffer_size;
size_t busy_buffers_size;
size_t max_temp_file_size;
size_t temp_file_write_size;
ngx_msec_t connect_timeout;
ngx_msec_t send_timeout;
ngx_msec_t read_timeout;
time_t default_expires;
ngx_int_t lm_factor;
ngx_uint_t next_upstream;
ngx_uint_t use_stale;
ngx_bufs_t bufs;
ngx_flag_t cyclic_temp_file;
ngx_flag_t cache;
ngx_flag_t preserve_host;
ngx_flag_t set_x_real_ip;
ngx_flag_t add_x_forwarded_for;
ngx_flag_t pass_server;
ngx_flag_t pass_x_accel_expires;
ngx_flag_t ignore_expires;
ngx_path_t *cache_path;
ngx_path_t *temp_path;
ngx_http_busy_lock_t *busy_lock;
ngx_http_proxy_upstream_conf_t *upstream;
ngx_peers_t *peers;
} ngx_http_proxy_loc_conf_t;
/*
* "EXPR/10/5/- 200/EXP/60 4"
* "MISS/-/-/B 503/-/- -"
* "EXPR/10/20/SB HIT/-/- -"
* "EXPR/10/15/NB HIT/-/- -"
*/
typedef struct {
ngx_http_proxy_state_e cache_state;
time_t expired;
time_t bl_time;
ngx_uint_t bl_state;
ngx_uint_t status;
ngx_http_proxy_reason_e reason;
time_t time;
time_t expires;
ngx_str_t *peer;
} ngx_http_proxy_state_t;
typedef struct {
ngx_list_t headers;
#if 0
ngx_table_t headers; /* it must be first field */
#endif
ngx_table_elt_t *date;
ngx_table_elt_t *server;
ngx_table_elt_t *expires;
ngx_table_elt_t *cache_control;
ngx_table_elt_t *etag;
ngx_table_elt_t *x_accel_expires;
ngx_table_elt_t *connection;
ngx_table_elt_t *content_type;
ngx_table_elt_t *content_length;
ngx_table_elt_t *content_encoding;
ngx_table_elt_t *last_modified;
ngx_table_elt_t *location;
ngx_table_elt_t *accept_ranges;
ngx_table_elt_t *x_pad;
off_t content_length_n;
} ngx_http_proxy_headers_in_t;
typedef struct {
ngx_http_cache_ctx_t ctx;
ngx_uint_t status;
ngx_str_t status_line;
ngx_http_proxy_headers_in_t headers_in;
} ngx_http_proxy_cache_t;
typedef struct {
ngx_peer_connection_t peer;
ngx_uint_t status;
ngx_str_t status_line;
ngx_uint_t method;
ngx_output_chain_ctx_t *output_chain_ctx;
ngx_event_pipe_t *event_pipe;
ngx_http_proxy_headers_in_t headers_in;
} ngx_http_proxy_upstream_t;
typedef struct ngx_http_proxy_ctx_s ngx_http_proxy_ctx_t;
struct ngx_http_proxy_ctx_s {
ngx_http_request_t *request;
ngx_http_proxy_loc_conf_t *lcf;
ngx_http_proxy_upstream_t *upstream;
ngx_http_proxy_cache_t *cache;
ngx_buf_t *header_in;
ngx_http_busy_lock_ctx_t busy_lock;
unsigned accel:1;
unsigned cachable:1;
unsigned stale:1;
unsigned try_busy_lock:1;
unsigned busy_locked:1;
unsigned valid_header_in:1;
unsigned request_sent:1;
unsigned header_sent:1;
/* used to parse an upstream HTTP header */
ngx_uint_t status;
u_char *status_start;
u_char *status_end;
ngx_uint_t status_count;
ngx_uint_t parse_state;
ngx_http_proxy_state_t *state;
ngx_array_t states; /* of ngx_http_proxy_state_t */
/*
* we declare "action" as "char *" because the actions are usually
* the static strings and in the "u_char *" case we have to override
* all the time their types
*/
char *action;
ngx_http_log_ctx_t *saved_ctx;
ngx_log_handler_pt saved_handler;
};
typedef struct {
ngx_uint_t connection;
ngx_http_proxy_ctx_t *proxy;
} ngx_http_proxy_log_ctx_t;
#define NGX_HTTP_PROXY_PARSE_NO_HEADER 30
#define NGX_HTTP_PROXY_FT_ERROR 0x02
#define NGX_HTTP_PROXY_FT_TIMEOUT 0x04
#define NGX_HTTP_PROXY_FT_INVALID_HEADER 0x08
#define NGX_HTTP_PROXY_FT_HTTP_500 0x10
#define NGX_HTTP_PROXY_FT_HTTP_404 0x20
#define NGX_HTTP_PROXY_FT_BUSY_LOCK 0x40
#define NGX_HTTP_PROXY_FT_MAX_WAITING 0x80
int ngx_http_proxy_request_upstream(ngx_http_proxy_ctx_t *p);
#if (NGX_HTTP_FILE_CACHE)
int ngx_http_proxy_get_cached_response(ngx_http_proxy_ctx_t *p);
int ngx_http_proxy_send_cached_response(ngx_http_proxy_ctx_t *p);
int ngx_http_proxy_is_cachable(ngx_http_proxy_ctx_t *p);
int ngx_http_proxy_update_cache(ngx_http_proxy_ctx_t *p);
void ngx_http_proxy_cache_busy_lock(ngx_http_proxy_ctx_t *p);
#endif
void ngx_http_proxy_check_broken_connection(ngx_event_t *ev);
void ngx_http_proxy_busy_lock_handler(ngx_event_t *rev);
void ngx_http_proxy_upstream_busy_lock(ngx_http_proxy_ctx_t *p);
size_t ngx_http_proxy_log_error(void *data, char *buf, size_t len);
void ngx_http_proxy_finalize_request(ngx_http_proxy_ctx_t *p, int rc);
void ngx_http_proxy_close_connection(ngx_http_proxy_ctx_t *p);
int ngx_http_proxy_parse_status_line(ngx_http_proxy_ctx_t *p);
int ngx_http_proxy_copy_header(ngx_http_proxy_ctx_t *p,
ngx_http_proxy_headers_in_t *headers_in);
extern ngx_module_t ngx_http_proxy_module;
extern ngx_http_header_t ngx_http_proxy_headers_in[];
#endif /* _NGX_HTTP_PROXY_HANDLER_H_INCLUDED_ */
|