view src/http/ngx_http_upstream.h @ 196:8759b346e431 NGINX_0_3_45

nginx 0.3.45 *) Feature: the "ssl_verify_client", "ssl_verify_depth", and "ssl_client_certificate" directives. *) Change: the $request_method variable now returns the main request method. *) Change: the ° symbol codes were changed in koi-win conversion table. *) Feature: the euro и N symbols were added to koi-win conversion table. *) Bugfix: if nginx distributed the requests among several backends and some backend failed, then requests intended for this backend was directed to one live backend only instead of being distributed among the rest.
author Igor Sysoev <http://sysoev.ru>
date Sat, 06 May 2006 00:00:00 +0400
parents 87699398f955
children e6da4931e0e0
line wrap: on
line source


/*
 * Copyright (C) Igor Sysoev
 */


#ifndef _NGX_HTTP_UPSTREAM_H_INCLUDED_
#define _NGX_HTTP_UPSTREAM_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>


#define NGX_HTTP_UPSTREAM_FT_ERROR           0x002
#define NGX_HTTP_UPSTREAM_FT_TIMEOUT         0x004
#define NGX_HTTP_UPSTREAM_FT_INVALID_HEADER  0x008
#define NGX_HTTP_UPSTREAM_FT_HTTP_500        0x010
#define NGX_HTTP_UPSTREAM_FT_HTTP_503        0x020
#define NGX_HTTP_UPSTREAM_FT_HTTP_404        0x040
#define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK       0x080
#define NGX_HTTP_UPSTREAM_FT_MAX_WAITING     0x100


#define NGX_HTTP_UPSTREAM_INVALID_HEADER     40


typedef struct {
    ngx_msec_t                      bl_time;
    ngx_uint_t                      bl_state;

    ngx_uint_t                      status;
    ngx_msec_t                      response_time;

    ngx_str_t                      *peer;
} ngx_http_upstream_state_t;


typedef struct {
    ngx_hash0_t                     headers_in_hash;
} ngx_http_upstream_main_conf_t;


typedef struct {
    ngx_msec_t                      connect_timeout;
    ngx_msec_t                      send_timeout;
    ngx_msec_t                      read_timeout;
    ngx_msec_t                      timeout;

    size_t                          send_lowat;
    size_t                          buffer_size;

    size_t                          busy_buffers_size;
    size_t                          max_temp_file_size;
    size_t                          temp_file_write_size;

    size_t                          busy_buffers_size_conf;
    size_t                          max_temp_file_size_conf;
    size_t                          temp_file_write_size_conf;

    ngx_uint_t                      next_upstream;
    ngx_uint_t                      max_fails;

    time_t                          fail_timeout;

    ngx_bufs_t                      bufs;

    ngx_flag_t                      buffering;
    ngx_flag_t                      pass_request_headers;
    ngx_flag_t                      pass_request_body;

    ngx_flag_t                      ignore_client_abort;
    ngx_flag_t                      redirect_errors;
    ngx_flag_t                      cyclic_temp_file;

    ngx_flag_t                      pass_x_powered_by;
    ngx_flag_t                      pass_server;
    ngx_flag_t                      pass_date;
    ngx_flag_t                      pass_x_accel_expires;

    ngx_path_t                     *temp_path;

    ngx_str_t                       schema;
    ngx_str_t                       uri;
    ngx_str_t                       location;
    ngx_str_t                       url;  /* used in proxy_rewrite_location */

    ngx_uint_t                      redirect_404; /* unsigned redirect_404:1; */

#if (NGX_HTTP_SSL)
    ngx_ssl_t                      *ssl;
#endif

} ngx_http_upstream_conf_t;


typedef struct {
    ngx_str_t                       name;
    ngx_http_header_handler_pt      handler;
    ngx_uint_t                      offset;
    ngx_http_header_handler_pt      copy_handler;
    ngx_uint_t                      conf;
    ngx_uint_t                      redirect;  /* unsigned   redirect:1; */
} ngx_http_upstream_header_t;


typedef struct {
    ngx_list_t                      headers;

    ngx_uint_t                      status_n;
    ngx_str_t                       status_line;

    ngx_table_elt_t                *status;
    ngx_table_elt_t                *date;
    ngx_table_elt_t                *server;
    ngx_table_elt_t                *connection;

    ngx_table_elt_t                *expires;
    ngx_table_elt_t                *etag;
    ngx_table_elt_t                *x_accel_expires;
    ngx_table_elt_t                *x_accel_redirect;
    ngx_table_elt_t                *x_accel_limit_rate;

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

#if (NGX_HTTP_GZIP)
    ngx_table_elt_t                *content_encoding;
#endif

    ngx_array_t                     cache_control;
} ngx_http_upstream_headers_in_t;


struct ngx_http_upstream_s {
    ngx_peer_connection_t           peer;

    ngx_event_pipe_t               *pipe;

    ngx_chain_t                    *request_bufs;

    ngx_output_chain_ctx_t          output;
    ngx_chain_writer_ctx_t          writer;

    ngx_http_upstream_conf_t       *conf;

    ngx_http_upstream_headers_in_t  headers_in;

    ngx_buf_t                       buffer;
    size_t                          length;

    ngx_chain_t                    *out_bufs;
    ngx_chain_t                    *busy_bufs;
    ngx_chain_t                    *free_bufs;

    ngx_int_t                     (*input_filter_init)(void *data);
    ngx_int_t                     (*input_filter)(void *data, ssize_t bytes);
    void                           *input_filter_ctx;

    ngx_int_t                     (*create_request)(ngx_http_request_t *r);
    ngx_int_t                     (*reinit_request)(ngx_http_request_t *r);
    ngx_int_t                     (*process_header)(ngx_http_request_t *r);
    void                          (*abort_request)(ngx_http_request_t *r);
    void                          (*finalize_request)(ngx_http_request_t *r,
                                        ngx_int_t rc);
    ngx_int_t                     (*rewrite_redirect)(ngx_http_request_t *r,
                                        ngx_table_elt_t *h, size_t prefix);

    ngx_msec_t                      timeout;

    ngx_str_t                       method;

    ngx_http_log_handler_pt         saved_log_handler;

    ngx_http_upstream_state_t      *state;
    ngx_array_t                     states;  /* of ngx_http_upstream_state_t */

    ngx_str_t                       uri;

    ngx_http_cleanup_pt            *cleanup;

    unsigned                        cachable:1;
    unsigned                        accel:1;

    unsigned                        request_sent:1;
    unsigned                        header_sent:1;
};


void ngx_http_upstream_init(ngx_http_request_t *r);


extern ngx_module_t  ngx_http_upstream_module;


#endif /* _NGX_HTTP_UPSTREAM_H_INCLUDED_ */