src/http/ngx_http_upstream.h - nginx source code

Data types defined

Macros defined

Source code


  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #ifndef _NGX_HTTP_UPSTREAM_H_INCLUDED_
  6. #define _NGX_HTTP_UPSTREAM_H_INCLUDED_


  7. #include <ngx_config.h>
  8. #include <ngx_core.h>
  9. #include <ngx_event.h>
  10. #include <ngx_event_connect.h>
  11. #include <ngx_event_pipe.h>
  12. #include <ngx_http.h>


  13. #define NGX_HTTP_UPSTREAM_FT_ERROR           0x00000002
  14. #define NGX_HTTP_UPSTREAM_FT_TIMEOUT         0x00000004
  15. #define NGX_HTTP_UPSTREAM_FT_INVALID_HEADER  0x00000008
  16. #define NGX_HTTP_UPSTREAM_FT_HTTP_500        0x00000010
  17. #define NGX_HTTP_UPSTREAM_FT_HTTP_502        0x00000020
  18. #define NGX_HTTP_UPSTREAM_FT_HTTP_503        0x00000040
  19. #define NGX_HTTP_UPSTREAM_FT_HTTP_504        0x00000080
  20. #define NGX_HTTP_UPSTREAM_FT_HTTP_403        0x00000100
  21. #define NGX_HTTP_UPSTREAM_FT_HTTP_404        0x00000200
  22. #define NGX_HTTP_UPSTREAM_FT_HTTP_429        0x00000400
  23. #define NGX_HTTP_UPSTREAM_FT_UPDATING        0x00000800
  24. #define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK       0x00001000
  25. #define NGX_HTTP_UPSTREAM_FT_MAX_WAITING     0x00002000
  26. #define NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT  0x00004000
  27. #define NGX_HTTP_UPSTREAM_FT_NOLIVE          0x40000000
  28. #define NGX_HTTP_UPSTREAM_FT_OFF             0x80000000

  29. #define NGX_HTTP_UPSTREAM_FT_STATUS          (NGX_HTTP_UPSTREAM_FT_HTTP_500  \
  30.                                              |NGX_HTTP_UPSTREAM_FT_HTTP_502  \
  31.                                              |NGX_HTTP_UPSTREAM_FT_HTTP_503  \
  32.                                              |NGX_HTTP_UPSTREAM_FT_HTTP_504  \
  33.                                              |NGX_HTTP_UPSTREAM_FT_HTTP_403  \
  34.                                              |NGX_HTTP_UPSTREAM_FT_HTTP_404  \
  35.                                              |NGX_HTTP_UPSTREAM_FT_HTTP_429)

  36. #define NGX_HTTP_UPSTREAM_INVALID_HEADER     40


  37. #define NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT    0x00000002
  38. #define NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES     0x00000004
  39. #define NGX_HTTP_UPSTREAM_IGN_EXPIRES        0x00000008
  40. #define NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL  0x00000010
  41. #define NGX_HTTP_UPSTREAM_IGN_SET_COOKIE     0x00000020
  42. #define NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE  0x00000040
  43. #define NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING   0x00000080
  44. #define NGX_HTTP_UPSTREAM_IGN_XA_CHARSET     0x00000100
  45. #define NGX_HTTP_UPSTREAM_IGN_VARY           0x00000200


  46. typedef struct {
  47.     ngx_uint_t                       status;
  48.     ngx_msec_t                       response_time;
  49.     ngx_msec_t                       connect_time;
  50.     ngx_msec_t                       header_time;
  51.     ngx_msec_t                       queue_time;
  52.     off_t                            response_length;
  53.     off_t                            bytes_received;
  54.     off_t                            bytes_sent;

  55.     ngx_str_t                       *peer;
  56. } ngx_http_upstream_state_t;


  57. typedef struct {
  58.     ngx_hash_t                       headers_in_hash;
  59.     ngx_array_t                      upstreams;
  60.                                              /* ngx_http_upstream_srv_conf_t */
  61. } ngx_http_upstream_main_conf_t;

  62. typedef struct ngx_http_upstream_srv_conf_s  ngx_http_upstream_srv_conf_t;

  63. typedef ngx_int_t (*ngx_http_upstream_init_pt)(ngx_conf_t *cf,
  64.     ngx_http_upstream_srv_conf_t *us);
  65. typedef ngx_int_t (*ngx_http_upstream_init_peer_pt)(ngx_http_request_t *r,
  66.     ngx_http_upstream_srv_conf_t *us);


  67. typedef struct {
  68.     ngx_http_upstream_init_pt        init_upstream;
  69.     ngx_http_upstream_init_peer_pt   init;
  70.     void                            *data;
  71. } ngx_http_upstream_peer_t;


  72. typedef struct {
  73.     ngx_str_t                        name;
  74.     ngx_addr_t                      *addrs;
  75.     ngx_uint_t                       naddrs;
  76.     ngx_uint_t                       weight;
  77.     ngx_uint_t                       max_conns;
  78.     ngx_uint_t                       max_fails;
  79.     time_t                           fail_timeout;
  80.     ngx_msec_t                       slow_start;
  81.     ngx_uint_t                       down;

  82.     unsigned                         backup:1;

  83. #if (NGX_HTTP_UPSTREAM_ZONE)
  84.     ngx_str_t                        host;
  85.     ngx_str_t                        service;
  86. #endif

  87.     NGX_COMPAT_BEGIN(2)
  88.     NGX_COMPAT_END
  89. } ngx_http_upstream_server_t;


  90. #define NGX_HTTP_UPSTREAM_CREATE        0x0001
  91. #define NGX_HTTP_UPSTREAM_WEIGHT        0x0002
  92. #define NGX_HTTP_UPSTREAM_MAX_FAILS     0x0004
  93. #define NGX_HTTP_UPSTREAM_FAIL_TIMEOUT  0x0008
  94. #define NGX_HTTP_UPSTREAM_DOWN          0x0010
  95. #define NGX_HTTP_UPSTREAM_BACKUP        0x0020
  96. #define NGX_HTTP_UPSTREAM_MODIFY        0x0040
  97. #define NGX_HTTP_UPSTREAM_MAX_CONNS     0x0100


  98. struct ngx_http_upstream_srv_conf_s {
  99.     ngx_http_upstream_peer_t         peer;
  100.     void                           **srv_conf;

  101.     ngx_array_t                     *servers;  /* ngx_http_upstream_server_t */

  102.     ngx_uint_t                       flags;
  103.     ngx_str_t                        host;
  104.     u_char                          *file_name;
  105.     ngx_uint_t                       line;
  106.     in_port_t                        port;
  107.     ngx_uint_t                       no_port;  /* unsigned no_port:1 */

  108. #if (NGX_HTTP_UPSTREAM_ZONE)
  109.     ngx_shm_zone_t                  *shm_zone;
  110.     ngx_resolver_t                  *resolver;
  111.     ngx_msec_t                       resolver_timeout;
  112. #endif
  113. };


  114. typedef struct {
  115.     ngx_addr_t                      *addr;
  116.     ngx_http_complex_value_t        *value;
  117. #if (NGX_HAVE_TRANSPARENT_PROXY)
  118.     ngx_uint_t                       transparent; /* unsigned  transparent:1; */
  119. #endif
  120. } ngx_http_upstream_local_t;


  121. typedef struct {
  122.     ngx_http_upstream_srv_conf_t    *upstream;

  123.     ngx_msec_t                       connect_timeout;
  124.     ngx_msec_t                       send_timeout;
  125.     ngx_msec_t                       read_timeout;
  126.     ngx_msec_t                       next_upstream_timeout;

  127.     size_t                           send_lowat;
  128.     size_t                           buffer_size;
  129.     ngx_http_complex_value_t        *limit_rate;

  130.     size_t                           busy_buffers_size;
  131.     size_t                           max_temp_file_size;
  132.     size_t                           temp_file_write_size;

  133.     size_t                           busy_buffers_size_conf;
  134.     size_t                           max_temp_file_size_conf;
  135.     size_t                           temp_file_write_size_conf;

  136.     ngx_bufs_t                       bufs;

  137.     ngx_uint_t                       ignore_headers;
  138.     ngx_uint_t                       next_upstream;
  139.     ngx_uint_t                       store_access;
  140.     ngx_uint_t                       next_upstream_tries;
  141.     ngx_flag_t                       buffering;
  142.     ngx_flag_t                       request_buffering;
  143.     ngx_flag_t                       pass_request_headers;
  144.     ngx_flag_t                       pass_request_body;
  145.     ngx_flag_t                       pass_trailers;

  146.     ngx_flag_t                       ignore_client_abort;
  147.     ngx_flag_t                       intercept_errors;
  148.     ngx_flag_t                       cyclic_temp_file;
  149.     ngx_flag_t                       force_ranges;

  150.     ngx_path_t                      *temp_path;

  151.     ngx_hash_t                       hide_headers_hash;
  152.     ngx_array_t                     *hide_headers;
  153.     ngx_array_t                     *pass_headers;

  154.     ngx_http_upstream_local_t       *local;
  155.     ngx_flag_t                       socket_keepalive;

  156. #if (NGX_HTTP_CACHE)
  157.     ngx_shm_zone_t                  *cache_zone;
  158.     ngx_http_complex_value_t        *cache_value;

  159.     ngx_uint_t                       cache_min_uses;
  160.     ngx_uint_t                       cache_use_stale;
  161.     ngx_uint_t                       cache_methods;

  162.     off_t                            cache_max_range_offset;

  163.     ngx_flag_t                       cache_lock;
  164.     ngx_msec_t                       cache_lock_timeout;
  165.     ngx_msec_t                       cache_lock_age;

  166.     ngx_flag_t                       cache_revalidate;
  167.     ngx_flag_t                       cache_convert_head;
  168.     ngx_flag_t                       cache_background_update;

  169.     ngx_array_t                     *cache_valid;
  170.     ngx_array_t                     *cache_bypass;
  171.     ngx_array_t                     *cache_purge;
  172.     ngx_array_t                     *no_cache;
  173. #endif

  174.     ngx_array_t                     *store_lengths;
  175.     ngx_array_t                     *store_values;

  176. #if (NGX_HTTP_CACHE)
  177.     signed                           cache:2;
  178. #endif
  179.     signed                           store:2;
  180.     unsigned                         intercept_404:1;
  181.     unsigned                         change_buffering:1;
  182.     unsigned                         preserve_output:1;

  183. #if (NGX_HTTP_SSL || NGX_COMPAT)
  184.     ngx_ssl_t                       *ssl;
  185.     ngx_flag_t                       ssl_session_reuse;

  186.     ngx_http_complex_value_t        *ssl_name;
  187.     ngx_flag_t                       ssl_server_name;
  188.     ngx_flag_t                       ssl_verify;

  189.     ngx_http_complex_value_t        *ssl_certificate;
  190.     ngx_http_complex_value_t        *ssl_certificate_key;
  191.     ngx_array_t                     *ssl_passwords;
  192. #endif

  193.     ngx_str_t                        module;

  194.     NGX_COMPAT_BEGIN(2)
  195.     NGX_COMPAT_END
  196. } ngx_http_upstream_conf_t;


  197. typedef struct {
  198.     ngx_str_t                        name;
  199.     ngx_http_header_handler_pt       handler;
  200.     ngx_uint_t                       offset;
  201.     ngx_http_header_handler_pt       copy_handler;
  202.     ngx_uint_t                       conf;
  203.     ngx_uint_t                       redirect;  /* unsigned   redirect:1; */
  204. } ngx_http_upstream_header_t;


  205. typedef struct {
  206.     ngx_list_t                       headers;
  207.     ngx_list_t                       trailers;

  208.     ngx_uint_t                       status_n;
  209.     ngx_str_t                        status_line;

  210.     ngx_table_elt_t                 *status;
  211.     ngx_table_elt_t                 *date;
  212.     ngx_table_elt_t                 *server;
  213.     ngx_table_elt_t                 *connection;

  214.     ngx_table_elt_t                 *expires;
  215.     ngx_table_elt_t                 *etag;
  216.     ngx_table_elt_t                 *x_accel_expires;
  217.     ngx_table_elt_t                 *x_accel_redirect;
  218.     ngx_table_elt_t                 *x_accel_limit_rate;

  219.     ngx_table_elt_t                 *content_type;
  220.     ngx_table_elt_t                 *content_length;

  221.     ngx_table_elt_t                 *last_modified;
  222.     ngx_table_elt_t                 *location;
  223.     ngx_table_elt_t                 *refresh;
  224.     ngx_table_elt_t                 *www_authenticate;
  225.     ngx_table_elt_t                 *transfer_encoding;
  226.     ngx_table_elt_t                 *vary;

  227.     ngx_table_elt_t                 *cache_control;
  228.     ngx_table_elt_t                 *set_cookie;

  229.     off_t                            content_length_n;
  230.     time_t                           last_modified_time;

  231.     unsigned                         connection_close:1;
  232.     unsigned                         chunked:1;
  233.     unsigned                         no_cache:1;
  234.     unsigned                         expired:1;
  235. } ngx_http_upstream_headers_in_t;


  236. typedef struct {
  237.     ngx_str_t                        host;
  238.     in_port_t                        port;
  239.     ngx_uint_t                       no_port; /* unsigned no_port:1 */

  240.     ngx_uint_t                       naddrs;
  241.     ngx_resolver_addr_t             *addrs;

  242.     struct sockaddr                 *sockaddr;
  243.     socklen_t                        socklen;
  244.     ngx_str_t                        name;

  245.     ngx_resolver_ctx_t              *ctx;
  246. } ngx_http_upstream_resolved_t;


  247. typedef void (*ngx_http_upstream_handler_pt)(ngx_http_request_t *r,
  248.     ngx_http_upstream_t *u);


  249. struct ngx_http_upstream_s {
  250.     ngx_http_upstream_handler_pt     read_event_handler;
  251.     ngx_http_upstream_handler_pt     write_event_handler;

  252.     ngx_peer_connection_t            peer;

  253.     ngx_event_pipe_t                *pipe;

  254.     ngx_chain_t                     *request_bufs;

  255.     ngx_output_chain_ctx_t           output;
  256.     ngx_chain_writer_ctx_t           writer;

  257.     ngx_http_upstream_conf_t        *conf;
  258.     ngx_http_upstream_srv_conf_t    *upstream;
  259. #if (NGX_HTTP_CACHE)
  260.     ngx_array_t                     *caches;
  261. #endif

  262.     ngx_http_upstream_headers_in_t   headers_in;

  263.     ngx_http_upstream_resolved_t    *resolved;

  264.     ngx_buf_t                        from_client;

  265.     ngx_buf_t                        buffer;
  266.     off_t                            length;

  267.     ngx_chain_t                     *out_bufs;
  268.     ngx_chain_t                     *busy_bufs;
  269.     ngx_chain_t                     *free_bufs;

  270.     ngx_int_t                      (*input_filter_init)(void *data);
  271.     ngx_int_t                      (*input_filter)(void *data, ssize_t bytes);
  272.     void                            *input_filter_ctx;

  273. #if (NGX_HTTP_CACHE)
  274.     ngx_int_t                      (*create_key)(ngx_http_request_t *r);
  275. #endif
  276.     ngx_int_t                      (*create_request)(ngx_http_request_t *r);
  277.     ngx_int_t                      (*reinit_request)(ngx_http_request_t *r);
  278.     ngx_int_t                      (*process_header)(ngx_http_request_t *r);
  279.     void                           (*abort_request)(ngx_http_request_t *r);
  280.     void                           (*finalize_request)(ngx_http_request_t *r,
  281.                                          ngx_int_t rc);
  282.     ngx_int_t                      (*rewrite_redirect)(ngx_http_request_t *r,
  283.                                          ngx_table_elt_t *h, size_t prefix);
  284.     ngx_int_t                      (*rewrite_cookie)(ngx_http_request_t *r,
  285.                                          ngx_table_elt_t *h);

  286.     ngx_msec_t                       start_time;

  287.     ngx_http_upstream_state_t       *state;

  288.     ngx_str_t                        method;
  289.     ngx_str_t                        schema;
  290.     ngx_str_t                        uri;

  291. #if (NGX_HTTP_SSL || NGX_COMPAT)
  292.     ngx_str_t                        ssl_name;
  293. #endif

  294.     ngx_http_cleanup_pt             *cleanup;

  295.     unsigned                         store:1;
  296.     unsigned                         cacheable:1;
  297.     unsigned                         accel:1;
  298.     unsigned                         ssl:1;
  299. #if (NGX_HTTP_CACHE)
  300.     unsigned                         cache_status:3;
  301. #endif

  302.     unsigned                         buffering:1;
  303.     unsigned                         keepalive:1;
  304.     unsigned                         upgrade:1;
  305.     unsigned                         error:1;

  306.     unsigned                         request_sent:1;
  307.     unsigned                         request_body_sent:1;
  308.     unsigned                         request_body_blocked:1;
  309.     unsigned                         header_sent:1;
  310. };


  311. typedef struct {
  312.     ngx_uint_t                      status;
  313.     ngx_uint_t                      mask;
  314. } ngx_http_upstream_next_t;


  315. typedef struct {
  316.     ngx_str_t   key;
  317.     ngx_str_t   value;
  318.     ngx_uint_t  skip_empty;
  319. } ngx_http_upstream_param_t;


  320. ngx_int_t ngx_http_upstream_create(ngx_http_request_t *r);
  321. void ngx_http_upstream_init(ngx_http_request_t *r);
  322. ngx_int_t ngx_http_upstream_non_buffered_filter_init(void *data);
  323. ngx_int_t ngx_http_upstream_non_buffered_filter(void *data, ssize_t bytes);
  324. ngx_http_upstream_srv_conf_t *ngx_http_upstream_add(ngx_conf_t *cf,
  325.     ngx_url_t *u, ngx_uint_t flags);
  326. char *ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,
  327.     void *conf);
  328. char *ngx_http_upstream_param_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,
  329.     void *conf);
  330. ngx_int_t ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf,
  331.     ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev,
  332.     ngx_str_t *default_hide_headers, ngx_hash_init_t *hash);


  333. #define ngx_http_conf_upstream_srv_conf(uscf, module)                         \
  334.     uscf->srv_conf[module.ctx_index]


  335. extern ngx_module_t        ngx_http_upstream_module;
  336. extern ngx_conf_bitmask_t  ngx_http_upstream_cache_method_mask[];
  337. extern ngx_conf_bitmask_t  ngx_http_upstream_ignore_headers_masks[];


  338. #endif /* _NGX_HTTP_UPSTREAM_H_INCLUDED_ */