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 { \ 93703Svbart@nginx.com (_field)->name_length = nxt_length(_name); \ 94431Sigor@sysoev.ru (_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 { \ 100703Svbart@nginx.com (_field)->name_length = nxt_length(_name); \ 101703Svbart@nginx.com (_field)->value_length = nxt_length(_value); \ 102431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 103431Sigor@sysoev.ru (_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 143964Sigor@sysoev.ru nxt_str_t host; 1441007Salexander.borisov@nginx.com nxt_str_t server_name; 145431Sigor@sysoev.ru nxt_str_t target; 146431Sigor@sysoev.ru nxt_str_t version; 147431Sigor@sysoev.ru nxt_str_t *method; 148431Sigor@sysoev.ru nxt_str_t *path; 149431Sigor@sysoev.ru nxt_str_t *args; 150431Sigor@sysoev.ru 1511061Sigor@sysoev.ru nxt_array_t *arguments; /* of nxt_http_name_value_t */ 1521062Sigor@sysoev.ru nxt_array_t *cookies; /* of nxt_http_name_value_t */ 153431Sigor@sysoev.ru nxt_list_t *fields; 154431Sigor@sysoev.ru nxt_http_field_t *content_type; 155431Sigor@sysoev.ru nxt_http_field_t *content_length; 156431Sigor@sysoev.ru nxt_http_field_t *cookie; 157630Svbart@nginx.com nxt_http_field_t *referer; 158630Svbart@nginx.com nxt_http_field_t *user_agent; 1591733Svbart@nginx.com nxt_http_field_t *authorization; 160431Sigor@sysoev.ru nxt_off_t content_length_n; 161431Sigor@sysoev.ru 162431Sigor@sysoev.ru nxt_sockaddr_t *remote; 163431Sigor@sysoev.ru nxt_sockaddr_t *local; 1641011Smax.romanov@nginx.com void *tls; 1651265Sigor@sysoev.ru nxt_task_t task; 166431Sigor@sysoev.ru 1671007Salexander.borisov@nginx.com nxt_timer_t timer; 1681007Salexander.borisov@nginx.com void *timer_data; 1691007Salexander.borisov@nginx.com 1701563Svbart@nginx.com nxt_var_query_t *var_query; 1711563Svbart@nginx.com 1721131Smax.romanov@nginx.com void *req_rpc_data; 1731131Smax.romanov@nginx.com 1741721Saxel.duch@nginx.com #if (NXT_HAVE_REGEX) 1751721Saxel.duch@nginx.com nxt_regex_match_t *regex_match; 1761721Saxel.duch@nginx.com #endif 1771721Saxel.duch@nginx.com 1781270Sigor@sysoev.ru nxt_http_peer_t *peer; 179608Sigor@sysoev.ru nxt_buf_t *last; 180608Sigor@sysoev.ru 1811561Smax.romanov@nginx.com nxt_queue_link_t app_link; /* nxt_app_t.ack_waiting_req */ 1821561Smax.romanov@nginx.com nxt_event_engine_t *engine; 1831561Smax.romanov@nginx.com nxt_work_t err_work; 1841561Smax.romanov@nginx.com 185431Sigor@sysoev.ru nxt_http_response_t resp; 186431Sigor@sysoev.ru 187431Sigor@sysoev.ru nxt_http_status_t status:16; 188431Sigor@sysoev.ru 189964Sigor@sysoev.ru uint8_t pass_count; /* 8 bits */ 1901473Svbart@nginx.com uint8_t app_target; 1911112Sigor@sysoev.ru nxt_http_protocol_t protocol:8; /* 2 bits */ 192431Sigor@sysoev.ru uint8_t logged; /* 1 bit */ 193431Sigor@sysoev.ru uint8_t header_sent; /* 1 bit */ 1941271Sigor@sysoev.ru uint8_t inconsistent; /* 1 bit */ 195608Sigor@sysoev.ru uint8_t error; /* 1 bit */ 1961131Smax.romanov@nginx.com uint8_t websocket_handshake; /* 1 bit */ 197431Sigor@sysoev.ru }; 198431Sigor@sysoev.ru 199431Sigor@sysoev.ru 2001859So.canty@f5.com typedef struct nxt_http_route_s nxt_http_route_t; 2011859So.canty@f5.com typedef struct nxt_http_route_rule_s nxt_http_route_rule_t; 202964Sigor@sysoev.ru 203964Sigor@sysoev.ru 204*1903Sz.hong@f5.com typedef struct { 205*1903Sz.hong@f5.com nxt_conf_value_t *pass; 206*1903Sz.hong@f5.com nxt_conf_value_t *ret; 207*1903Sz.hong@f5.com nxt_str_t location; 208*1903Sz.hong@f5.com nxt_conf_value_t *proxy; 209*1903Sz.hong@f5.com nxt_conf_value_t *share; 210*1903Sz.hong@f5.com nxt_str_t chroot; 211*1903Sz.hong@f5.com nxt_conf_value_t *follow_symlinks; 212*1903Sz.hong@f5.com nxt_conf_value_t *traverse_mounts; 213*1903Sz.hong@f5.com nxt_conf_value_t *types; 214*1903Sz.hong@f5.com nxt_conf_value_t *fallback; 215*1903Sz.hong@f5.com } nxt_http_action_conf_t; 216*1903Sz.hong@f5.com 217*1903Sz.hong@f5.com 2181264Sigor@sysoev.ru struct nxt_http_action_s { 2191264Sigor@sysoev.ru nxt_http_action_t *(*handler)(nxt_task_t *task, 220964Sigor@sysoev.ru nxt_http_request_t *r, 2211264Sigor@sysoev.ru nxt_http_action_t *action); 222964Sigor@sysoev.ru union { 223*1903Sz.hong@f5.com void *conf; 224964Sigor@sysoev.ru nxt_http_route_t *route; 2251394Sigor@sysoev.ru nxt_upstream_t *upstream; 2261394Sigor@sysoev.ru uint32_t upstream_number; 2271563Svbart@nginx.com nxt_var_t *var; 2281854Sz.hong@f5.com 2291854Sz.hong@f5.com struct { 2301854Sz.hong@f5.com nxt_app_t *application; 2311854Sz.hong@f5.com nxt_int_t target; 2321854Sz.hong@f5.com } app; 2331854Sz.hong@f5.com 2341854Sz.hong@f5.com struct { 2351855Sz.hong@f5.com nxt_str_t chroot; 2361855Sz.hong@f5.com nxt_uint_t resolve; 2371859So.canty@f5.com nxt_http_route_rule_t *types; 2381854Sz.hong@f5.com nxt_http_action_t *fallback; 2391854Sz.hong@f5.com } share; 240964Sigor@sysoev.ru } u; 241964Sigor@sysoev.ru 242964Sigor@sysoev.ru nxt_str_t name; 243964Sigor@sysoev.ru }; 244964Sigor@sysoev.ru 245964Sigor@sysoev.ru 2461112Sigor@sysoev.ru typedef struct { 2471112Sigor@sysoev.ru void (*body_read)(nxt_task_t *task, nxt_http_request_t *r); 2481112Sigor@sysoev.ru void (*local_addr)(nxt_task_t *task, nxt_http_request_t *r); 2491148Sigor@sysoev.ru void (*header_send)(nxt_task_t *task, nxt_http_request_t *r, 2501270Sigor@sysoev.ru nxt_work_handler_t body_handler, void *data); 2511112Sigor@sysoev.ru void (*send)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *out); 2521112Sigor@sysoev.ru nxt_off_t (*body_bytes_sent)(nxt_task_t *task, nxt_http_proto_t proto); 2531112Sigor@sysoev.ru void (*discard)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *last); 2541112Sigor@sysoev.ru void (*close)(nxt_task_t *task, nxt_http_proto_t proto, 2551112Sigor@sysoev.ru nxt_socket_conf_joint_t *joint); 2561270Sigor@sysoev.ru 2571270Sigor@sysoev.ru void (*peer_connect)(nxt_task_t *task, nxt_http_peer_t *peer); 2581270Sigor@sysoev.ru void (*peer_header_send)(nxt_task_t *task, nxt_http_peer_t *peer); 2591270Sigor@sysoev.ru void (*peer_header_read)(nxt_task_t *task, nxt_http_peer_t *peer); 2601270Sigor@sysoev.ru void (*peer_read)(nxt_task_t *task, nxt_http_peer_t *peer); 2611270Sigor@sysoev.ru void (*peer_close)(nxt_task_t *task, nxt_http_peer_t *peer); 2621270Sigor@sysoev.ru 2631131Smax.romanov@nginx.com void (*ws_frame_start)(nxt_task_t *task, nxt_http_request_t *r, 2641131Smax.romanov@nginx.com nxt_buf_t *ws_frame); 2651112Sigor@sysoev.ru } nxt_http_proto_table_t; 266431Sigor@sysoev.ru 267431Sigor@sysoev.ru 2681183Svbart@nginx.com #define NXT_HTTP_DATE_LEN nxt_length("Wed, 31 Dec 1986 16:40:00 GMT") 2691183Svbart@nginx.com 2701183Svbart@nginx.com nxt_inline u_char * 2711183Svbart@nginx.com nxt_http_date(u_char *buf, struct tm *tm) 2721183Svbart@nginx.com { 2731183Svbart@nginx.com static const char *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", 2741183Svbart@nginx.com "Sat" }; 2751183Svbart@nginx.com 2761183Svbart@nginx.com static const char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", 2771183Svbart@nginx.com "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; 2781183Svbart@nginx.com 2791183Svbart@nginx.com return nxt_sprintf(buf, buf + NXT_HTTP_DATE_LEN, 2801183Svbart@nginx.com "%s, %02d %s %4d %02d:%02d:%02d GMT", 2811183Svbart@nginx.com week[tm->tm_wday], tm->tm_mday, 2821183Svbart@nginx.com month[tm->tm_mon], tm->tm_year + 1900, 2831183Svbart@nginx.com tm->tm_hour, tm->tm_min, tm->tm_sec); 2841183Svbart@nginx.com } 2851183Svbart@nginx.com 2861183Svbart@nginx.com 2871459Smax.romanov@nginx.com nxt_int_t nxt_http_init(nxt_task_t *task); 2881459Smax.romanov@nginx.com nxt_int_t nxt_h1p_init(nxt_task_t *task); 2891459Smax.romanov@nginx.com nxt_int_t nxt_http_response_hash_init(nxt_task_t *task); 290431Sigor@sysoev.ru 291431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data); 292431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task); 293431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r, 294431Sigor@sysoev.ru nxt_http_status_t status); 295431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r); 2961148Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r, 2971270Sigor@sysoev.ru nxt_work_handler_t body_handler, void *data); 2981131Smax.romanov@nginx.com void nxt_http_request_ws_frame_start(nxt_task_t *task, nxt_http_request_t *r, 2991131Smax.romanov@nginx.com nxt_buf_t *ws_frame); 300431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r, 301431Sigor@sysoev.ru nxt_buf_t *out); 302608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r, 303608Sigor@sysoev.ru size_t size); 304608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r); 305608Sigor@sysoev.ru void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data); 3061131Smax.romanov@nginx.com void nxt_http_request_close_handler(nxt_task_t *task, void *obj, void *data); 307431Sigor@sysoev.ru 308431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field, 309431Sigor@sysoev.ru uintptr_t data); 310431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field, 311431Sigor@sysoev.ru uintptr_t offset); 312431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field, 313431Sigor@sysoev.ru uintptr_t data); 314431Sigor@sysoev.ru 315964Sigor@sysoev.ru nxt_http_routes_t *nxt_http_routes_create(nxt_task_t *task, 316964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *routes_conf); 3171264Sigor@sysoev.ru nxt_http_action_t *nxt_http_action_create(nxt_task_t *task, 318964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_str_t *name); 3191472Svbart@nginx.com nxt_int_t nxt_http_routes_resolve(nxt_task_t *task, 3201472Svbart@nginx.com nxt_router_temp_conf_t *tmcf); 3211472Svbart@nginx.com nxt_int_t nxt_http_pass_segments(nxt_mp_t *mp, nxt_str_t *pass, 3221472Svbart@nginx.com nxt_str_t *segments, nxt_uint_t n); 3231264Sigor@sysoev.ru nxt_http_action_t *nxt_http_pass_application(nxt_task_t *task, 3241563Svbart@nginx.com nxt_router_conf_t *rtcf, nxt_str_t *name); 3251859So.canty@f5.com nxt_int_t nxt_http_route_test_rule(nxt_http_request_t *r, 3261859So.canty@f5.com nxt_http_route_rule_t *rule, u_char *start, size_t length); 327964Sigor@sysoev.ru 3281394Sigor@sysoev.ru nxt_int_t nxt_upstreams_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, 3291394Sigor@sysoev.ru nxt_conf_value_t *conf); 3301394Sigor@sysoev.ru nxt_int_t nxt_upstreams_joint_create(nxt_router_temp_conf_t *tmcf, 3311394Sigor@sysoev.ru nxt_upstream_t ***upstream_joint); 3321394Sigor@sysoev.ru 3331563Svbart@nginx.com void nxt_http_request_action(nxt_task_t *task, nxt_http_request_t *r, 3341563Svbart@nginx.com nxt_http_action_t *action); 3351563Svbart@nginx.com 336*1903Sz.hong@f5.com nxt_int_t nxt_http_return_init(nxt_mp_t *mp, nxt_http_action_t *action, 337*1903Sz.hong@f5.com nxt_http_action_conf_t *acf); 3381429Svbart@nginx.com 3391264Sigor@sysoev.ru nxt_http_action_t *nxt_http_static_handler(nxt_task_t *task, 3401264Sigor@sysoev.ru nxt_http_request_t *r, nxt_http_action_t *action); 3411183Svbart@nginx.com nxt_int_t nxt_http_static_mtypes_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash); 3421183Svbart@nginx.com nxt_int_t nxt_http_static_mtypes_hash_add(nxt_mp_t *mp, nxt_lvlhsh_t *hash, 3431183Svbart@nginx.com nxt_str_t *extension, nxt_str_t *type); 3441183Svbart@nginx.com nxt_str_t *nxt_http_static_mtypes_hash_find(nxt_lvlhsh_t *hash, 3451183Svbart@nginx.com nxt_str_t *extension); 3461183Svbart@nginx.com 3471264Sigor@sysoev.ru nxt_http_action_t *nxt_http_application_handler(nxt_task_t *task, 3481264Sigor@sysoev.ru nxt_http_request_t *r, nxt_http_action_t *action); 3491563Svbart@nginx.com nxt_int_t nxt_upstream_find(nxt_upstreams_t *upstreams, nxt_str_t *name, 3501394Sigor@sysoev.ru nxt_http_action_t *action); 3511394Sigor@sysoev.ru nxt_http_action_t *nxt_upstream_proxy_handler(nxt_task_t *task, 3521394Sigor@sysoev.ru nxt_http_request_t *r, nxt_upstream_t *upstream); 3531394Sigor@sysoev.ru 354431Sigor@sysoev.ru 3551270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_create(nxt_mp_t *mp, nxt_http_action_t *action); 3561270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_date(void *ctx, nxt_http_field_t *field, 3571270Sigor@sysoev.ru uintptr_t data); 3581270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_content_length(void *ctx, nxt_http_field_t *field, 3591270Sigor@sysoev.ru uintptr_t data); 3601270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_skip(void *ctx, nxt_http_field_t *field, 3611270Sigor@sysoev.ru uintptr_t data); 3621270Sigor@sysoev.ru nxt_buf_t *nxt_http_proxy_buf_mem_alloc(nxt_task_t *task, nxt_http_request_t *r, 3631270Sigor@sysoev.ru size_t size); 3641270Sigor@sysoev.ru void nxt_http_proxy_buf_mem_free(nxt_task_t *task, nxt_http_request_t *r, 3651270Sigor@sysoev.ru nxt_buf_t *b); 3661270Sigor@sysoev.ru 367740Sigor@sysoev.ru extern nxt_time_string_t nxt_http_date_cache; 368740Sigor@sysoev.ru 369431Sigor@sysoev.ru extern nxt_lvlhsh_t nxt_response_fields_hash; 370431Sigor@sysoev.ru 3711112Sigor@sysoev.ru extern const nxt_http_proto_table_t nxt_http_proto[]; 372431Sigor@sysoev.ru 3731131Smax.romanov@nginx.com void nxt_h1p_websocket_first_frame_start(nxt_task_t *task, 3741131Smax.romanov@nginx.com nxt_http_request_t *r, nxt_buf_t *ws_frame); 3751131Smax.romanov@nginx.com void nxt_h1p_websocket_frame_start(nxt_task_t *task, nxt_http_request_t *r, 3761131Smax.romanov@nginx.com nxt_buf_t *ws_frame); 3771417Smax.romanov@nginx.com void nxt_h1p_complete_buffers(nxt_task_t *task, nxt_h1proto_t *h1p, 3781417Smax.romanov@nginx.com nxt_bool_t all); 3791131Smax.romanov@nginx.com nxt_msec_t nxt_h1p_conn_request_timer_value(nxt_conn_t *c, uintptr_t data); 3801131Smax.romanov@nginx.com 3811131Smax.romanov@nginx.com extern const nxt_conn_state_t nxt_h1p_idle_close_state; 382431Sigor@sysoev.ru 383431Sigor@sysoev.ru #endif /* _NXT_HTTP_H_INCLUDED_ */ 384