view src/http/modules/proxy/ngx_http_proxy_handler.h @ 34:aab2ea7c0458 NGINX_0_1_17

nginx 0.1.17 *) Change: the ngx_http_rewrite_module was rewritten from the scratch. Now it is possible to redirect, to return the error codes, to check the variables and referrers. The directives can be used inside locations. The redirect directive was canceled. *) Feature: the ngx_http_geo_module. *) Feature: the proxy_set_x_var and fastcgi_set_var directives. *) Bugfix: the location configuration with "=" modifier may be used in another location. *) Bugfix: the correct content type was set only for requests that use small caps letters in extension. *) Bugfix: if the proxy_pass or fastcgi_pass directives were set in the location, and access was denied, and the error was redirected to a static page, then the segmentation fault occurred. *) Bugfix: if in a proxied "Location" header was a relative URL, then a host name and a slash were added to them; bug appeared in 0.1.14. *) Bugfix: the system error message was not logged on Linux.
author Igor Sysoev <http://sysoev.ru>
date Thu, 03 Feb 2005 00:00:00 +0300
parents da8c190bdaba
children a39d1b793287
line wrap: on
line source


/*
 * 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;

    char                            *uri_separator;

    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_url;
    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_array_t                      x_vars;

    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;

#if (NGX_HTTP_GZIP)
    ngx_table_elt_t                 *content_encoding;
#endif

    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_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);

u_char *ngx_http_proxy_log_error(ngx_log_t *log, u_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_ */