Return to ngx_http_upstream.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / nginx / src / http |
1.1 ! misho 1: ! 2: /* ! 3: * Copyright (C) Igor Sysoev ! 4: * Copyright (C) Nginx, Inc. ! 5: */ ! 6: ! 7: ! 8: #ifndef _NGX_HTTP_UPSTREAM_H_INCLUDED_ ! 9: #define _NGX_HTTP_UPSTREAM_H_INCLUDED_ ! 10: ! 11: ! 12: #include <ngx_config.h> ! 13: #include <ngx_core.h> ! 14: #include <ngx_event.h> ! 15: #include <ngx_event_connect.h> ! 16: #include <ngx_event_pipe.h> ! 17: #include <ngx_http.h> ! 18: ! 19: ! 20: #define NGX_HTTP_UPSTREAM_FT_ERROR 0x00000002 ! 21: #define NGX_HTTP_UPSTREAM_FT_TIMEOUT 0x00000004 ! 22: #define NGX_HTTP_UPSTREAM_FT_INVALID_HEADER 0x00000008 ! 23: #define NGX_HTTP_UPSTREAM_FT_HTTP_500 0x00000010 ! 24: #define NGX_HTTP_UPSTREAM_FT_HTTP_502 0x00000020 ! 25: #define NGX_HTTP_UPSTREAM_FT_HTTP_503 0x00000040 ! 26: #define NGX_HTTP_UPSTREAM_FT_HTTP_504 0x00000080 ! 27: #define NGX_HTTP_UPSTREAM_FT_HTTP_404 0x00000100 ! 28: #define NGX_HTTP_UPSTREAM_FT_UPDATING 0x00000200 ! 29: #define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK 0x00000400 ! 30: #define NGX_HTTP_UPSTREAM_FT_MAX_WAITING 0x00000800 ! 31: #define NGX_HTTP_UPSTREAM_FT_NOLIVE 0x40000000 ! 32: #define NGX_HTTP_UPSTREAM_FT_OFF 0x80000000 ! 33: ! 34: #define NGX_HTTP_UPSTREAM_FT_STATUS (NGX_HTTP_UPSTREAM_FT_HTTP_500 \ ! 35: |NGX_HTTP_UPSTREAM_FT_HTTP_502 \ ! 36: |NGX_HTTP_UPSTREAM_FT_HTTP_503 \ ! 37: |NGX_HTTP_UPSTREAM_FT_HTTP_504 \ ! 38: |NGX_HTTP_UPSTREAM_FT_HTTP_404) ! 39: ! 40: #define NGX_HTTP_UPSTREAM_INVALID_HEADER 40 ! 41: ! 42: ! 43: #define NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT 0x00000002 ! 44: #define NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES 0x00000004 ! 45: #define NGX_HTTP_UPSTREAM_IGN_EXPIRES 0x00000008 ! 46: #define NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL 0x00000010 ! 47: #define NGX_HTTP_UPSTREAM_IGN_SET_COOKIE 0x00000020 ! 48: #define NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE 0x00000040 ! 49: #define NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING 0x00000080 ! 50: #define NGX_HTTP_UPSTREAM_IGN_XA_CHARSET 0x00000100 ! 51: ! 52: ! 53: typedef struct { ! 54: ngx_msec_t bl_time; ! 55: ngx_uint_t bl_state; ! 56: ! 57: ngx_uint_t status; ! 58: time_t response_sec; ! 59: ngx_uint_t response_msec; ! 60: off_t response_length; ! 61: ! 62: ngx_str_t *peer; ! 63: } ngx_http_upstream_state_t; ! 64: ! 65: ! 66: typedef struct { ! 67: ngx_hash_t headers_in_hash; ! 68: ngx_array_t upstreams; ! 69: /* ngx_http_upstream_srv_conf_t */ ! 70: } ngx_http_upstream_main_conf_t; ! 71: ! 72: typedef struct ngx_http_upstream_srv_conf_s ngx_http_upstream_srv_conf_t; ! 73: ! 74: typedef ngx_int_t (*ngx_http_upstream_init_pt)(ngx_conf_t *cf, ! 75: ngx_http_upstream_srv_conf_t *us); ! 76: typedef ngx_int_t (*ngx_http_upstream_init_peer_pt)(ngx_http_request_t *r, ! 77: ngx_http_upstream_srv_conf_t *us); ! 78: ! 79: ! 80: typedef struct { ! 81: ngx_http_upstream_init_pt init_upstream; ! 82: ngx_http_upstream_init_peer_pt init; ! 83: void *data; ! 84: } ngx_http_upstream_peer_t; ! 85: ! 86: ! 87: typedef struct { ! 88: ngx_addr_t *addrs; ! 89: ngx_uint_t naddrs; ! 90: ngx_uint_t weight; ! 91: ngx_uint_t max_fails; ! 92: time_t fail_timeout; ! 93: ! 94: unsigned down:1; ! 95: unsigned backup:1; ! 96: } ngx_http_upstream_server_t; ! 97: ! 98: ! 99: #define NGX_HTTP_UPSTREAM_CREATE 0x0001 ! 100: #define NGX_HTTP_UPSTREAM_WEIGHT 0x0002 ! 101: #define NGX_HTTP_UPSTREAM_MAX_FAILS 0x0004 ! 102: #define NGX_HTTP_UPSTREAM_FAIL_TIMEOUT 0x0008 ! 103: #define NGX_HTTP_UPSTREAM_DOWN 0x0010 ! 104: #define NGX_HTTP_UPSTREAM_BACKUP 0x0020 ! 105: ! 106: ! 107: struct ngx_http_upstream_srv_conf_s { ! 108: ngx_http_upstream_peer_t peer; ! 109: void **srv_conf; ! 110: ! 111: ngx_array_t *servers; /* ngx_http_upstream_server_t */ ! 112: ! 113: ngx_uint_t flags; ! 114: ngx_str_t host; ! 115: u_char *file_name; ! 116: ngx_uint_t line; ! 117: in_port_t port; ! 118: in_port_t default_port; ! 119: ngx_uint_t no_port; /* unsigned no_port:1 */ ! 120: }; ! 121: ! 122: ! 123: typedef struct { ! 124: ngx_addr_t *addr; ! 125: ngx_http_complex_value_t *value; ! 126: } ngx_http_upstream_local_t; ! 127: ! 128: ! 129: typedef struct { ! 130: ngx_http_upstream_srv_conf_t *upstream; ! 131: ! 132: ngx_msec_t connect_timeout; ! 133: ngx_msec_t send_timeout; ! 134: ngx_msec_t read_timeout; ! 135: ngx_msec_t timeout; ! 136: ! 137: size_t send_lowat; ! 138: size_t buffer_size; ! 139: ! 140: size_t busy_buffers_size; ! 141: size_t max_temp_file_size; ! 142: size_t temp_file_write_size; ! 143: ! 144: size_t busy_buffers_size_conf; ! 145: size_t max_temp_file_size_conf; ! 146: size_t temp_file_write_size_conf; ! 147: ! 148: ngx_bufs_t bufs; ! 149: ! 150: ngx_uint_t ignore_headers; ! 151: ngx_uint_t next_upstream; ! 152: ngx_uint_t store_access; ! 153: ngx_flag_t buffering; ! 154: ngx_flag_t pass_request_headers; ! 155: ngx_flag_t pass_request_body; ! 156: ! 157: ngx_flag_t ignore_client_abort; ! 158: ngx_flag_t intercept_errors; ! 159: ngx_flag_t cyclic_temp_file; ! 160: ! 161: ngx_path_t *temp_path; ! 162: ! 163: ngx_hash_t hide_headers_hash; ! 164: ngx_array_t *hide_headers; ! 165: ngx_array_t *pass_headers; ! 166: ! 167: ngx_http_upstream_local_t *local; ! 168: ! 169: #if (NGX_HTTP_CACHE) ! 170: ngx_shm_zone_t *cache; ! 171: ! 172: ngx_uint_t cache_min_uses; ! 173: ngx_uint_t cache_use_stale; ! 174: ngx_uint_t cache_methods; ! 175: ! 176: ngx_flag_t cache_lock; ! 177: ngx_msec_t cache_lock_timeout; ! 178: ! 179: ngx_array_t *cache_valid; ! 180: ngx_array_t *cache_bypass; ! 181: ngx_array_t *no_cache; ! 182: #endif ! 183: ! 184: ngx_array_t *store_lengths; ! 185: ngx_array_t *store_values; ! 186: ! 187: signed store:2; ! 188: unsigned intercept_404:1; ! 189: unsigned change_buffering:1; ! 190: ! 191: #if (NGX_HTTP_SSL) ! 192: ngx_ssl_t *ssl; ! 193: ngx_flag_t ssl_session_reuse; ! 194: #endif ! 195: ! 196: ngx_str_t module; ! 197: } ngx_http_upstream_conf_t; ! 198: ! 199: ! 200: typedef struct { ! 201: ngx_str_t name; ! 202: ngx_http_header_handler_pt handler; ! 203: ngx_uint_t offset; ! 204: ngx_http_header_handler_pt copy_handler; ! 205: ngx_uint_t conf; ! 206: ngx_uint_t redirect; /* unsigned redirect:1; */ ! 207: } ngx_http_upstream_header_t; ! 208: ! 209: ! 210: typedef struct { ! 211: ngx_list_t headers; ! 212: ! 213: ngx_uint_t status_n; ! 214: ngx_str_t status_line; ! 215: ! 216: ngx_table_elt_t *status; ! 217: ngx_table_elt_t *date; ! 218: ngx_table_elt_t *server; ! 219: ngx_table_elt_t *connection; ! 220: ! 221: ngx_table_elt_t *expires; ! 222: ngx_table_elt_t *etag; ! 223: ngx_table_elt_t *x_accel_expires; ! 224: ngx_table_elt_t *x_accel_redirect; ! 225: ngx_table_elt_t *x_accel_limit_rate; ! 226: ! 227: ngx_table_elt_t *content_type; ! 228: ngx_table_elt_t *content_length; ! 229: ! 230: ngx_table_elt_t *last_modified; ! 231: ngx_table_elt_t *location; ! 232: ngx_table_elt_t *accept_ranges; ! 233: ngx_table_elt_t *www_authenticate; ! 234: ngx_table_elt_t *transfer_encoding; ! 235: ! 236: #if (NGX_HTTP_GZIP) ! 237: ngx_table_elt_t *content_encoding; ! 238: #endif ! 239: ! 240: off_t content_length_n; ! 241: ! 242: ngx_array_t cache_control; ! 243: ! 244: unsigned connection_close:1; ! 245: unsigned chunked:1; ! 246: } ngx_http_upstream_headers_in_t; ! 247: ! 248: ! 249: typedef struct { ! 250: ngx_str_t host; ! 251: in_port_t port; ! 252: ngx_uint_t no_port; /* unsigned no_port:1 */ ! 253: ! 254: ngx_uint_t naddrs; ! 255: in_addr_t *addrs; ! 256: ! 257: struct sockaddr *sockaddr; ! 258: socklen_t socklen; ! 259: ! 260: ngx_resolver_ctx_t *ctx; ! 261: } ngx_http_upstream_resolved_t; ! 262: ! 263: ! 264: typedef void (*ngx_http_upstream_handler_pt)(ngx_http_request_t *r, ! 265: ngx_http_upstream_t *u); ! 266: ! 267: ! 268: struct ngx_http_upstream_s { ! 269: ngx_http_upstream_handler_pt read_event_handler; ! 270: ngx_http_upstream_handler_pt write_event_handler; ! 271: ! 272: ngx_peer_connection_t peer; ! 273: ! 274: ngx_event_pipe_t *pipe; ! 275: ! 276: ngx_chain_t *request_bufs; ! 277: ! 278: ngx_output_chain_ctx_t output; ! 279: ngx_chain_writer_ctx_t writer; ! 280: ! 281: ngx_http_upstream_conf_t *conf; ! 282: ! 283: ngx_http_upstream_headers_in_t headers_in; ! 284: ! 285: ngx_http_upstream_resolved_t *resolved; ! 286: ! 287: ngx_buf_t from_client; ! 288: ! 289: ngx_buf_t buffer; ! 290: off_t length; ! 291: ! 292: ngx_chain_t *out_bufs; ! 293: ngx_chain_t *busy_bufs; ! 294: ngx_chain_t *free_bufs; ! 295: ! 296: ngx_int_t (*input_filter_init)(void *data); ! 297: ngx_int_t (*input_filter)(void *data, ssize_t bytes); ! 298: void *input_filter_ctx; ! 299: ! 300: #if (NGX_HTTP_CACHE) ! 301: ngx_int_t (*create_key)(ngx_http_request_t *r); ! 302: #endif ! 303: ngx_int_t (*create_request)(ngx_http_request_t *r); ! 304: ngx_int_t (*reinit_request)(ngx_http_request_t *r); ! 305: ngx_int_t (*process_header)(ngx_http_request_t *r); ! 306: void (*abort_request)(ngx_http_request_t *r); ! 307: void (*finalize_request)(ngx_http_request_t *r, ! 308: ngx_int_t rc); ! 309: ngx_int_t (*rewrite_redirect)(ngx_http_request_t *r, ! 310: ngx_table_elt_t *h, size_t prefix); ! 311: ngx_int_t (*rewrite_cookie)(ngx_http_request_t *r, ! 312: ngx_table_elt_t *h); ! 313: ! 314: ngx_msec_t timeout; ! 315: ! 316: ngx_http_upstream_state_t *state; ! 317: ! 318: ngx_str_t method; ! 319: ngx_str_t schema; ! 320: ngx_str_t uri; ! 321: ! 322: ngx_http_cleanup_pt *cleanup; ! 323: ! 324: unsigned store:1; ! 325: unsigned cacheable:1; ! 326: unsigned accel:1; ! 327: unsigned ssl:1; ! 328: #if (NGX_HTTP_CACHE) ! 329: unsigned cache_status:3; ! 330: #endif ! 331: ! 332: unsigned buffering:1; ! 333: unsigned keepalive:1; ! 334: unsigned upgrade:1; ! 335: ! 336: unsigned request_sent:1; ! 337: unsigned header_sent:1; ! 338: }; ! 339: ! 340: ! 341: typedef struct { ! 342: ngx_uint_t status; ! 343: ngx_uint_t mask; ! 344: } ngx_http_upstream_next_t; ! 345: ! 346: ! 347: typedef struct { ! 348: ngx_str_t key; ! 349: ngx_str_t value; ! 350: ngx_uint_t skip_empty; ! 351: } ngx_http_upstream_param_t; ! 352: ! 353: ! 354: ngx_int_t ngx_http_upstream_header_variable(ngx_http_request_t *r, ! 355: ngx_http_variable_value_t *v, uintptr_t data); ! 356: ! 357: ngx_int_t ngx_http_upstream_create(ngx_http_request_t *r); ! 358: void ngx_http_upstream_init(ngx_http_request_t *r); ! 359: ngx_http_upstream_srv_conf_t *ngx_http_upstream_add(ngx_conf_t *cf, ! 360: ngx_url_t *u, ngx_uint_t flags); ! 361: char *ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, ! 362: void *conf); ! 363: char *ngx_http_upstream_param_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, ! 364: void *conf); ! 365: ngx_int_t ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf, ! 366: ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev, ! 367: ngx_str_t *default_hide_headers, ngx_hash_init_t *hash); ! 368: ! 369: ! 370: #define ngx_http_conf_upstream_srv_conf(uscf, module) \ ! 371: uscf->srv_conf[module.ctx_index] ! 372: ! 373: ! 374: extern ngx_module_t ngx_http_upstream_module; ! 375: extern ngx_conf_bitmask_t ngx_http_upstream_cache_method_mask[]; ! 376: extern ngx_conf_bitmask_t ngx_http_upstream_ignore_headers_masks[]; ! 377: ! 378: ! 379: #endif /* _NGX_HTTP_UPSTREAM_H_INCLUDED_ */