Mercurial > hg > nginx-vendor-0-8
diff src/http/modules/proxy/ngx_http_proxy_handler.h @ 0:f0b350454894 NGINX_0_1_0
nginx 0.1.0
*) The first public version.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 04 Oct 2004 00:00:00 +0400 |
parents | |
children | cc9f381affaa |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/http/modules/proxy/ngx_http_proxy_handler.h @@ -0,0 +1,260 @@ + +/* + * 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 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 *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_ */