1 2 /* 3 * Copyright (C) Igor Sysoev 4 * Copyright (C) NGINX, Inc. 5 */ 6 7 #ifndef _NXT_ROUTER_H_INCLUDED_ 8 #define _NXT_ROUTER_H_INCLUDED_ 9 10 11 #include <nxt_main.h> 12 #include <nxt_runtime.h> 13 #include <nxt_main_process.h> 14 15 typedef struct nxt_http_request_s nxt_http_request_t; 16 #include <nxt_application.h> 17 18 19 typedef struct nxt_http_action_s nxt_http_action_t; 20 typedef struct nxt_http_routes_s nxt_http_routes_t; 21 typedef struct nxt_http_forward_s nxt_http_forward_t; 22 typedef struct nxt_upstream_s nxt_upstream_t; 23 typedef struct nxt_upstreams_s nxt_upstreams_t; 24 typedef struct nxt_router_access_log_s nxt_router_access_log_t; 25 26 27 #define NXT_HTTP_ACTION_ERROR ((nxt_http_action_t *) -1) 28 29 30 typedef struct { 31 nxt_thread_spinlock_t lock; 32 nxt_queue_t engines; 33 34 nxt_queue_t sockets; /* of nxt_socket_conf_t */ 35 nxt_queue_t apps; /* of nxt_app_t */ 36 37 nxt_router_access_log_t *access_log; 38 } nxt_router_t; 39 40 41 typedef struct { 42 uint32_t count; 43 uint32_t threads; 44 45 nxt_mp_t *mem_pool; 46 47 nxt_router_t *router; 48 nxt_http_routes_t *routes; 49 nxt_upstreams_t *upstreams; 50 51 nxt_lvlhsh_t mtypes_hash; 52 nxt_lvlhsh_t apps_hash; 53 54 nxt_router_access_log_t *access_log; 55 } nxt_router_conf_t; 56 57 58 typedef struct { 59 nxt_event_engine_t *engine; 60 nxt_work_t *jobs; 61 62 enum { 63 NXT_ROUTER_ENGINE_KEEP = 0, 64 NXT_ROUTER_ENGINE_ADD, 65 NXT_ROUTER_ENGINE_DELETE, 66 } action; 67 } nxt_router_engine_conf_t; 68 69 70 typedef struct { 71 #if (NXT_TLS) 72 nxt_queue_t tls; /* of nxt_router_tlssock_t */ 73 #endif 74 75 nxt_queue_t apps; /* of nxt_app_t */ 76 nxt_queue_t previous; /* of nxt_app_t */ 77 78 uint32_t new_threads; 79 uint32_t stream; 80 uint32_t count; 81 82 nxt_event_engine_t *engine; 83 nxt_port_t *port; 84 nxt_array_t *engines; 85 nxt_router_conf_t *router_conf; 86 nxt_mp_t *mem_pool; 87 } nxt_router_temp_conf_t; 88 89 90 typedef struct { 91 nxt_task_t task; 92 nxt_work_t work; 93 nxt_router_temp_conf_t *tmcf; 94 } nxt_joint_job_t; 95 96 97 typedef struct { 98 uint32_t use_count; 99 nxt_app_t *app; 100 nxt_timer_t idle_timer; 101 nxt_work_t free_app_work; 102 } nxt_app_joint_t; 103 104 105 struct nxt_app_s { 106 nxt_thread_mutex_t mutex; /* Protects ports queue. */ 107 nxt_queue_t ports; /* of nxt_port_t.app_link */ 108 nxt_lvlhsh_t port_hash; /* of nxt_port_t */ 109 110 nxt_queue_t spare_ports; /* of nxt_port_t.idle_link */ 111 nxt_queue_t idle_ports; /* of nxt_port_t.idle_link */ 112 nxt_work_t adjust_idle_work; 113 nxt_event_engine_t *engine; 114 115 nxt_str_t name; 116 117 uint32_t port_hash_count; 118 119 uint32_t active_requests; 120 uint32_t pending_processes; 121 uint32_t processes; 122 uint32_t idle_processes; 123 124 uint32_t max_processes; 125 uint32_t spare_processes; 126 uint32_t max_pending_processes; 127 128 uint32_t generation; 129 uint32_t proto_port_requests; 130 131 nxt_msec_t timeout; 132 nxt_msec_t idle_timeout; 133 134 nxt_str_t *targets; 135 136 nxt_app_type_t type:8; 137 138 nxt_mp_t *mem_pool; 139 nxt_queue_link_t link; 140 141 nxt_str_t conf; 142 143 nxt_atomic_t use_count; 144 nxt_queue_t ack_waiting_req; /* of nxt_http_request_t.app_link */ 145 146 nxt_app_joint_t *joint; 147 nxt_port_t *shared_port; 148 nxt_port_t *proto_port; 149 150 nxt_port_mmaps_t outgoing; 151 }; 152 153 154 typedef struct { 155 size_t max_frame_size; 156 nxt_msec_t read_timeout; 157 nxt_msec_t keepalive_interval; 158 } nxt_websocket_conf_t; 159 160 161 typedef struct { 162 uint32_t count; 163 nxt_queue_link_t link; 164 nxt_router_conf_t *router_conf; 165 166 nxt_http_action_t *action; 167 168 /* 169 * A listen socket time can be shorter than socket configuration life 170 * time, so a copy of the non-wildcard socket sockaddr is stored here 171 * to be used as a local sockaddr in connections. 172 */ 173 nxt_sockaddr_t *sockaddr; 174 175 nxt_listen_socket_t *listen; 176 177 size_t header_buffer_size; 178 size_t large_header_buffer_size; 179 size_t large_header_buffers; 180 size_t body_buffer_size; 181 size_t max_body_size; 182 size_t proxy_header_buffer_size; 183 size_t proxy_buffer_size; 184 size_t proxy_buffers; 185 186 nxt_msec_t idle_timeout; 187 nxt_msec_t header_read_timeout; 188 nxt_msec_t body_read_timeout; 189 nxt_msec_t send_timeout; 190 nxt_msec_t proxy_timeout; 191 nxt_msec_t proxy_send_timeout; 192 nxt_msec_t proxy_read_timeout; 193 194 nxt_websocket_conf_t websocket_conf; 195 196 nxt_str_t body_temp_path; 197 198 uint8_t discard_unsafe_fields; /* 1 bit */ 199 200 nxt_http_forward_t *forwarded; 201 nxt_http_forward_t *client_ip; 202 203 #if (NXT_TLS) 204 nxt_tls_conf_t *tls; 205 #endif 206 } nxt_socket_conf_t; 207 208 209 typedef struct { 210 uint32_t count; 211 nxt_queue_link_t link; 212 nxt_event_engine_t *engine; 213 nxt_socket_conf_t *socket_conf; 214 215 nxt_joint_job_t *close_job; 216 217 nxt_upstream_t **upstreams; 218 219 /* Modules configuraitons. */ 220 } nxt_socket_conf_joint_t; 221 222 223 struct nxt_router_access_log_s { 224 void (*handler)(nxt_task_t *task, nxt_http_request_t *r, 225 nxt_router_access_log_t *access_log); 226 nxt_fd_t fd; 227 nxt_str_t path; 228 uint32_t count; 229 }; 230 231 232 void nxt_router_process_http_request(nxt_task_t *task, nxt_http_request_t *r, 233 nxt_http_action_t *action); 234 void nxt_router_app_port_close(nxt_task_t *task, nxt_port_t *port); 235 nxt_int_t nxt_router_application_init(nxt_router_conf_t *rtcf, nxt_str_t *name, 236 nxt_str_t *target, nxt_http_action_t *action); 237 void nxt_router_listen_event_release(nxt_task_t *task, nxt_listen_event_t *lev, 238 nxt_socket_conf_joint_t *joint); 239 void nxt_router_conf_release(nxt_task_t *task, nxt_socket_conf_joint_t *joint); 240 241 242 #endif /* _NXT_ROUTER_H_INCLUDED_ */ 243