1431Sigor@sysoev.ru 2431Sigor@sysoev.ru /* 3431Sigor@sysoev.ru * Copyright (C) Igor Sysoev 4431Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 5431Sigor@sysoev.ru */ 6431Sigor@sysoev.ru 7431Sigor@sysoev.ru #ifndef _NXT_HTTP_H_INCLUDED_ 8431Sigor@sysoev.ru #define _NXT_HTTP_H_INCLUDED_ 9431Sigor@sysoev.ru 10431Sigor@sysoev.ru 11431Sigor@sysoev.ru typedef enum { 121270Sigor@sysoev.ru NXT_HTTP_UNSET = -1, 13431Sigor@sysoev.ru NXT_HTTP_INVALID = 0, 14431Sigor@sysoev.ru 151131Smax.romanov@nginx.com NXT_HTTP_CONTINUE = 100, 161131Smax.romanov@nginx.com NXT_HTTP_SWITCHING_PROTOCOLS = 101, 171131Smax.romanov@nginx.com 18431Sigor@sysoev.ru NXT_HTTP_OK = 200, 19793Sigor@sysoev.ru NXT_HTTP_NO_CONTENT = 204, 20431Sigor@sysoev.ru 21431Sigor@sysoev.ru NXT_HTTP_MULTIPLE_CHOICES = 300, 22431Sigor@sysoev.ru NXT_HTTP_MOVED_PERMANENTLY = 301, 23431Sigor@sysoev.ru NXT_HTTP_FOUND = 302, 24431Sigor@sysoev.ru NXT_HTTP_SEE_OTHER = 303, 25431Sigor@sysoev.ru NXT_HTTP_NOT_MODIFIED = 304, 26431Sigor@sysoev.ru 27431Sigor@sysoev.ru NXT_HTTP_BAD_REQUEST = 400, 281183Svbart@nginx.com NXT_HTTP_FORBIDDEN = 403, 29964Sigor@sysoev.ru NXT_HTTP_NOT_FOUND = 404, 301183Svbart@nginx.com NXT_HTTP_METHOD_NOT_ALLOWED = 405, 31624Sigor@sysoev.ru NXT_HTTP_REQUEST_TIMEOUT = 408, 32431Sigor@sysoev.ru NXT_HTTP_LENGTH_REQUIRED = 411, 33431Sigor@sysoev.ru NXT_HTTP_PAYLOAD_TOO_LARGE = 413, 34431Sigor@sysoev.ru NXT_HTTP_URI_TOO_LONG = 414, 351131Smax.romanov@nginx.com NXT_HTTP_UPGRADE_REQUIRED = 426, 36431Sigor@sysoev.ru NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431, 37431Sigor@sysoev.ru 38772Sigor@sysoev.ru NXT_HTTP_TO_HTTPS = 497, 39772Sigor@sysoev.ru 40431Sigor@sysoev.ru NXT_HTTP_INTERNAL_SERVER_ERROR = 500, 41431Sigor@sysoev.ru NXT_HTTP_NOT_IMPLEMENTED = 501, 42431Sigor@sysoev.ru NXT_HTTP_BAD_GATEWAY = 502, 43431Sigor@sysoev.ru NXT_HTTP_SERVICE_UNAVAILABLE = 503, 44431Sigor@sysoev.ru NXT_HTTP_GATEWAY_TIMEOUT = 504, 45482Svbart@nginx.com NXT_HTTP_VERSION_NOT_SUPPORTED = 505, 46431Sigor@sysoev.ru } nxt_http_status_t; 47431Sigor@sysoev.ru 48431Sigor@sysoev.ru 49431Sigor@sysoev.ru typedef enum { 50431Sigor@sysoev.ru NXT_HTTP_TE_NONE = 0, 51431Sigor@sysoev.ru NXT_HTTP_TE_CHUNKED = 1, 52431Sigor@sysoev.ru NXT_HTTP_TE_UNSUPPORTED = 2, 53431Sigor@sysoev.ru } nxt_http_te_t; 54431Sigor@sysoev.ru 55431Sigor@sysoev.ru 561112Sigor@sysoev.ru typedef enum { 571112Sigor@sysoev.ru NXT_HTTP_PROTO_H1 = 0, 581112Sigor@sysoev.ru NXT_HTTP_PROTO_H2, 591112Sigor@sysoev.ru NXT_HTTP_PROTO_DEVNULL, 601112Sigor@sysoev.ru } nxt_http_protocol_t; 611112Sigor@sysoev.ru 621112Sigor@sysoev.ru 63431Sigor@sysoev.ru typedef struct { 64431Sigor@sysoev.ru nxt_work_handler_t ready_handler; 65431Sigor@sysoev.ru nxt_work_handler_t error_handler; 66431Sigor@sysoev.ru } nxt_http_request_state_t; 67431Sigor@sysoev.ru 68431Sigor@sysoev.ru 691113Sigor@sysoev.ru typedef struct nxt_h1proto_s nxt_h1proto_t; 70431Sigor@sysoev.ru 711131Smax.romanov@nginx.com struct nxt_h1p_websocket_timer_s { 721131Smax.romanov@nginx.com nxt_timer_t timer; 731131Smax.romanov@nginx.com nxt_h1proto_t *h1p; 741131Smax.romanov@nginx.com nxt_msec_t keepalive_interval; 751131Smax.romanov@nginx.com }; 761131Smax.romanov@nginx.com 771131Smax.romanov@nginx.com 78431Sigor@sysoev.ru typedef union { 79431Sigor@sysoev.ru void *any; 80431Sigor@sysoev.ru nxt_h1proto_t *h1; 81431Sigor@sysoev.ru } nxt_http_proto_t; 82431Sigor@sysoev.ru 83431Sigor@sysoev.ru 84431Sigor@sysoev.ru #define nxt_http_field_name_set(_field, _name) \ 85431Sigor@sysoev.ru do { \ 86703Svbart@nginx.com (_field)->name_length = nxt_length(_name); \ 87431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 88431Sigor@sysoev.ru } while (0) 89431Sigor@sysoev.ru 90431Sigor@sysoev.ru 91431Sigor@sysoev.ru #define nxt_http_field_set(_field, _name, _value) \ 92431Sigor@sysoev.ru do { \ 93703Svbart@nginx.com (_field)->name_length = nxt_length(_name); \ 94703Svbart@nginx.com (_field)->value_length = nxt_length(_value); \ 95431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 96431Sigor@sysoev.ru (_field)->value = (u_char *) _value; \ 97431Sigor@sysoev.ru } while (0) 98431Sigor@sysoev.ru 99431Sigor@sysoev.ru 100431Sigor@sysoev.ru typedef struct { 101431Sigor@sysoev.ru nxt_list_t *fields; 102543Svbart@nginx.com nxt_http_field_t *date; 103431Sigor@sysoev.ru nxt_http_field_t *content_type; 104431Sigor@sysoev.ru nxt_http_field_t *content_length; 105431Sigor@sysoev.ru nxt_off_t content_length_n; 106431Sigor@sysoev.ru } nxt_http_response_t; 107431Sigor@sysoev.ru 108431Sigor@sysoev.ru 109*1394Sigor@sysoev.ru typedef struct nxt_upstream_server_s nxt_upstream_server_t; 110*1394Sigor@sysoev.ru 1111270Sigor@sysoev.ru typedef struct { 1121270Sigor@sysoev.ru nxt_http_proto_t proto; 1131270Sigor@sysoev.ru nxt_http_request_t *request; 114*1394Sigor@sysoev.ru nxt_upstream_server_t *server; 1151270Sigor@sysoev.ru nxt_list_t *fields; 1161270Sigor@sysoev.ru nxt_buf_t *body; 1171271Sigor@sysoev.ru nxt_off_t remainder; 1181270Sigor@sysoev.ru 1191270Sigor@sysoev.ru nxt_http_status_t status:16; 1201270Sigor@sysoev.ru nxt_http_protocol_t protocol:8; /* 2 bits */ 1211270Sigor@sysoev.ru uint8_t header_received; /* 1 bit */ 1221270Sigor@sysoev.ru uint8_t closed; /* 1 bit */ 1231270Sigor@sysoev.ru } nxt_http_peer_t; 1241270Sigor@sysoev.ru 1251270Sigor@sysoev.ru 126431Sigor@sysoev.ru struct nxt_http_request_s { 127431Sigor@sysoev.ru nxt_http_proto_t proto; 128683Sigor@sysoev.ru nxt_socket_conf_joint_t *conf; 129431Sigor@sysoev.ru 130431Sigor@sysoev.ru nxt_mp_t *mem_pool; 131431Sigor@sysoev.ru 132431Sigor@sysoev.ru nxt_buf_t *body; 1331131Smax.romanov@nginx.com nxt_buf_t *ws_frame; 134431Sigor@sysoev.ru nxt_buf_t *out; 135431Sigor@sysoev.ru const nxt_http_request_state_t *state; 136431Sigor@sysoev.ru 137964Sigor@sysoev.ru nxt_str_t host; 1381007Salexander.borisov@nginx.com nxt_str_t server_name; 139431Sigor@sysoev.ru nxt_str_t target; 140431Sigor@sysoev.ru nxt_str_t version; 141431Sigor@sysoev.ru nxt_str_t *method; 142431Sigor@sysoev.ru nxt_str_t *path; 143431Sigor@sysoev.ru nxt_str_t *args; 144431Sigor@sysoev.ru 1451061Sigor@sysoev.ru nxt_array_t *arguments; /* of nxt_http_name_value_t */ 1461062Sigor@sysoev.ru nxt_array_t *cookies; /* of nxt_http_name_value_t */ 147431Sigor@sysoev.ru nxt_list_t *fields; 148431Sigor@sysoev.ru nxt_http_field_t *content_type; 149431Sigor@sysoev.ru nxt_http_field_t *content_length; 150431Sigor@sysoev.ru nxt_http_field_t *cookie; 151630Svbart@nginx.com nxt_http_field_t *referer; 152630Svbart@nginx.com nxt_http_field_t *user_agent; 153431Sigor@sysoev.ru nxt_off_t content_length_n; 154431Sigor@sysoev.ru 155431Sigor@sysoev.ru nxt_sockaddr_t *remote; 156431Sigor@sysoev.ru nxt_sockaddr_t *local; 1571011Smax.romanov@nginx.com void *tls; 1581265Sigor@sysoev.ru nxt_task_t task; 159431Sigor@sysoev.ru 1601007Salexander.borisov@nginx.com nxt_timer_t timer; 1611007Salexander.borisov@nginx.com void *timer_data; 1621007Salexander.borisov@nginx.com 1631131Smax.romanov@nginx.com void *req_rpc_data; 1641131Smax.romanov@nginx.com 1651270Sigor@sysoev.ru nxt_http_peer_t *peer; 166608Sigor@sysoev.ru nxt_buf_t *last; 167608Sigor@sysoev.ru 168431Sigor@sysoev.ru nxt_http_response_t resp; 169431Sigor@sysoev.ru 170431Sigor@sysoev.ru nxt_http_status_t status:16; 171431Sigor@sysoev.ru 172964Sigor@sysoev.ru uint8_t pass_count; /* 8 bits */ 1731112Sigor@sysoev.ru nxt_http_protocol_t protocol:8; /* 2 bits */ 174431Sigor@sysoev.ru uint8_t logged; /* 1 bit */ 175431Sigor@sysoev.ru uint8_t header_sent; /* 1 bit */ 1761271Sigor@sysoev.ru uint8_t inconsistent; /* 1 bit */ 177608Sigor@sysoev.ru uint8_t error; /* 1 bit */ 1781131Smax.romanov@nginx.com uint8_t websocket_handshake; /* 1 bit */ 179431Sigor@sysoev.ru }; 180431Sigor@sysoev.ru 181431Sigor@sysoev.ru 182964Sigor@sysoev.ru typedef struct nxt_http_route_s nxt_http_route_t; 183964Sigor@sysoev.ru 184964Sigor@sysoev.ru 1851264Sigor@sysoev.ru struct nxt_http_action_s { 1861264Sigor@sysoev.ru nxt_http_action_t *(*handler)(nxt_task_t *task, 187964Sigor@sysoev.ru nxt_http_request_t *r, 1881264Sigor@sysoev.ru nxt_http_action_t *action); 189964Sigor@sysoev.ru union { 190964Sigor@sysoev.ru nxt_http_route_t *route; 191964Sigor@sysoev.ru nxt_app_t *application; 1921378Svbart@nginx.com nxt_http_action_t *fallback; 193*1394Sigor@sysoev.ru nxt_upstream_t *upstream; 194*1394Sigor@sysoev.ru uint32_t upstream_number; 195964Sigor@sysoev.ru } u; 196964Sigor@sysoev.ru 197964Sigor@sysoev.ru nxt_str_t name; 198964Sigor@sysoev.ru }; 199964Sigor@sysoev.ru 200964Sigor@sysoev.ru 2011112Sigor@sysoev.ru typedef struct { 2021112Sigor@sysoev.ru void (*body_read)(nxt_task_t *task, nxt_http_request_t *r); 2031112Sigor@sysoev.ru void (*local_addr)(nxt_task_t *task, nxt_http_request_t *r); 2041148Sigor@sysoev.ru void (*header_send)(nxt_task_t *task, nxt_http_request_t *r, 2051270Sigor@sysoev.ru nxt_work_handler_t body_handler, void *data); 2061112Sigor@sysoev.ru void (*send)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *out); 2071112Sigor@sysoev.ru nxt_off_t (*body_bytes_sent)(nxt_task_t *task, nxt_http_proto_t proto); 2081112Sigor@sysoev.ru void (*discard)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *last); 2091112Sigor@sysoev.ru void (*close)(nxt_task_t *task, nxt_http_proto_t proto, 2101112Sigor@sysoev.ru nxt_socket_conf_joint_t *joint); 2111270Sigor@sysoev.ru 2121270Sigor@sysoev.ru void (*peer_connect)(nxt_task_t *task, nxt_http_peer_t *peer); 2131270Sigor@sysoev.ru void (*peer_header_send)(nxt_task_t *task, nxt_http_peer_t *peer); 2141270Sigor@sysoev.ru void (*peer_header_read)(nxt_task_t *task, nxt_http_peer_t *peer); 2151270Sigor@sysoev.ru void (*peer_read)(nxt_task_t *task, nxt_http_peer_t *peer); 2161270Sigor@sysoev.ru void (*peer_close)(nxt_task_t *task, nxt_http_peer_t *peer); 2171270Sigor@sysoev.ru 2181131Smax.romanov@nginx.com void (*ws_frame_start)(nxt_task_t *task, nxt_http_request_t *r, 2191131Smax.romanov@nginx.com nxt_buf_t *ws_frame); 2201112Sigor@sysoev.ru } nxt_http_proto_table_t; 221431Sigor@sysoev.ru 222431Sigor@sysoev.ru 2231183Svbart@nginx.com #define NXT_HTTP_DATE_LEN nxt_length("Wed, 31 Dec 1986 16:40:00 GMT") 2241183Svbart@nginx.com 2251183Svbart@nginx.com nxt_inline u_char * 2261183Svbart@nginx.com nxt_http_date(u_char *buf, struct tm *tm) 2271183Svbart@nginx.com { 2281183Svbart@nginx.com static const char *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", 2291183Svbart@nginx.com "Sat" }; 2301183Svbart@nginx.com 2311183Svbart@nginx.com static const char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", 2321183Svbart@nginx.com "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; 2331183Svbart@nginx.com 2341183Svbart@nginx.com return nxt_sprintf(buf, buf + NXT_HTTP_DATE_LEN, 2351183Svbart@nginx.com "%s, %02d %s %4d %02d:%02d:%02d GMT", 2361183Svbart@nginx.com week[tm->tm_wday], tm->tm_mday, 2371183Svbart@nginx.com month[tm->tm_mon], tm->tm_year + 1900, 2381183Svbart@nginx.com tm->tm_hour, tm->tm_min, tm->tm_sec); 2391183Svbart@nginx.com } 2401183Svbart@nginx.com 2411183Svbart@nginx.com 242431Sigor@sysoev.ru nxt_int_t nxt_http_init(nxt_task_t *task, nxt_runtime_t *rt); 243431Sigor@sysoev.ru nxt_int_t nxt_h1p_init(nxt_task_t *task, nxt_runtime_t *rt); 244431Sigor@sysoev.ru nxt_int_t nxt_http_response_hash_init(nxt_task_t *task, nxt_runtime_t *rt); 245431Sigor@sysoev.ru 246431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data); 247431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task); 248431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r, 249431Sigor@sysoev.ru nxt_http_status_t status); 250431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r); 2511148Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r, 2521270Sigor@sysoev.ru nxt_work_handler_t body_handler, void *data); 2531131Smax.romanov@nginx.com void nxt_http_request_ws_frame_start(nxt_task_t *task, nxt_http_request_t *r, 2541131Smax.romanov@nginx.com nxt_buf_t *ws_frame); 255431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r, 256431Sigor@sysoev.ru nxt_buf_t *out); 257608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r, 258608Sigor@sysoev.ru size_t size); 259608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r); 260608Sigor@sysoev.ru void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data); 2611131Smax.romanov@nginx.com void nxt_http_request_close_handler(nxt_task_t *task, void *obj, void *data); 262431Sigor@sysoev.ru 263431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field, 264431Sigor@sysoev.ru uintptr_t data); 265431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field, 266431Sigor@sysoev.ru uintptr_t offset); 267431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field, 268431Sigor@sysoev.ru uintptr_t data); 269431Sigor@sysoev.ru 270964Sigor@sysoev.ru nxt_http_routes_t *nxt_http_routes_create(nxt_task_t *task, 271964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *routes_conf); 2721264Sigor@sysoev.ru nxt_http_action_t *nxt_http_action_create(nxt_task_t *task, 273964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_str_t *name); 274964Sigor@sysoev.ru void nxt_http_routes_resolve(nxt_task_t *task, nxt_router_temp_conf_t *tmcf); 2751264Sigor@sysoev.ru nxt_http_action_t *nxt_http_pass_application(nxt_task_t *task, 276964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_str_t *name); 277964Sigor@sysoev.ru void nxt_http_routes_cleanup(nxt_task_t *task, nxt_http_routes_t *routes); 2781264Sigor@sysoev.ru void nxt_http_action_cleanup(nxt_task_t *task, nxt_http_action_t *action); 279964Sigor@sysoev.ru 280*1394Sigor@sysoev.ru nxt_int_t nxt_upstreams_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, 281*1394Sigor@sysoev.ru nxt_conf_value_t *conf); 282*1394Sigor@sysoev.ru nxt_int_t nxt_upstreams_joint_create(nxt_router_temp_conf_t *tmcf, 283*1394Sigor@sysoev.ru nxt_upstream_t ***upstream_joint); 284*1394Sigor@sysoev.ru 2851264Sigor@sysoev.ru nxt_http_action_t *nxt_http_static_handler(nxt_task_t *task, 2861264Sigor@sysoev.ru nxt_http_request_t *r, nxt_http_action_t *action); 2871183Svbart@nginx.com nxt_int_t nxt_http_static_mtypes_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash); 2881183Svbart@nginx.com nxt_int_t nxt_http_static_mtypes_hash_add(nxt_mp_t *mp, nxt_lvlhsh_t *hash, 2891183Svbart@nginx.com nxt_str_t *extension, nxt_str_t *type); 2901183Svbart@nginx.com nxt_str_t *nxt_http_static_mtypes_hash_find(nxt_lvlhsh_t *hash, 2911183Svbart@nginx.com nxt_str_t *extension); 2921183Svbart@nginx.com 2931264Sigor@sysoev.ru nxt_http_action_t *nxt_http_application_handler(nxt_task_t *task, 2941264Sigor@sysoev.ru nxt_http_request_t *r, nxt_http_action_t *action); 295*1394Sigor@sysoev.ru void nxt_upstream_find(nxt_upstreams_t *upstreams, nxt_str_t *name, 296*1394Sigor@sysoev.ru nxt_http_action_t *action); 297*1394Sigor@sysoev.ru nxt_http_action_t *nxt_upstream_proxy_handler(nxt_task_t *task, 298*1394Sigor@sysoev.ru nxt_http_request_t *r, nxt_upstream_t *upstream); 299*1394Sigor@sysoev.ru 300431Sigor@sysoev.ru 3011270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_create(nxt_mp_t *mp, nxt_http_action_t *action); 3021270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_date(void *ctx, nxt_http_field_t *field, 3031270Sigor@sysoev.ru uintptr_t data); 3041270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_content_length(void *ctx, nxt_http_field_t *field, 3051270Sigor@sysoev.ru uintptr_t data); 3061270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_skip(void *ctx, nxt_http_field_t *field, 3071270Sigor@sysoev.ru uintptr_t data); 3081270Sigor@sysoev.ru nxt_buf_t *nxt_http_proxy_buf_mem_alloc(nxt_task_t *task, nxt_http_request_t *r, 3091270Sigor@sysoev.ru size_t size); 3101270Sigor@sysoev.ru void nxt_http_proxy_buf_mem_free(nxt_task_t *task, nxt_http_request_t *r, 3111270Sigor@sysoev.ru nxt_buf_t *b); 3121270Sigor@sysoev.ru 313740Sigor@sysoev.ru extern nxt_time_string_t nxt_http_date_cache; 314740Sigor@sysoev.ru 315431Sigor@sysoev.ru extern nxt_lvlhsh_t nxt_response_fields_hash; 316431Sigor@sysoev.ru 3171112Sigor@sysoev.ru extern const nxt_http_proto_table_t nxt_http_proto[]; 318431Sigor@sysoev.ru 3191131Smax.romanov@nginx.com void nxt_h1p_websocket_first_frame_start(nxt_task_t *task, 3201131Smax.romanov@nginx.com nxt_http_request_t *r, nxt_buf_t *ws_frame); 3211131Smax.romanov@nginx.com void nxt_h1p_websocket_frame_start(nxt_task_t *task, nxt_http_request_t *r, 3221131Smax.romanov@nginx.com nxt_buf_t *ws_frame); 3231131Smax.romanov@nginx.com void nxt_h1p_complete_buffers(nxt_task_t *task, nxt_h1proto_t *h1p); 3241131Smax.romanov@nginx.com nxt_msec_t nxt_h1p_conn_request_timer_value(nxt_conn_t *c, uintptr_t data); 3251131Smax.romanov@nginx.com 3261131Smax.romanov@nginx.com extern const nxt_conn_state_t nxt_h1p_idle_close_state; 327431Sigor@sysoev.ru 328431Sigor@sysoev.ru #endif /* _NXT_HTTP_H_INCLUDED_ */ 329