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, 261432Svbart@nginx.com NXT_HTTP_TEMPORARY_REDIRECT = 307, 271432Svbart@nginx.com NXT_HTTP_PERMANENT_REDIRECT = 308, 28431Sigor@sysoev.ru 29431Sigor@sysoev.ru NXT_HTTP_BAD_REQUEST = 400, 301183Svbart@nginx.com NXT_HTTP_FORBIDDEN = 403, 31964Sigor@sysoev.ru NXT_HTTP_NOT_FOUND = 404, 321183Svbart@nginx.com NXT_HTTP_METHOD_NOT_ALLOWED = 405, 33624Sigor@sysoev.ru NXT_HTTP_REQUEST_TIMEOUT = 408, 34431Sigor@sysoev.ru NXT_HTTP_LENGTH_REQUIRED = 411, 35431Sigor@sysoev.ru NXT_HTTP_PAYLOAD_TOO_LARGE = 413, 36431Sigor@sysoev.ru NXT_HTTP_URI_TOO_LONG = 414, 371131Smax.romanov@nginx.com NXT_HTTP_UPGRADE_REQUIRED = 426, 38431Sigor@sysoev.ru NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431, 39431Sigor@sysoev.ru 40772Sigor@sysoev.ru NXT_HTTP_TO_HTTPS = 497, 41772Sigor@sysoev.ru 42431Sigor@sysoev.ru NXT_HTTP_INTERNAL_SERVER_ERROR = 500, 43431Sigor@sysoev.ru NXT_HTTP_NOT_IMPLEMENTED = 501, 44431Sigor@sysoev.ru NXT_HTTP_BAD_GATEWAY = 502, 45431Sigor@sysoev.ru NXT_HTTP_SERVICE_UNAVAILABLE = 503, 46431Sigor@sysoev.ru NXT_HTTP_GATEWAY_TIMEOUT = 504, 47482Svbart@nginx.com NXT_HTTP_VERSION_NOT_SUPPORTED = 505, 481429Svbart@nginx.com NXT_HTTP_SERVER_ERROR_MAX = 599, 491429Svbart@nginx.com 501429Svbart@nginx.com NXT_HTTP_STATUS_MAX = 999, 51431Sigor@sysoev.ru } nxt_http_status_t; 52431Sigor@sysoev.ru 53431Sigor@sysoev.ru 54431Sigor@sysoev.ru typedef enum { 55431Sigor@sysoev.ru NXT_HTTP_TE_NONE = 0, 56431Sigor@sysoev.ru NXT_HTTP_TE_CHUNKED = 1, 57431Sigor@sysoev.ru NXT_HTTP_TE_UNSUPPORTED = 2, 58431Sigor@sysoev.ru } nxt_http_te_t; 59431Sigor@sysoev.ru 60431Sigor@sysoev.ru 611112Sigor@sysoev.ru typedef enum { 621112Sigor@sysoev.ru NXT_HTTP_PROTO_H1 = 0, 631112Sigor@sysoev.ru NXT_HTTP_PROTO_H2, 641112Sigor@sysoev.ru NXT_HTTP_PROTO_DEVNULL, 651112Sigor@sysoev.ru } nxt_http_protocol_t; 661112Sigor@sysoev.ru 671112Sigor@sysoev.ru 68431Sigor@sysoev.ru typedef struct { 69431Sigor@sysoev.ru nxt_work_handler_t ready_handler; 70431Sigor@sysoev.ru nxt_work_handler_t error_handler; 71431Sigor@sysoev.ru } nxt_http_request_state_t; 72431Sigor@sysoev.ru 73431Sigor@sysoev.ru 741113Sigor@sysoev.ru typedef struct nxt_h1proto_s nxt_h1proto_t; 75431Sigor@sysoev.ru 761131Smax.romanov@nginx.com struct nxt_h1p_websocket_timer_s { 771131Smax.romanov@nginx.com nxt_timer_t timer; 781131Smax.romanov@nginx.com nxt_h1proto_t *h1p; 791131Smax.romanov@nginx.com nxt_msec_t keepalive_interval; 801131Smax.romanov@nginx.com }; 811131Smax.romanov@nginx.com 821131Smax.romanov@nginx.com 83431Sigor@sysoev.ru typedef union { 84431Sigor@sysoev.ru void *any; 85431Sigor@sysoev.ru nxt_h1proto_t *h1; 86431Sigor@sysoev.ru } nxt_http_proto_t; 87431Sigor@sysoev.ru 88431Sigor@sysoev.ru 89431Sigor@sysoev.ru #define nxt_http_field_name_set(_field, _name) \ 90431Sigor@sysoev.ru do { \ 91703Svbart@nginx.com (_field)->name_length = nxt_length(_name); \ 92431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 93431Sigor@sysoev.ru } while (0) 94431Sigor@sysoev.ru 95431Sigor@sysoev.ru 96431Sigor@sysoev.ru #define nxt_http_field_set(_field, _name, _value) \ 97431Sigor@sysoev.ru do { \ 98703Svbart@nginx.com (_field)->name_length = nxt_length(_name); \ 99703Svbart@nginx.com (_field)->value_length = nxt_length(_value); \ 100431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 101431Sigor@sysoev.ru (_field)->value = (u_char *) _value; \ 102431Sigor@sysoev.ru } while (0) 103431Sigor@sysoev.ru 104431Sigor@sysoev.ru 105431Sigor@sysoev.ru typedef struct { 106431Sigor@sysoev.ru nxt_list_t *fields; 107543Svbart@nginx.com nxt_http_field_t *date; 108431Sigor@sysoev.ru nxt_http_field_t *content_type; 109431Sigor@sysoev.ru nxt_http_field_t *content_length; 110431Sigor@sysoev.ru nxt_off_t content_length_n; 111431Sigor@sysoev.ru } nxt_http_response_t; 112431Sigor@sysoev.ru 113431Sigor@sysoev.ru 1141394Sigor@sysoev.ru typedef struct nxt_upstream_server_s nxt_upstream_server_t; 1151394Sigor@sysoev.ru 1161270Sigor@sysoev.ru typedef struct { 1171270Sigor@sysoev.ru nxt_http_proto_t proto; 1181270Sigor@sysoev.ru nxt_http_request_t *request; 1191394Sigor@sysoev.ru nxt_upstream_server_t *server; 1201270Sigor@sysoev.ru nxt_list_t *fields; 1211270Sigor@sysoev.ru nxt_buf_t *body; 1221271Sigor@sysoev.ru nxt_off_t remainder; 1231270Sigor@sysoev.ru 1241270Sigor@sysoev.ru nxt_http_status_t status:16; 1251270Sigor@sysoev.ru nxt_http_protocol_t protocol:8; /* 2 bits */ 1261270Sigor@sysoev.ru uint8_t header_received; /* 1 bit */ 1271270Sigor@sysoev.ru uint8_t closed; /* 1 bit */ 1281270Sigor@sysoev.ru } nxt_http_peer_t; 1291270Sigor@sysoev.ru 1301270Sigor@sysoev.ru 131431Sigor@sysoev.ru struct nxt_http_request_s { 132431Sigor@sysoev.ru nxt_http_proto_t proto; 133683Sigor@sysoev.ru nxt_socket_conf_joint_t *conf; 134431Sigor@sysoev.ru 135431Sigor@sysoev.ru nxt_mp_t *mem_pool; 136431Sigor@sysoev.ru 137431Sigor@sysoev.ru nxt_buf_t *body; 1381131Smax.romanov@nginx.com nxt_buf_t *ws_frame; 139431Sigor@sysoev.ru nxt_buf_t *out; 140431Sigor@sysoev.ru const nxt_http_request_state_t *state; 141431Sigor@sysoev.ru 142964Sigor@sysoev.ru nxt_str_t host; 1431007Salexander.borisov@nginx.com nxt_str_t server_name; 144431Sigor@sysoev.ru nxt_str_t target; 145431Sigor@sysoev.ru nxt_str_t version; 146431Sigor@sysoev.ru nxt_str_t *method; 147431Sigor@sysoev.ru nxt_str_t *path; 148431Sigor@sysoev.ru nxt_str_t *args; 149431Sigor@sysoev.ru 1501061Sigor@sysoev.ru nxt_array_t *arguments; /* of nxt_http_name_value_t */ 1511062Sigor@sysoev.ru nxt_array_t *cookies; /* of nxt_http_name_value_t */ 152431Sigor@sysoev.ru nxt_list_t *fields; 153431Sigor@sysoev.ru nxt_http_field_t *content_type; 154431Sigor@sysoev.ru nxt_http_field_t *content_length; 155431Sigor@sysoev.ru nxt_http_field_t *cookie; 156630Svbart@nginx.com nxt_http_field_t *referer; 157630Svbart@nginx.com nxt_http_field_t *user_agent; 158431Sigor@sysoev.ru nxt_off_t content_length_n; 159431Sigor@sysoev.ru 160431Sigor@sysoev.ru nxt_sockaddr_t *remote; 161431Sigor@sysoev.ru nxt_sockaddr_t *local; 1621011Smax.romanov@nginx.com void *tls; 1631265Sigor@sysoev.ru nxt_task_t task; 164431Sigor@sysoev.ru 1651007Salexander.borisov@nginx.com nxt_timer_t timer; 1661007Salexander.borisov@nginx.com void *timer_data; 1671007Salexander.borisov@nginx.com 1681131Smax.romanov@nginx.com void *req_rpc_data; 1691131Smax.romanov@nginx.com 1701270Sigor@sysoev.ru nxt_http_peer_t *peer; 171608Sigor@sysoev.ru nxt_buf_t *last; 172608Sigor@sysoev.ru 173431Sigor@sysoev.ru nxt_http_response_t resp; 174431Sigor@sysoev.ru 175431Sigor@sysoev.ru nxt_http_status_t status:16; 176431Sigor@sysoev.ru 177964Sigor@sysoev.ru uint8_t pass_count; /* 8 bits */ 1781112Sigor@sysoev.ru nxt_http_protocol_t protocol:8; /* 2 bits */ 179431Sigor@sysoev.ru uint8_t logged; /* 1 bit */ 180431Sigor@sysoev.ru uint8_t header_sent; /* 1 bit */ 1811271Sigor@sysoev.ru uint8_t inconsistent; /* 1 bit */ 182608Sigor@sysoev.ru uint8_t error; /* 1 bit */ 1831131Smax.romanov@nginx.com uint8_t websocket_handshake; /* 1 bit */ 184431Sigor@sysoev.ru }; 185431Sigor@sysoev.ru 186431Sigor@sysoev.ru 187964Sigor@sysoev.ru typedef struct nxt_http_route_s nxt_http_route_t; 188964Sigor@sysoev.ru 189964Sigor@sysoev.ru 1901264Sigor@sysoev.ru struct nxt_http_action_s { 1911264Sigor@sysoev.ru nxt_http_action_t *(*handler)(nxt_task_t *task, 192964Sigor@sysoev.ru nxt_http_request_t *r, 1931264Sigor@sysoev.ru nxt_http_action_t *action); 194964Sigor@sysoev.ru union { 195964Sigor@sysoev.ru nxt_http_route_t *route; 196964Sigor@sysoev.ru nxt_app_t *application; 1971378Svbart@nginx.com nxt_http_action_t *fallback; 1981394Sigor@sysoev.ru nxt_upstream_t *upstream; 1991394Sigor@sysoev.ru uint32_t upstream_number; 2001429Svbart@nginx.com nxt_http_status_t return_code; 201964Sigor@sysoev.ru } u; 202964Sigor@sysoev.ru 203964Sigor@sysoev.ru nxt_str_t name; 204964Sigor@sysoev.ru }; 205964Sigor@sysoev.ru 206964Sigor@sysoev.ru 2071112Sigor@sysoev.ru typedef struct { 2081112Sigor@sysoev.ru void (*body_read)(nxt_task_t *task, nxt_http_request_t *r); 2091112Sigor@sysoev.ru void (*local_addr)(nxt_task_t *task, nxt_http_request_t *r); 2101148Sigor@sysoev.ru void (*header_send)(nxt_task_t *task, nxt_http_request_t *r, 2111270Sigor@sysoev.ru nxt_work_handler_t body_handler, void *data); 2121112Sigor@sysoev.ru void (*send)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *out); 2131112Sigor@sysoev.ru nxt_off_t (*body_bytes_sent)(nxt_task_t *task, nxt_http_proto_t proto); 2141112Sigor@sysoev.ru void (*discard)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *last); 2151112Sigor@sysoev.ru void (*close)(nxt_task_t *task, nxt_http_proto_t proto, 2161112Sigor@sysoev.ru nxt_socket_conf_joint_t *joint); 2171270Sigor@sysoev.ru 2181270Sigor@sysoev.ru void (*peer_connect)(nxt_task_t *task, nxt_http_peer_t *peer); 2191270Sigor@sysoev.ru void (*peer_header_send)(nxt_task_t *task, nxt_http_peer_t *peer); 2201270Sigor@sysoev.ru void (*peer_header_read)(nxt_task_t *task, nxt_http_peer_t *peer); 2211270Sigor@sysoev.ru void (*peer_read)(nxt_task_t *task, nxt_http_peer_t *peer); 2221270Sigor@sysoev.ru void (*peer_close)(nxt_task_t *task, nxt_http_peer_t *peer); 2231270Sigor@sysoev.ru 2241131Smax.romanov@nginx.com void (*ws_frame_start)(nxt_task_t *task, nxt_http_request_t *r, 2251131Smax.romanov@nginx.com nxt_buf_t *ws_frame); 2261112Sigor@sysoev.ru } nxt_http_proto_table_t; 227431Sigor@sysoev.ru 228431Sigor@sysoev.ru 2291183Svbart@nginx.com #define NXT_HTTP_DATE_LEN nxt_length("Wed, 31 Dec 1986 16:40:00 GMT") 2301183Svbart@nginx.com 2311183Svbart@nginx.com nxt_inline u_char * 2321183Svbart@nginx.com nxt_http_date(u_char *buf, struct tm *tm) 2331183Svbart@nginx.com { 2341183Svbart@nginx.com static const char *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", 2351183Svbart@nginx.com "Sat" }; 2361183Svbart@nginx.com 2371183Svbart@nginx.com static const char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", 2381183Svbart@nginx.com "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; 2391183Svbart@nginx.com 2401183Svbart@nginx.com return nxt_sprintf(buf, buf + NXT_HTTP_DATE_LEN, 2411183Svbart@nginx.com "%s, %02d %s %4d %02d:%02d:%02d GMT", 2421183Svbart@nginx.com week[tm->tm_wday], tm->tm_mday, 2431183Svbart@nginx.com month[tm->tm_mon], tm->tm_year + 1900, 2441183Svbart@nginx.com tm->tm_hour, tm->tm_min, tm->tm_sec); 2451183Svbart@nginx.com } 2461183Svbart@nginx.com 2471183Svbart@nginx.com 248*1459Smax.romanov@nginx.com nxt_int_t nxt_http_init(nxt_task_t *task); 249*1459Smax.romanov@nginx.com nxt_int_t nxt_h1p_init(nxt_task_t *task); 250*1459Smax.romanov@nginx.com nxt_int_t nxt_http_response_hash_init(nxt_task_t *task); 251431Sigor@sysoev.ru 252431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data); 253431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task); 254431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r, 255431Sigor@sysoev.ru nxt_http_status_t status); 256431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r); 2571148Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r, 2581270Sigor@sysoev.ru nxt_work_handler_t body_handler, void *data); 2591131Smax.romanov@nginx.com void nxt_http_request_ws_frame_start(nxt_task_t *task, nxt_http_request_t *r, 2601131Smax.romanov@nginx.com nxt_buf_t *ws_frame); 261431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r, 262431Sigor@sysoev.ru nxt_buf_t *out); 263608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r, 264608Sigor@sysoev.ru size_t size); 265608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r); 266608Sigor@sysoev.ru void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data); 2671131Smax.romanov@nginx.com void nxt_http_request_close_handler(nxt_task_t *task, void *obj, void *data); 268431Sigor@sysoev.ru 269431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field, 270431Sigor@sysoev.ru uintptr_t data); 271431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field, 272431Sigor@sysoev.ru uintptr_t offset); 273431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field, 274431Sigor@sysoev.ru uintptr_t data); 275431Sigor@sysoev.ru 276964Sigor@sysoev.ru nxt_http_routes_t *nxt_http_routes_create(nxt_task_t *task, 277964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *routes_conf); 2781264Sigor@sysoev.ru nxt_http_action_t *nxt_http_action_create(nxt_task_t *task, 279964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_str_t *name); 280964Sigor@sysoev.ru void nxt_http_routes_resolve(nxt_task_t *task, nxt_router_temp_conf_t *tmcf); 2811264Sigor@sysoev.ru nxt_http_action_t *nxt_http_pass_application(nxt_task_t *task, 282964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_str_t *name); 283964Sigor@sysoev.ru void nxt_http_routes_cleanup(nxt_task_t *task, nxt_http_routes_t *routes); 2841264Sigor@sysoev.ru void nxt_http_action_cleanup(nxt_task_t *task, nxt_http_action_t *action); 285964Sigor@sysoev.ru 2861394Sigor@sysoev.ru nxt_int_t nxt_upstreams_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, 2871394Sigor@sysoev.ru nxt_conf_value_t *conf); 2881394Sigor@sysoev.ru nxt_int_t nxt_upstreams_joint_create(nxt_router_temp_conf_t *tmcf, 2891394Sigor@sysoev.ru nxt_upstream_t ***upstream_joint); 2901394Sigor@sysoev.ru 2911429Svbart@nginx.com nxt_http_action_t *nxt_http_return_handler(nxt_task_t *task, 2921429Svbart@nginx.com nxt_http_request_t *r, nxt_http_action_t *action); 2931429Svbart@nginx.com 2941264Sigor@sysoev.ru nxt_http_action_t *nxt_http_static_handler(nxt_task_t *task, 2951264Sigor@sysoev.ru nxt_http_request_t *r, nxt_http_action_t *action); 2961183Svbart@nginx.com nxt_int_t nxt_http_static_mtypes_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash); 2971183Svbart@nginx.com nxt_int_t nxt_http_static_mtypes_hash_add(nxt_mp_t *mp, nxt_lvlhsh_t *hash, 2981183Svbart@nginx.com nxt_str_t *extension, nxt_str_t *type); 2991183Svbart@nginx.com nxt_str_t *nxt_http_static_mtypes_hash_find(nxt_lvlhsh_t *hash, 3001183Svbart@nginx.com nxt_str_t *extension); 3011183Svbart@nginx.com 3021264Sigor@sysoev.ru nxt_http_action_t *nxt_http_application_handler(nxt_task_t *task, 3031264Sigor@sysoev.ru nxt_http_request_t *r, nxt_http_action_t *action); 3041394Sigor@sysoev.ru void nxt_upstream_find(nxt_upstreams_t *upstreams, nxt_str_t *name, 3051394Sigor@sysoev.ru nxt_http_action_t *action); 3061394Sigor@sysoev.ru nxt_http_action_t *nxt_upstream_proxy_handler(nxt_task_t *task, 3071394Sigor@sysoev.ru nxt_http_request_t *r, nxt_upstream_t *upstream); 3081394Sigor@sysoev.ru 309431Sigor@sysoev.ru 3101270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_create(nxt_mp_t *mp, nxt_http_action_t *action); 3111270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_date(void *ctx, nxt_http_field_t *field, 3121270Sigor@sysoev.ru uintptr_t data); 3131270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_content_length(void *ctx, nxt_http_field_t *field, 3141270Sigor@sysoev.ru uintptr_t data); 3151270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_skip(void *ctx, nxt_http_field_t *field, 3161270Sigor@sysoev.ru uintptr_t data); 3171270Sigor@sysoev.ru nxt_buf_t *nxt_http_proxy_buf_mem_alloc(nxt_task_t *task, nxt_http_request_t *r, 3181270Sigor@sysoev.ru size_t size); 3191270Sigor@sysoev.ru void nxt_http_proxy_buf_mem_free(nxt_task_t *task, nxt_http_request_t *r, 3201270Sigor@sysoev.ru nxt_buf_t *b); 3211270Sigor@sysoev.ru 322740Sigor@sysoev.ru extern nxt_time_string_t nxt_http_date_cache; 323740Sigor@sysoev.ru 324431Sigor@sysoev.ru extern nxt_lvlhsh_t nxt_response_fields_hash; 325431Sigor@sysoev.ru 3261112Sigor@sysoev.ru extern const nxt_http_proto_table_t nxt_http_proto[]; 327431Sigor@sysoev.ru 3281131Smax.romanov@nginx.com void nxt_h1p_websocket_first_frame_start(nxt_task_t *task, 3291131Smax.romanov@nginx.com nxt_http_request_t *r, nxt_buf_t *ws_frame); 3301131Smax.romanov@nginx.com void nxt_h1p_websocket_frame_start(nxt_task_t *task, nxt_http_request_t *r, 3311131Smax.romanov@nginx.com nxt_buf_t *ws_frame); 3321417Smax.romanov@nginx.com void nxt_h1p_complete_buffers(nxt_task_t *task, nxt_h1proto_t *h1p, 3331417Smax.romanov@nginx.com nxt_bool_t all); 3341131Smax.romanov@nginx.com nxt_msec_t nxt_h1p_conn_request_timer_value(nxt_conn_t *c, uintptr_t data); 3351131Smax.romanov@nginx.com 3361131Smax.romanov@nginx.com extern const nxt_conn_state_t nxt_h1p_idle_close_state; 337431Sigor@sysoev.ru 338431Sigor@sysoev.ru #endif /* _NXT_HTTP_H_INCLUDED_ */ 339