| /* | |
| * Copyright (C) Roman Arutyunyan | |
| * Copyright (C) Nginx, Inc. | |
| */ | |
| #ifndef _NGX_STREAM_H_INCLUDED_ | |
| #define _NGX_STREAM_H_INCLUDED_ | |
| #include <ngx_config.h> | |
| #include <ngx_core.h> | |
| #if (NGX_STREAM_SSL) | |
| #include <ngx_stream_ssl_module.h> | |
| #endif | |
| typedef struct ngx_stream_session_s ngx_stream_session_t; | |
| #include <ngx_stream_variables.h> | |
| #include <ngx_stream_script.h> | |
| #include <ngx_stream_upstream.h> | |
| #include <ngx_stream_upstream_round_robin.h> | |
| #define NGX_STREAM_OK 200 | |
| #define NGX_STREAM_BAD_REQUEST 400 | |
| #define NGX_STREAM_FORBIDDEN 403 | |
| #define NGX_STREAM_INTERNAL_SERVER_ERROR 500 | |
| #define NGX_STREAM_BAD_GATEWAY 502 | |
| #define NGX_STREAM_SERVICE_UNAVAILABLE 503 | |
| typedef struct { | |
| void **main_conf; | |
| void **srv_conf; | |
| } ngx_stream_conf_ctx_t; | |
| typedef struct { | |
| ngx_sockaddr_t sockaddr; | |
| socklen_t socklen; | |
| /* server ctx */ | |
| ngx_stream_conf_ctx_t *ctx; | |
| unsigned bind:1; | |
| unsigned wildcard:1; | |
| unsigned ssl:1; | |
| #if (NGX_HAVE_INET6) | |
| unsigned ipv6only:1; | |
| #endif | |
| unsigned reuseport:1; | |
| unsigned so_keepalive:2; | |
| unsigned proxy_protocol:1; | |
| #if (NGX_HAVE_KEEPALIVE_TUNABLE) | |
| int tcp_keepidle; | |
| int tcp_keepintvl; | |
| int tcp_keepcnt; | |
| #endif | |
| int backlog; | |
| int rcvbuf; | |
| int sndbuf; | |
| int type; | |
| } ngx_stream_listen_t; | |
| typedef struct { | |
| ngx_stream_conf_ctx_t *ctx; | |
| ngx_str_t addr_text; | |
| unsigned ssl:1; | |
| unsigned proxy_protocol:1; | |
| } ngx_stream_addr_conf_t; | |
| typedef struct { | |
| in_addr_t addr; | |
| ngx_stream_addr_conf_t conf; | |
| } ngx_stream_in_addr_t; | |
| #if (NGX_HAVE_INET6) | |
| typedef struct { | |
| struct in6_addr addr6; | |
| ngx_stream_addr_conf_t conf; | |
| } ngx_stream_in6_addr_t; | |
| #endif | |
| typedef struct { | |
| /* ngx_stream_in_addr_t or ngx_stream_in6_addr_t */ | |
| void *addrs; | |
| ngx_uint_t naddrs; | |
| } ngx_stream_port_t; | |
| typedef struct { | |
| int family; | |
| int type; | |
| in_port_t port; | |
| ngx_array_t addrs; /* array of ngx_stream_conf_addr_t */ | |
| } ngx_stream_conf_port_t; | |
| typedef struct { | |
| ngx_stream_listen_t opt; | |
| } ngx_stream_conf_addr_t; | |
| typedef enum { | |
| NGX_STREAM_POST_ACCEPT_PHASE = 0, | |
| NGX_STREAM_PREACCESS_PHASE, | |
| NGX_STREAM_ACCESS_PHASE, | |
| NGX_STREAM_SSL_PHASE, | |
| NGX_STREAM_PREREAD_PHASE, | |
| NGX_STREAM_CONTENT_PHASE, | |
| NGX_STREAM_LOG_PHASE | |
| } ngx_stream_phases; | |
| typedef struct ngx_stream_phase_handler_s ngx_stream_phase_handler_t; | |
| typedef ngx_int_t (*ngx_stream_phase_handler_pt)(ngx_stream_session_t *s, | |
| ngx_stream_phase_handler_t *ph); | |
| typedef ngx_int_t (*ngx_stream_handler_pt)(ngx_stream_session_t *s); | |
| typedef void (*ngx_stream_content_handler_pt)(ngx_stream_session_t *s); | |
| struct ngx_stream_phase_handler_s { | |
| ngx_stream_phase_handler_pt checker; | |
| ngx_stream_handler_pt handler; | |
| ngx_uint_t next; | |
| }; | |
| typedef struct { | |
| ngx_stream_phase_handler_t *handlers; | |
| } ngx_stream_phase_engine_t; | |
| typedef struct { | |
| ngx_array_t handlers; | |
| } ngx_stream_phase_t; | |
| typedef struct { | |
| ngx_array_t servers; /* ngx_stream_core_srv_conf_t */ | |
| ngx_array_t listen; /* ngx_stream_listen_t */ | |
| ngx_stream_phase_engine_t phase_engine; | |
| ngx_hash_t variables_hash; | |
| ngx_array_t variables; /* ngx_stream_variable_t */ | |
| ngx_array_t prefix_variables; /* ngx_stream_variable_t */ | |
| ngx_uint_t ncaptures; | |
| ngx_uint_t variables_hash_max_size; | |
| ngx_uint_t variables_hash_bucket_size; | |
| ngx_hash_keys_arrays_t *variables_keys; | |
| ngx_stream_phase_t phases[NGX_STREAM_LOG_PHASE + 1]; | |
| } ngx_stream_core_main_conf_t; | |
| typedef struct { | |
| ngx_stream_content_handler_pt handler; | |
| ngx_stream_conf_ctx_t *ctx; | |
| u_char *file_name; | |
| ngx_uint_t line; | |
| ngx_flag_t tcp_nodelay; | |
| size_t preread_buffer_size; | |
| ngx_msec_t preread_timeout; | |
| ngx_log_t *error_log; | |
| ngx_msec_t resolver_timeout; | |
| ngx_resolver_t *resolver; | |
| ngx_msec_t proxy_protocol_timeout; | |
| ngx_uint_t listen; /* unsigned listen:1; */ | |
| } ngx_stream_core_srv_conf_t; | |
| struct ngx_stream_session_s { | |
| uint32_t signature; /* "STRM" */ | |
| ngx_connection_t *connection; | |
| off_t received; | |
| time_t start_sec; | |
| ngx_msec_t start_msec; | |
| ngx_log_handler_pt log_handler; | |
| void **ctx; | |
| void **main_conf; | |
| void **srv_conf; | |
| ngx_stream_upstream_t *upstream; | |
| ngx_array_t *upstream_states; | |
| /* of ngx_stream_upstream_state_t */ | |
| ngx_stream_variable_value_t *variables; | |
| #if (NGX_PCRE) | |
| ngx_uint_t ncaptures; | |
| int *captures; | |
| u_char *captures_data; | |
| #endif | |
| ngx_int_t phase_handler; | |
| ngx_uint_t status; | |
| unsigned ssl:1; | |
| unsigned stat_processing:1; | |
| unsigned health_check:1; | |
| }; | |
| typedef struct { | |
| ngx_int_t (*preconfiguration)(ngx_conf_t *cf); | |
| ngx_int_t (*postconfiguration)(ngx_conf_t *cf); | |
| void *(*create_main_conf)(ngx_conf_t *cf); | |
| char *(*init_main_conf)(ngx_conf_t *cf, void *conf); | |
| void *(*create_srv_conf)(ngx_conf_t *cf); | |
| char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, | |
| void *conf); | |
| } ngx_stream_module_t; | |
| #define NGX_STREAM_MODULE 0x4d525453 /* "STRM" */ | |
| #define NGX_STREAM_MAIN_CONF 0x02000000 | |
| #define NGX_STREAM_SRV_CONF 0x04000000 | |
| #define NGX_STREAM_UPS_CONF 0x08000000 | |
| #define NGX_STREAM_MAIN_CONF_OFFSET offsetof(ngx_stream_conf_ctx_t, main_conf) | |
| #define NGX_STREAM_SRV_CONF_OFFSET offsetof(ngx_stream_conf_ctx_t, srv_conf) | |
| #define ngx_stream_get_module_ctx(s, module) (s)->ctx[module.ctx_index] | |
| #define ngx_stream_set_ctx(s, c, module) s->ctx[module.ctx_index] = c; | |
| #define ngx_stream_delete_ctx(s, module) s->ctx[module.ctx_index] = NULL; | |
| #define ngx_stream_get_module_main_conf(s, module) \ | |
| (s)->main_conf[module.ctx_index] | |
| #define ngx_stream_get_module_srv_conf(s, module) \ | |
| (s)->srv_conf[module.ctx_index] | |
| #define ngx_stream_conf_get_module_main_conf(cf, module) \ | |
| ((ngx_stream_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index] | |
| #define ngx_stream_conf_get_module_srv_conf(cf, module) \ | |
| ((ngx_stream_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index] | |
| #define ngx_stream_cycle_get_module_main_conf(cycle, module) \ | |
| (cycle->conf_ctx[ngx_stream_module.index] ? \ | |
| ((ngx_stream_conf_ctx_t *) cycle->conf_ctx[ngx_stream_module.index]) \ | |
| ->main_conf[module.ctx_index]: \ | |
| NULL) | |
| #define NGX_STREAM_WRITE_BUFFERED 0x10 | |
| void ngx_stream_core_run_phases(ngx_stream_session_t *s); | |
| ngx_int_t ngx_stream_core_generic_phase(ngx_stream_session_t *s, | |
| ngx_stream_phase_handler_t *ph); | |
| ngx_int_t ngx_stream_core_preread_phase(ngx_stream_session_t *s, | |
| ngx_stream_phase_handler_t *ph); | |
| ngx_int_t ngx_stream_core_content_phase(ngx_stream_session_t *s, | |
| ngx_stream_phase_handler_t *ph); | |
| void ngx_stream_init_connection(ngx_connection_t *c); | |
| void ngx_stream_session_handler(ngx_event_t *rev); | |
| void ngx_stream_finalize_session(ngx_stream_session_t *s, ngx_uint_t rc); | |
| extern ngx_module_t ngx_stream_module; | |
| extern ngx_uint_t ngx_stream_max_module; | |
| extern ngx_module_t ngx_stream_core_module; | |
| typedef ngx_int_t (*ngx_stream_filter_pt)(ngx_stream_session_t *s, | |
| ngx_chain_t *chain, ngx_uint_t from_upstream); | |
| extern ngx_stream_filter_pt ngx_stream_top_filter; | |
| #endif /* _NGX_STREAM_H_INCLUDED_ */ |