xref: /unit/src/nxt_http.h (revision 1394)
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