Igor Sysoev | 0441050 | 2003-08-01 14:56:33 +0000 | [diff] [blame] | 1 | #ifndef _NGX_HTTP_PROXY_HANDLER_H_INCLUDED_ |
| 2 | #define _NGX_HTTP_PROXY_HANDLER_H_INCLUDED_ |
| 3 | |
| 4 | |
| 5 | #include <ngx_config.h> |
| 6 | #include <ngx_core.h> |
| 7 | #include <ngx_event.h> |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 8 | #include <ngx_event_connect.h> |
| 9 | #include <ngx_event_pipe.h> |
Igor Sysoev | 0441050 | 2003-08-01 14:56:33 +0000 | [diff] [blame] | 10 | #include <ngx_http.h> |
| 11 | |
| 12 | |
Igor Sysoev | cf80a70 | 2003-11-03 22:20:44 +0000 | [diff] [blame] | 13 | typedef enum { |
| 14 | NGX_HTTP_PROXY_CACHE_PASS = 1, |
| 15 | NGX_HTTP_PROXY_CACHE_BYPASS, |
| 16 | NGX_HTTP_PROXY_CACHE_AUTH, |
| 17 | NGX_HTTP_PROXY_CACHE_PGNC, |
| 18 | NGX_HTTP_PROXY_CACHE_MISS, |
| 19 | NGX_HTTP_PROXY_CACHE_EXPR, |
| 20 | NGX_HTTP_PROXY_CACHE_AGED, |
| 21 | NGX_HTTP_PROXY_CACHE_HIT |
| 22 | } ngx_http_proxy_state_e; |
| 23 | |
| 24 | |
| 25 | typedef enum { |
| 26 | NGX_HTTP_PROXY_CACHE_BPS = 1, |
| 27 | NGX_HTTP_PROXY_CACHE_XAE, |
| 28 | NGX_HTTP_PROXY_CACHE_CTL, |
| 29 | NGX_HTTP_PROXY_CACHE_EXP, |
| 30 | NGX_HTTP_PROXY_CACHE_MVD, |
| 31 | NGX_HTTP_PROXY_CACHE_LMF, |
| 32 | NGX_HTTP_PROXY_CACHE_PDE |
| 33 | } ngx_http_proxy_reason_e; |
| 34 | |
| 35 | |
Igor Sysoev | ae5c59c | 2003-08-14 06:00:28 +0000 | [diff] [blame] | 36 | typedef struct { |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 37 | ngx_str_t url; |
| 38 | ngx_str_t host; |
| 39 | ngx_str_t uri; |
| 40 | ngx_str_t host_header; |
| 41 | ngx_str_t port_text; |
| 42 | ngx_str_t *location; |
| 43 | int port; |
| 44 | } ngx_http_proxy_upstream_conf_t; |
Igor Sysoev | d404c97 | 2003-10-16 20:19:16 +0000 | [diff] [blame] | 45 | |
| 46 | |
| 47 | typedef struct { |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 48 | ssize_t request_buffer_size; |
| 49 | ngx_msec_t connect_timeout; |
| 50 | ngx_msec_t send_timeout; |
| 51 | ssize_t header_buffer_size; |
| 52 | ngx_msec_t read_timeout; |
Igor Sysoev | d404c97 | 2003-10-16 20:19:16 +0000 | [diff] [blame] | 53 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 54 | ngx_bufs_t bufs; |
| 55 | ssize_t busy_buffers_size; |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 56 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 57 | ssize_t max_temp_file_size; |
| 58 | ssize_t temp_file_write_size; |
| 59 | int cyclic_temp_file; |
Igor Sysoev | 931a400 | 2003-10-07 15:30:05 +0000 | [diff] [blame] | 60 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 61 | int cache; |
Igor Sysoev | cf80a70 | 2003-11-03 22:20:44 +0000 | [diff] [blame] | 62 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 63 | int pass_server; |
Igor Sysoev | cf80a70 | 2003-11-03 22:20:44 +0000 | [diff] [blame] | 64 | int pass_x_accel_expires; |
| 65 | |
| 66 | int ignore_expires; |
| 67 | int lm_factor; |
| 68 | int default_expires; |
Igor Sysoev | ab0c4f5 | 2003-10-28 15:45:41 +0000 | [diff] [blame] | 69 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 70 | int next_upstream; |
| 71 | int use_stale; |
Igor Sysoev | 10fc9ef | 2003-10-27 08:53:49 +0000 | [diff] [blame] | 72 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 73 | ngx_path_t *cache_path; |
| 74 | ngx_path_t *temp_path; |
Igor Sysoev | 931a400 | 2003-10-07 15:30:05 +0000 | [diff] [blame] | 75 | |
Igor Sysoev | 9cc1ace | 2003-11-04 22:12:39 +0000 | [diff] [blame] | 76 | ngx_http_busy_lock_t *busy_lock; |
| 77 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 78 | ngx_http_proxy_upstream_conf_t *upstream; |
| 79 | ngx_peers_t *peers; |
Igor Sysoev | ae5c59c | 2003-08-14 06:00:28 +0000 | [diff] [blame] | 80 | } ngx_http_proxy_loc_conf_t; |
| 81 | |
| 82 | |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 83 | typedef struct { |
Igor Sysoev | cf80a70 | 2003-11-03 22:20:44 +0000 | [diff] [blame] | 84 | ngx_http_proxy_state_e cache; |
| 85 | ngx_http_proxy_reason_e reason; |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 86 | int status; |
| 87 | ngx_str_t *peer; |
Igor Sysoev | fe0f5cc | 2003-10-31 16:05:33 +0000 | [diff] [blame] | 88 | } ngx_http_proxy_state_t; |
| 89 | |
| 90 | |
| 91 | typedef struct { |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 92 | ngx_table_t *headers; /* it must be first field */ |
Igor Sysoev | b5faed2 | 2003-10-29 08:30:44 +0000 | [diff] [blame] | 93 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 94 | ngx_table_elt_t *date; |
| 95 | ngx_table_elt_t *server; |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 96 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 97 | ngx_table_elt_t *expires; |
| 98 | ngx_table_elt_t *cache_control; |
| 99 | ngx_table_elt_t *x_accel_expires; |
| 100 | |
| 101 | ngx_table_elt_t *connection; |
| 102 | ngx_table_elt_t *content_type; |
| 103 | ngx_table_elt_t *content_length; |
| 104 | ngx_table_elt_t *last_modified; |
| 105 | ngx_table_elt_t *accept_ranges; |
| 106 | |
| 107 | off_t content_length_n; |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 108 | } ngx_http_proxy_headers_in_t; |
| 109 | |
| 110 | |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 111 | typedef struct { |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 112 | ngx_http_cache_ctx_t ctx; |
| 113 | int status; |
| 114 | ngx_str_t status_line; |
| 115 | |
| 116 | ngx_http_proxy_headers_in_t headers_in; |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 117 | } ngx_http_proxy_cache_t; |
| 118 | |
| 119 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 120 | typedef struct { |
| 121 | ngx_peer_connection_t peer; |
| 122 | int status; |
| 123 | ngx_str_t status_line; |
| 124 | int method; |
| 125 | |
| 126 | ngx_output_chain_ctx_t *output_chain_ctx; |
| 127 | ngx_event_pipe_t *event_pipe; |
| 128 | |
| 129 | ngx_http_proxy_headers_in_t headers_in; |
| 130 | } ngx_http_proxy_upstream_t; |
| 131 | |
| 132 | |
Igor Sysoev | 0441050 | 2003-08-01 14:56:33 +0000 | [diff] [blame] | 133 | typedef struct ngx_http_proxy_ctx_s ngx_http_proxy_ctx_t; |
| 134 | |
| 135 | struct ngx_http_proxy_ctx_s { |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 136 | ngx_http_request_t *request; |
| 137 | ngx_http_proxy_loc_conf_t *lcf; |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 138 | ngx_http_proxy_upstream_t *upstream; |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 139 | ngx_http_proxy_cache_t *cache; |
Igor Sysoev | 0441050 | 2003-08-01 14:56:33 +0000 | [diff] [blame] | 140 | |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 141 | ngx_hunk_t *header_in; |
Igor Sysoev | ae5c59c | 2003-08-14 06:00:28 +0000 | [diff] [blame] | 142 | |
Igor Sysoev | e8732b0 | 2003-11-05 17:03:41 +0000 | [diff] [blame^] | 143 | time_t busy_lock_time; |
Igor Sysoev | 931a400 | 2003-10-07 15:30:05 +0000 | [diff] [blame] | 144 | |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 145 | unsigned accel:1; |
| 146 | |
| 147 | unsigned cachable:1; |
| 148 | unsigned stale:1; |
Igor Sysoev | 9cc1ace | 2003-11-04 22:12:39 +0000 | [diff] [blame] | 149 | unsigned valid_header_in:1; |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 150 | |
| 151 | unsigned request_sent:1; |
| 152 | unsigned header_sent:1; |
Igor Sysoev | 931a400 | 2003-10-07 15:30:05 +0000 | [diff] [blame] | 153 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 154 | |
Igor Sysoev | 1dd4ac8 | 2003-10-06 03:56:42 +0000 | [diff] [blame] | 155 | /* used to parse an upstream HTTP header */ |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 156 | int status; |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 157 | char *status_start; |
| 158 | char *status_end; |
| 159 | int status_count; |
Igor Sysoev | cf80a70 | 2003-11-03 22:20:44 +0000 | [diff] [blame] | 160 | int parse_state; |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 161 | |
Igor Sysoev | cf80a70 | 2003-11-03 22:20:44 +0000 | [diff] [blame] | 162 | ngx_http_proxy_state_t *state; |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 163 | ngx_array_t states; /* of ngx_http_proxy_state_t */ |
Igor Sysoev | fe0f5cc | 2003-10-31 16:05:33 +0000 | [diff] [blame] | 164 | |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 165 | char *action; |
| 166 | ngx_http_log_ctx_t *saved_ctx; |
| 167 | ngx_log_handler_pt saved_handler; |
Igor Sysoev | 0441050 | 2003-08-01 14:56:33 +0000 | [diff] [blame] | 168 | }; |
| 169 | |
| 170 | |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 171 | #define NGX_HTTP_PROXY_PARSE_NO_HEADER 20 |
| 172 | |
Igor Sysoev | cf80a70 | 2003-11-03 22:20:44 +0000 | [diff] [blame] | 173 | |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 174 | #define NGX_HTTP_PROXY_FT_ERROR 2 |
| 175 | #define NGX_HTTP_PROXY_FT_TIMEOUT 4 |
| 176 | #define NGX_HTTP_PROXY_FT_INVALID_HEADER 8 |
| 177 | #define NGX_HTTP_PROXY_FT_HTTP_500 16 |
| 178 | #define NGX_HTTP_PROXY_FT_HTTP_404 32 |
| 179 | #define NGX_HTTP_PROXY_FT_BUSY_LOCK 64 |
| 180 | #define NGX_HTTP_PROXY_FT_MAX_WAITING 128 |
| 181 | |
| 182 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 183 | int ngx_http_proxy_request_upstream(ngx_http_proxy_ctx_t *p); |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 184 | |
| 185 | int ngx_http_proxy_get_cached_response(ngx_http_proxy_ctx_t *p); |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 186 | int ngx_http_proxy_send_cached_response(ngx_http_proxy_ctx_t *p); |
Igor Sysoev | cf80a70 | 2003-11-03 22:20:44 +0000 | [diff] [blame] | 187 | int ngx_http_proxy_is_cachable(ngx_http_proxy_ctx_t *p); |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 188 | int ngx_http_proxy_update_cache(ngx_http_proxy_ctx_t *p); |
| 189 | |
Igor Sysoev | a1512b1 | 2003-11-03 17:33:31 +0000 | [diff] [blame] | 190 | size_t ngx_http_proxy_log_error(void *data, char *buf, size_t len); |
| 191 | void ngx_http_proxy_finalize_request(ngx_http_proxy_ctx_t *p, int rc); |
Igor Sysoev | e8732b0 | 2003-11-05 17:03:41 +0000 | [diff] [blame^] | 192 | void ngx_http_proxy_close_connection(ngx_http_proxy_ctx_t *p); |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 193 | |
| 194 | int ngx_http_proxy_parse_status_line(ngx_http_proxy_ctx_t *p); |
| 195 | int ngx_http_proxy_copy_header(ngx_http_proxy_ctx_t *p, |
| 196 | ngx_http_proxy_headers_in_t *headers_in); |
| 197 | |
| 198 | |
| 199 | |
| 200 | extern ngx_module_t ngx_http_proxy_module; |
| 201 | extern ngx_http_header_t ngx_http_proxy_headers_in[]; |
| 202 | |
Igor Sysoev | 10fc9ef | 2003-10-27 08:53:49 +0000 | [diff] [blame] | 203 | |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 204 | |
Igor Sysoev | 0441050 | 2003-08-01 14:56:33 +0000 | [diff] [blame] | 205 | #endif /* _NGX_HTTP_PROXY_HANDLER_H_INCLUDED_ */ |