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
101721Saxel.duch@nginx.com #include <nxt_regex.h>
111721Saxel.duch@nginx.com
12431Sigor@sysoev.ru
13431Sigor@sysoev.ru typedef enum {
141270Sigor@sysoev.ru NXT_HTTP_UNSET = -1,
15431Sigor@sysoev.ru NXT_HTTP_INVALID = 0,
16431Sigor@sysoev.ru
171131Smax.romanov@nginx.com NXT_HTTP_CONTINUE = 100,
181131Smax.romanov@nginx.com NXT_HTTP_SWITCHING_PROTOCOLS = 101,
191131Smax.romanov@nginx.com
20431Sigor@sysoev.ru NXT_HTTP_OK = 200,
21793Sigor@sysoev.ru NXT_HTTP_NO_CONTENT = 204,
22431Sigor@sysoev.ru
23431Sigor@sysoev.ru NXT_HTTP_MULTIPLE_CHOICES = 300,
24431Sigor@sysoev.ru NXT_HTTP_MOVED_PERMANENTLY = 301,
25431Sigor@sysoev.ru NXT_HTTP_FOUND = 302,
26431Sigor@sysoev.ru NXT_HTTP_SEE_OTHER = 303,
27431Sigor@sysoev.ru NXT_HTTP_NOT_MODIFIED = 304,
281432Svbart@nginx.com NXT_HTTP_TEMPORARY_REDIRECT = 307,
291432Svbart@nginx.com NXT_HTTP_PERMANENT_REDIRECT = 308,
30431Sigor@sysoev.ru
31431Sigor@sysoev.ru NXT_HTTP_BAD_REQUEST = 400,
321183Svbart@nginx.com NXT_HTTP_FORBIDDEN = 403,
33964Sigor@sysoev.ru NXT_HTTP_NOT_FOUND = 404,
341183Svbart@nginx.com NXT_HTTP_METHOD_NOT_ALLOWED = 405,
35624Sigor@sysoev.ru NXT_HTTP_REQUEST_TIMEOUT = 408,
36431Sigor@sysoev.ru NXT_HTTP_LENGTH_REQUIRED = 411,
37431Sigor@sysoev.ru NXT_HTTP_PAYLOAD_TOO_LARGE = 413,
38431Sigor@sysoev.ru NXT_HTTP_URI_TOO_LONG = 414,
391131Smax.romanov@nginx.com NXT_HTTP_UPGRADE_REQUIRED = 426,
40431Sigor@sysoev.ru NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431,
41431Sigor@sysoev.ru
42772Sigor@sysoev.ru NXT_HTTP_TO_HTTPS = 497,
43772Sigor@sysoev.ru
44431Sigor@sysoev.ru NXT_HTTP_INTERNAL_SERVER_ERROR = 500,
45431Sigor@sysoev.ru NXT_HTTP_NOT_IMPLEMENTED = 501,
46431Sigor@sysoev.ru NXT_HTTP_BAD_GATEWAY = 502,
47431Sigor@sysoev.ru NXT_HTTP_SERVICE_UNAVAILABLE = 503,
48431Sigor@sysoev.ru NXT_HTTP_GATEWAY_TIMEOUT = 504,
49482Svbart@nginx.com NXT_HTTP_VERSION_NOT_SUPPORTED = 505,
501429Svbart@nginx.com NXT_HTTP_SERVER_ERROR_MAX = 599,
511429Svbart@nginx.com
521429Svbart@nginx.com NXT_HTTP_STATUS_MAX = 999,
53431Sigor@sysoev.ru } nxt_http_status_t;
54431Sigor@sysoev.ru
55431Sigor@sysoev.ru
56431Sigor@sysoev.ru typedef enum {
57431Sigor@sysoev.ru NXT_HTTP_TE_NONE = 0,
58431Sigor@sysoev.ru NXT_HTTP_TE_CHUNKED = 1,
59431Sigor@sysoev.ru NXT_HTTP_TE_UNSUPPORTED = 2,
60431Sigor@sysoev.ru } nxt_http_te_t;
61431Sigor@sysoev.ru
62431Sigor@sysoev.ru
631112Sigor@sysoev.ru typedef enum {
641112Sigor@sysoev.ru NXT_HTTP_PROTO_H1 = 0,
651112Sigor@sysoev.ru NXT_HTTP_PROTO_H2,
661112Sigor@sysoev.ru NXT_HTTP_PROTO_DEVNULL,
671112Sigor@sysoev.ru } nxt_http_protocol_t;
681112Sigor@sysoev.ru
691112Sigor@sysoev.ru
70431Sigor@sysoev.ru typedef struct {
71431Sigor@sysoev.ru nxt_work_handler_t ready_handler;
72431Sigor@sysoev.ru nxt_work_handler_t error_handler;
73431Sigor@sysoev.ru } nxt_http_request_state_t;
74431Sigor@sysoev.ru
75431Sigor@sysoev.ru
761113Sigor@sysoev.ru typedef struct nxt_h1proto_s nxt_h1proto_t;
77431Sigor@sysoev.ru
781131Smax.romanov@nginx.com struct nxt_h1p_websocket_timer_s {
791131Smax.romanov@nginx.com nxt_timer_t timer;
801131Smax.romanov@nginx.com nxt_h1proto_t *h1p;
811131Smax.romanov@nginx.com nxt_msec_t keepalive_interval;
821131Smax.romanov@nginx.com };
831131Smax.romanov@nginx.com
841131Smax.romanov@nginx.com
85431Sigor@sysoev.ru typedef union {
86431Sigor@sysoev.ru void *any;
87431Sigor@sysoev.ru nxt_h1proto_t *h1;
88431Sigor@sysoev.ru } nxt_http_proto_t;
89431Sigor@sysoev.ru
90431Sigor@sysoev.ru
91431Sigor@sysoev.ru #define nxt_http_field_name_set(_field, _name) \
92431Sigor@sysoev.ru do { \
932078Salx.manpages@gmail.com (_field)->name_length = nxt_length(_name); \
942078Salx.manpages@gmail.com (_field)->name = (u_char *) _name; \
95431Sigor@sysoev.ru } while (0)
96431Sigor@sysoev.ru
97431Sigor@sysoev.ru
98431Sigor@sysoev.ru #define nxt_http_field_set(_field, _name, _value) \
99431Sigor@sysoev.ru do { \
1002078Salx.manpages@gmail.com (_field)->name_length = nxt_length(_name); \
1012078Salx.manpages@gmail.com (_field)->value_length = nxt_length(_value); \
1022078Salx.manpages@gmail.com (_field)->name = (u_char *) _name; \
1032078Salx.manpages@gmail.com (_field)->value = (u_char *) _value; \
104431Sigor@sysoev.ru } while (0)
105431Sigor@sysoev.ru
106431Sigor@sysoev.ru
107431Sigor@sysoev.ru typedef struct {
108431Sigor@sysoev.ru nxt_list_t *fields;
109543Svbart@nginx.com nxt_http_field_t *date;
110431Sigor@sysoev.ru nxt_http_field_t *content_type;
111431Sigor@sysoev.ru nxt_http_field_t *content_length;
112431Sigor@sysoev.ru nxt_off_t content_length_n;
113431Sigor@sysoev.ru } nxt_http_response_t;
114431Sigor@sysoev.ru
115431Sigor@sysoev.ru
1161394Sigor@sysoev.ru typedef struct nxt_upstream_server_s nxt_upstream_server_t;
1171394Sigor@sysoev.ru
1181270Sigor@sysoev.ru typedef struct {
1191270Sigor@sysoev.ru nxt_http_proto_t proto;
1201270Sigor@sysoev.ru nxt_http_request_t *request;
1211394Sigor@sysoev.ru nxt_upstream_server_t *server;
1221270Sigor@sysoev.ru nxt_list_t *fields;
1231270Sigor@sysoev.ru nxt_buf_t *body;
1241270Sigor@sysoev.ru
1251270Sigor@sysoev.ru nxt_http_status_t status:16;
1261270Sigor@sysoev.ru nxt_http_protocol_t protocol:8; /* 2 bits */
1271270Sigor@sysoev.ru uint8_t header_received; /* 1 bit */
1281270Sigor@sysoev.ru uint8_t closed; /* 1 bit */
1291270Sigor@sysoev.ru } nxt_http_peer_t;
1301270Sigor@sysoev.ru
1311270Sigor@sysoev.ru
132431Sigor@sysoev.ru struct nxt_http_request_s {
133431Sigor@sysoev.ru nxt_http_proto_t proto;
134683Sigor@sysoev.ru nxt_socket_conf_joint_t *conf;
135431Sigor@sysoev.ru
136431Sigor@sysoev.ru nxt_mp_t *mem_pool;
137431Sigor@sysoev.ru
138431Sigor@sysoev.ru nxt_buf_t *body;
1391131Smax.romanov@nginx.com nxt_buf_t *ws_frame;
140431Sigor@sysoev.ru nxt_buf_t *out;
141431Sigor@sysoev.ru const nxt_http_request_state_t *state;
142431Sigor@sysoev.ru
1432214Sz.hong@f5.com nxt_nsec_t start_time;
1442214Sz.hong@f5.com
145964Sigor@sysoev.ru nxt_str_t host;
1461007Salexander.borisov@nginx.com nxt_str_t server_name;
1472430Salx@nginx.com nxt_str_t request_line;
148431Sigor@sysoev.ru nxt_str_t target;
149431Sigor@sysoev.ru nxt_str_t version;
150431Sigor@sysoev.ru nxt_str_t *method;
151431Sigor@sysoev.ru nxt_str_t *path;
152431Sigor@sysoev.ru nxt_str_t *args;
153431Sigor@sysoev.ru
1541991Sz.hong@f5.com nxt_str_t args_decoded;
1551061Sigor@sysoev.ru nxt_array_t *arguments; /* of nxt_http_name_value_t */
1561062Sigor@sysoev.ru nxt_array_t *cookies; /* of nxt_http_name_value_t */
157431Sigor@sysoev.ru nxt_list_t *fields;
158431Sigor@sysoev.ru nxt_http_field_t *content_type;
159431Sigor@sysoev.ru nxt_http_field_t *content_length;
160431Sigor@sysoev.ru nxt_http_field_t *cookie;
161630Svbart@nginx.com nxt_http_field_t *referer;
162630Svbart@nginx.com nxt_http_field_t *user_agent;
1631733Svbart@nginx.com nxt_http_field_t *authorization;
164431Sigor@sysoev.ru nxt_off_t content_length_n;
165431Sigor@sysoev.ru
166431Sigor@sysoev.ru nxt_sockaddr_t *remote;
167431Sigor@sysoev.ru nxt_sockaddr_t *local;
1681265Sigor@sysoev.ru nxt_task_t task;
169431Sigor@sysoev.ru
1701007Salexander.borisov@nginx.com nxt_timer_t timer;
1711007Salexander.borisov@nginx.com void *timer_data;
1721007Salexander.borisov@nginx.com
1732246Sz.hong@f5.com nxt_tstr_query_t *tstr_query;
1742247Sz.hong@f5.com nxt_tstr_cache_t tstr_cache;
1751563Svbart@nginx.com
1762511Sz.hong@f5.com nxt_http_action_t *action;
1771131Smax.romanov@nginx.com void *req_rpc_data;
1781131Smax.romanov@nginx.com
1791721Saxel.duch@nginx.com #if (NXT_HAVE_REGEX)
1801721Saxel.duch@nginx.com nxt_regex_match_t *regex_match;
1811721Saxel.duch@nginx.com #endif
1821721Saxel.duch@nginx.com
1831270Sigor@sysoev.ru nxt_http_peer_t *peer;
184608Sigor@sysoev.ru nxt_buf_t *last;
185608Sigor@sysoev.ru
1861561Smax.romanov@nginx.com nxt_queue_link_t app_link; /* nxt_app_t.ack_waiting_req */
1871561Smax.romanov@nginx.com nxt_event_engine_t *engine;
1881561Smax.romanov@nginx.com nxt_work_t err_work;
1891561Smax.romanov@nginx.com
190431Sigor@sysoev.ru nxt_http_response_t resp;
191431Sigor@sysoev.ru
192431Sigor@sysoev.ru nxt_http_status_t status:16;
193431Sigor@sysoev.ru
1942381Salx@nginx.com uint8_t log_route; /* 1 bit */
1952381Salx@nginx.com
196964Sigor@sysoev.ru uint8_t pass_count; /* 8 bits */
1971473Svbart@nginx.com uint8_t app_target;
1981112Sigor@sysoev.ru nxt_http_protocol_t protocol:8; /* 2 bits */
1992133Sz.hong@f5.com uint8_t tls; /* 1 bit */
200431Sigor@sysoev.ru uint8_t logged; /* 1 bit */
201431Sigor@sysoev.ru uint8_t header_sent; /* 1 bit */
2021271Sigor@sysoev.ru uint8_t inconsistent; /* 1 bit */
203608Sigor@sysoev.ru uint8_t error; /* 1 bit */
2041131Smax.romanov@nginx.com uint8_t websocket_handshake; /* 1 bit */
205431Sigor@sysoev.ru };
206431Sigor@sysoev.ru
207431Sigor@sysoev.ru
2082104Sz.hong@f5.com typedef struct {
2092104Sz.hong@f5.com uint16_t hash;
2102104Sz.hong@f5.com uint16_t name_length;
2112104Sz.hong@f5.com uint32_t value_length;
2122104Sz.hong@f5.com u_char *name;
2132104Sz.hong@f5.com u_char *value;
2142104Sz.hong@f5.com } nxt_http_name_value_t;
2152104Sz.hong@f5.com
2162104Sz.hong@f5.com
2172123Sz.hong@f5.com typedef enum {
2182123Sz.hong@f5.com NXT_HTTP_URI_ENCODING_NONE = 0,
2192123Sz.hong@f5.com NXT_HTTP_URI_ENCODING,
2202123Sz.hong@f5.com NXT_HTTP_URI_ENCODING_PLUS
2212123Sz.hong@f5.com } nxt_http_uri_encoding_t;
2222123Sz.hong@f5.com
2232123Sz.hong@f5.com
2241936So.canty@f5.com typedef struct nxt_http_route_s nxt_http_route_t;
2251936So.canty@f5.com typedef struct nxt_http_route_rule_s nxt_http_route_rule_t;
2261936So.canty@f5.com typedef struct nxt_http_route_addr_rule_s nxt_http_route_addr_rule_t;
227964Sigor@sysoev.ru
228964Sigor@sysoev.ru
2291903Sz.hong@f5.com typedef struct {
2302448Sz.hong@f5.com nxt_conf_value_t *rewrite;
231*2512Sz.hong@f5.com nxt_conf_value_t *set_headers;
2321903Sz.hong@f5.com nxt_conf_value_t *pass;
2331903Sz.hong@f5.com nxt_conf_value_t *ret;
2342098Salx.manpages@gmail.com nxt_conf_value_t *location;
2351903Sz.hong@f5.com nxt_conf_value_t *proxy;
2361903Sz.hong@f5.com nxt_conf_value_t *share;
2372108Salx.manpages@gmail.com nxt_conf_value_t *index;
2381903Sz.hong@f5.com nxt_str_t chroot;
2391903Sz.hong@f5.com nxt_conf_value_t *follow_symlinks;
2401903Sz.hong@f5.com nxt_conf_value_t *traverse_mounts;
2411903Sz.hong@f5.com nxt_conf_value_t *types;
2421903Sz.hong@f5.com nxt_conf_value_t *fallback;
2431903Sz.hong@f5.com } nxt_http_action_conf_t;
2441903Sz.hong@f5.com
2451903Sz.hong@f5.com
2461264Sigor@sysoev.ru struct nxt_http_action_s {
2471264Sigor@sysoev.ru nxt_http_action_t *(*handler)(nxt_task_t *task,
248964Sigor@sysoev.ru nxt_http_request_t *r,
2491264Sigor@sysoev.ru nxt_http_action_t *action);
250964Sigor@sysoev.ru union {
2511903Sz.hong@f5.com void *conf;
252964Sigor@sysoev.ru nxt_http_route_t *route;
2531394Sigor@sysoev.ru nxt_upstream_t *upstream;
2541394Sigor@sysoev.ru uint32_t upstream_number;
2552246Sz.hong@f5.com nxt_tstr_t *tstr;
2561954Sz.hong@f5.com nxt_str_t *pass;
257964Sigor@sysoev.ru } u;
258964Sigor@sysoev.ru
2592448Sz.hong@f5.com nxt_tstr_t *rewrite;
260*2512Sz.hong@f5.com nxt_array_t *set_headers; /* of nxt_http_field_t */
2611923Sz.hong@f5.com nxt_http_action_t *fallback;
262964Sigor@sysoev.ru };
263964Sigor@sysoev.ru
264964Sigor@sysoev.ru
2651112Sigor@sysoev.ru typedef struct {
2661112Sigor@sysoev.ru void (*body_read)(nxt_task_t *task, nxt_http_request_t *r);
2671112Sigor@sysoev.ru void (*local_addr)(nxt_task_t *task, nxt_http_request_t *r);
2681148Sigor@sysoev.ru void (*header_send)(nxt_task_t *task, nxt_http_request_t *r,
2692078Salx.manpages@gmail.com nxt_work_handler_t body_handler, void *data);
2701112Sigor@sysoev.ru void (*send)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *out);
2711112Sigor@sysoev.ru nxt_off_t (*body_bytes_sent)(nxt_task_t *task, nxt_http_proto_t proto);
2721112Sigor@sysoev.ru void (*discard)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *last);
2731112Sigor@sysoev.ru void (*close)(nxt_task_t *task, nxt_http_proto_t proto,
2741112Sigor@sysoev.ru nxt_socket_conf_joint_t *joint);
2751270Sigor@sysoev.ru
2761270Sigor@sysoev.ru void (*peer_connect)(nxt_task_t *task, nxt_http_peer_t *peer);
2771270Sigor@sysoev.ru void (*peer_header_send)(nxt_task_t *task, nxt_http_peer_t *peer);
2781270Sigor@sysoev.ru void (*peer_header_read)(nxt_task_t *task, nxt_http_peer_t *peer);
2791270Sigor@sysoev.ru void (*peer_read)(nxt_task_t *task, nxt_http_peer_t *peer);
2801270Sigor@sysoev.ru void (*peer_close)(nxt_task_t *task, nxt_http_peer_t *peer);
2811270Sigor@sysoev.ru
2821131Smax.romanov@nginx.com void (*ws_frame_start)(nxt_task_t *task, nxt_http_request_t *r,
2831131Smax.romanov@nginx.com nxt_buf_t *ws_frame);
2841112Sigor@sysoev.ru } nxt_http_proto_table_t;
285431Sigor@sysoev.ru
286431Sigor@sysoev.ru
2872132Sz.hong@f5.com typedef struct {
2881936So.canty@f5.com nxt_str_t *header;
2891936So.canty@f5.com uint32_t header_hash;
2902132Sz.hong@f5.com } nxt_http_forward_header_t;
2912132Sz.hong@f5.com
2922132Sz.hong@f5.com
2932132Sz.hong@f5.com struct nxt_http_forward_s {
2942132Sz.hong@f5.com nxt_http_forward_header_t client_ip;
2952133Sz.hong@f5.com nxt_http_forward_header_t protocol;
2962132Sz.hong@f5.com nxt_http_route_addr_rule_t *source;
2971936So.canty@f5.com uint8_t recursive; /* 1 bit */
2981936So.canty@f5.com };
2991936So.canty@f5.com
3001936So.canty@f5.com
3011183Svbart@nginx.com #define NXT_HTTP_DATE_LEN nxt_length("Wed, 31 Dec 1986 16:40:00 GMT")
3021183Svbart@nginx.com
3031183Svbart@nginx.com nxt_inline u_char *
nxt_http_date(u_char * buf,struct tm * tm)3041183Svbart@nginx.com nxt_http_date(u_char *buf, struct tm *tm)
3051183Svbart@nginx.com {
3061183Svbart@nginx.com static const char *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri",
3071183Svbart@nginx.com "Sat" };
3081183Svbart@nginx.com
3091183Svbart@nginx.com static const char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
3101183Svbart@nginx.com "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
3111183Svbart@nginx.com
3121183Svbart@nginx.com return nxt_sprintf(buf, buf + NXT_HTTP_DATE_LEN,
3131183Svbart@nginx.com "%s, %02d %s %4d %02d:%02d:%02d GMT",
3141183Svbart@nginx.com week[tm->tm_wday], tm->tm_mday,
3151183Svbart@nginx.com month[tm->tm_mon], tm->tm_year + 1900,
3161183Svbart@nginx.com tm->tm_hour, tm->tm_min, tm->tm_sec);
3171183Svbart@nginx.com }
3181183Svbart@nginx.com
3191183Svbart@nginx.com
3201459Smax.romanov@nginx.com nxt_int_t nxt_http_init(nxt_task_t *task);
3211459Smax.romanov@nginx.com nxt_int_t nxt_h1p_init(nxt_task_t *task);
3221459Smax.romanov@nginx.com nxt_int_t nxt_http_response_hash_init(nxt_task_t *task);
323431Sigor@sysoev.ru
324431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data);
325431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task);
326431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r,
327431Sigor@sysoev.ru nxt_http_status_t status);
328431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r);
3291148Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r,
3301270Sigor@sysoev.ru nxt_work_handler_t body_handler, void *data);
3311131Smax.romanov@nginx.com void nxt_http_request_ws_frame_start(nxt_task_t *task, nxt_http_request_t *r,
3321131Smax.romanov@nginx.com nxt_buf_t *ws_frame);
333431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r,
334431Sigor@sysoev.ru nxt_buf_t *out);
335608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r,
336608Sigor@sysoev.ru size_t size);
337608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r);
338608Sigor@sysoev.ru void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data);
3391131Smax.romanov@nginx.com void nxt_http_request_close_handler(nxt_task_t *task, void *obj, void *data);
340431Sigor@sysoev.ru
341431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field,
342431Sigor@sysoev.ru uintptr_t data);
343431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field,
344431Sigor@sysoev.ru uintptr_t offset);
345431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field,
346431Sigor@sysoev.ru uintptr_t data);
347431Sigor@sysoev.ru
3482104Sz.hong@f5.com nxt_array_t *nxt_http_arguments_parse(nxt_http_request_t *r);
3492104Sz.hong@f5.com nxt_array_t *nxt_http_cookies_parse(nxt_http_request_t *r);
3502104Sz.hong@f5.com
3512123Sz.hong@f5.com int64_t nxt_http_field_hash(nxt_mp_t *mp, nxt_str_t *name,
3522123Sz.hong@f5.com nxt_bool_t case_sensitive, uint8_t encoding);
3532147Sz.hong@f5.com int64_t nxt_http_argument_hash(nxt_mp_t *mp, nxt_str_t *name);
3542147Sz.hong@f5.com int64_t nxt_http_header_hash(nxt_mp_t *mp, nxt_str_t *name);
3552147Sz.hong@f5.com int64_t nxt_http_cookie_hash(nxt_mp_t *mp, nxt_str_t *name);
3562123Sz.hong@f5.com
357964Sigor@sysoev.ru nxt_http_routes_t *nxt_http_routes_create(nxt_task_t *task,
358964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *routes_conf);
3591264Sigor@sysoev.ru nxt_http_action_t *nxt_http_action_create(nxt_task_t *task,
3601954Sz.hong@f5.com nxt_router_temp_conf_t *tmcf, nxt_str_t *pass);
3611472Svbart@nginx.com nxt_int_t nxt_http_routes_resolve(nxt_task_t *task,
3621472Svbart@nginx.com nxt_router_temp_conf_t *tmcf);
3631472Svbart@nginx.com nxt_int_t nxt_http_pass_segments(nxt_mp_t *mp, nxt_str_t *pass,
3641472Svbart@nginx.com nxt_str_t *segments, nxt_uint_t n);
3651264Sigor@sysoev.ru nxt_http_action_t *nxt_http_pass_application(nxt_task_t *task,
3661563Svbart@nginx.com nxt_router_conf_t *rtcf, nxt_str_t *name);
3671936So.canty@f5.com nxt_http_route_addr_rule_t *nxt_http_route_addr_rule_create(
3681936So.canty@f5.com nxt_task_t *task, nxt_mp_t *mp, nxt_conf_value_t *cv);
3691936So.canty@f5.com nxt_int_t nxt_http_route_addr_rule(nxt_http_request_t *r,
3701936So.canty@f5.com nxt_http_route_addr_rule_t *addr_rule, nxt_sockaddr_t *sockaddr);
3711923Sz.hong@f5.com nxt_http_route_rule_t *nxt_http_route_types_rule_create(nxt_task_t *task,
3721923Sz.hong@f5.com nxt_mp_t *mp, nxt_conf_value_t *types);
3731859So.canty@f5.com nxt_int_t nxt_http_route_test_rule(nxt_http_request_t *r,
3741859So.canty@f5.com nxt_http_route_rule_t *rule, u_char *start, size_t length);
375964Sigor@sysoev.ru
3761923Sz.hong@f5.com nxt_int_t nxt_http_action_init(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
3771923Sz.hong@f5.com nxt_conf_value_t *cv, nxt_http_action_t *action);
3781923Sz.hong@f5.com void nxt_http_request_action(nxt_task_t *task, nxt_http_request_t *r,
3791923Sz.hong@f5.com nxt_http_action_t *action);
3801923Sz.hong@f5.com
3811394Sigor@sysoev.ru nxt_int_t nxt_upstreams_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
3821394Sigor@sysoev.ru nxt_conf_value_t *conf);
3831394Sigor@sysoev.ru nxt_int_t nxt_upstreams_joint_create(nxt_router_temp_conf_t *tmcf,
3841394Sigor@sysoev.ru nxt_upstream_t ***upstream_joint);
3851394Sigor@sysoev.ru
3862448Sz.hong@f5.com nxt_int_t nxt_http_rewrite_init(nxt_router_conf_t *rtcf,
3872448Sz.hong@f5.com nxt_http_action_t *action, nxt_http_action_conf_t *acf);
3882511Sz.hong@f5.com nxt_int_t nxt_http_rewrite(nxt_task_t *task, nxt_http_request_t *r);
3892448Sz.hong@f5.com
390*2512Sz.hong@f5.com nxt_int_t nxt_http_set_headers_init(nxt_router_conf_t *rtcf,
391*2512Sz.hong@f5.com nxt_http_action_t *action, nxt_http_action_conf_t *acf);
392*2512Sz.hong@f5.com nxt_int_t nxt_http_set_headers(nxt_http_request_t *r);
393*2512Sz.hong@f5.com
3942147Sz.hong@f5.com nxt_int_t nxt_http_return_init(nxt_router_conf_t *rtcf,
3952147Sz.hong@f5.com nxt_http_action_t *action, nxt_http_action_conf_t *acf);
3961429Svbart@nginx.com
3971923Sz.hong@f5.com nxt_int_t nxt_http_static_init(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
3981923Sz.hong@f5.com nxt_http_action_t *action, nxt_http_action_conf_t *acf);
3991183Svbart@nginx.com nxt_int_t nxt_http_static_mtypes_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash);
4001183Svbart@nginx.com nxt_int_t nxt_http_static_mtypes_hash_add(nxt_mp_t *mp, nxt_lvlhsh_t *hash,
4012139Sandrew@digital-domain.net const nxt_str_t *exten, nxt_str_t *type);
4022139Sandrew@digital-domain.net nxt_str_t *nxt_http_static_mtype_get(nxt_lvlhsh_t *hash,
4032139Sandrew@digital-domain.net const nxt_str_t *exten);
4041183Svbart@nginx.com
4051264Sigor@sysoev.ru nxt_http_action_t *nxt_http_application_handler(nxt_task_t *task,
4061264Sigor@sysoev.ru nxt_http_request_t *r, nxt_http_action_t *action);
4071563Svbart@nginx.com nxt_int_t nxt_upstream_find(nxt_upstreams_t *upstreams, nxt_str_t *name,
4081394Sigor@sysoev.ru nxt_http_action_t *action);
4091394Sigor@sysoev.ru nxt_http_action_t *nxt_upstream_proxy_handler(nxt_task_t *task,
4101394Sigor@sysoev.ru nxt_http_request_t *r, nxt_upstream_t *upstream);
4111394Sigor@sysoev.ru
4121924Sz.hong@f5.com nxt_int_t nxt_http_proxy_init(nxt_mp_t *mp, nxt_http_action_t *action,
4131924Sz.hong@f5.com nxt_http_action_conf_t *acf);
4141270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_date(void *ctx, nxt_http_field_t *field,
4151270Sigor@sysoev.ru uintptr_t data);
4161270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_content_length(void *ctx, nxt_http_field_t *field,
4171270Sigor@sysoev.ru uintptr_t data);
4181270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_skip(void *ctx, nxt_http_field_t *field,
4191270Sigor@sysoev.ru uintptr_t data);
4201270Sigor@sysoev.ru nxt_buf_t *nxt_http_proxy_buf_mem_alloc(nxt_task_t *task, nxt_http_request_t *r,
4211270Sigor@sysoev.ru size_t size);
4221270Sigor@sysoev.ru void nxt_http_proxy_buf_mem_free(nxt_task_t *task, nxt_http_request_t *r,
4231270Sigor@sysoev.ru nxt_buf_t *b);
4241270Sigor@sysoev.ru
425740Sigor@sysoev.ru extern nxt_time_string_t nxt_http_date_cache;
426740Sigor@sysoev.ru
427431Sigor@sysoev.ru extern nxt_lvlhsh_t nxt_response_fields_hash;
428431Sigor@sysoev.ru
4291112Sigor@sysoev.ru extern const nxt_http_proto_table_t nxt_http_proto[];
430431Sigor@sysoev.ru
4311131Smax.romanov@nginx.com void nxt_h1p_websocket_first_frame_start(nxt_task_t *task,
4321131Smax.romanov@nginx.com nxt_http_request_t *r, nxt_buf_t *ws_frame);
4331131Smax.romanov@nginx.com void nxt_h1p_websocket_frame_start(nxt_task_t *task, nxt_http_request_t *r,
4341131Smax.romanov@nginx.com nxt_buf_t *ws_frame);
4351417Smax.romanov@nginx.com void nxt_h1p_complete_buffers(nxt_task_t *task, nxt_h1proto_t *h1p,
4361417Smax.romanov@nginx.com nxt_bool_t all);
4371131Smax.romanov@nginx.com nxt_msec_t nxt_h1p_conn_request_timer_value(nxt_conn_t *c, uintptr_t data);
4381131Smax.romanov@nginx.com
4391131Smax.romanov@nginx.com extern const nxt_conn_state_t nxt_h1p_idle_close_state;
440431Sigor@sysoev.ru
441431Sigor@sysoev.ru #endif /* _NXT_HTTP_H_INCLUDED_ */
442