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 2041903Sz.hong@f5.com typedef struct { 2051903Sz.hong@f5.com nxt_conf_value_t *pass; 2061903Sz.hong@f5.com nxt_conf_value_t *ret; 2071903Sz.hong@f5.com nxt_str_t location; 2081903Sz.hong@f5.com nxt_conf_value_t *proxy; 2091903Sz.hong@f5.com nxt_conf_value_t *share; 2101903Sz.hong@f5.com nxt_str_t chroot; 2111903Sz.hong@f5.com nxt_conf_value_t *follow_symlinks; 2121903Sz.hong@f5.com nxt_conf_value_t *traverse_mounts; 2131903Sz.hong@f5.com nxt_conf_value_t *types; 2141903Sz.hong@f5.com nxt_conf_value_t *fallback; 2151903Sz.hong@f5.com } nxt_http_action_conf_t; 2161903Sz.hong@f5.com 2171903Sz.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 { 2231903Sz.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; 233964Sigor@sysoev.ru } u; 234964Sigor@sysoev.ru 235964Sigor@sysoev.ru nxt_str_t name; 2361923Sz.hong@f5.com nxt_http_action_t *fallback; 237964Sigor@sysoev.ru }; 238964Sigor@sysoev.ru 239964Sigor@sysoev.ru 2401112Sigor@sysoev.ru typedef struct { 2411112Sigor@sysoev.ru void (*body_read)(nxt_task_t *task, nxt_http_request_t *r); 2421112Sigor@sysoev.ru void (*local_addr)(nxt_task_t *task, nxt_http_request_t *r); 2431148Sigor@sysoev.ru void (*header_send)(nxt_task_t *task, nxt_http_request_t *r, 2441270Sigor@sysoev.ru nxt_work_handler_t body_handler, void *data); 2451112Sigor@sysoev.ru void (*send)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *out); 2461112Sigor@sysoev.ru nxt_off_t (*body_bytes_sent)(nxt_task_t *task, nxt_http_proto_t proto); 2471112Sigor@sysoev.ru void (*discard)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *last); 2481112Sigor@sysoev.ru void (*close)(nxt_task_t *task, nxt_http_proto_t proto, 2491112Sigor@sysoev.ru nxt_socket_conf_joint_t *joint); 2501270Sigor@sysoev.ru 2511270Sigor@sysoev.ru void (*peer_connect)(nxt_task_t *task, nxt_http_peer_t *peer); 2521270Sigor@sysoev.ru void (*peer_header_send)(nxt_task_t *task, nxt_http_peer_t *peer); 2531270Sigor@sysoev.ru void (*peer_header_read)(nxt_task_t *task, nxt_http_peer_t *peer); 2541270Sigor@sysoev.ru void (*peer_read)(nxt_task_t *task, nxt_http_peer_t *peer); 2551270Sigor@sysoev.ru void (*peer_close)(nxt_task_t *task, nxt_http_peer_t *peer); 2561270Sigor@sysoev.ru 2571131Smax.romanov@nginx.com void (*ws_frame_start)(nxt_task_t *task, nxt_http_request_t *r, 2581131Smax.romanov@nginx.com nxt_buf_t *ws_frame); 2591112Sigor@sysoev.ru } nxt_http_proto_table_t; 260431Sigor@sysoev.ru 261431Sigor@sysoev.ru 2621183Svbart@nginx.com #define NXT_HTTP_DATE_LEN nxt_length("Wed, 31 Dec 1986 16:40:00 GMT") 2631183Svbart@nginx.com 2641183Svbart@nginx.com nxt_inline u_char * 2651183Svbart@nginx.com nxt_http_date(u_char *buf, struct tm *tm) 2661183Svbart@nginx.com { 2671183Svbart@nginx.com static const char *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", 2681183Svbart@nginx.com "Sat" }; 2691183Svbart@nginx.com 2701183Svbart@nginx.com static const char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", 2711183Svbart@nginx.com "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; 2721183Svbart@nginx.com 2731183Svbart@nginx.com return nxt_sprintf(buf, buf + NXT_HTTP_DATE_LEN, 2741183Svbart@nginx.com "%s, %02d %s %4d %02d:%02d:%02d GMT", 2751183Svbart@nginx.com week[tm->tm_wday], tm->tm_mday, 2761183Svbart@nginx.com month[tm->tm_mon], tm->tm_year + 1900, 2771183Svbart@nginx.com tm->tm_hour, tm->tm_min, tm->tm_sec); 2781183Svbart@nginx.com } 2791183Svbart@nginx.com 2801183Svbart@nginx.com 2811459Smax.romanov@nginx.com nxt_int_t nxt_http_init(nxt_task_t *task); 2821459Smax.romanov@nginx.com nxt_int_t nxt_h1p_init(nxt_task_t *task); 2831459Smax.romanov@nginx.com nxt_int_t nxt_http_response_hash_init(nxt_task_t *task); 284431Sigor@sysoev.ru 285431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data); 286431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task); 287431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r, 288431Sigor@sysoev.ru nxt_http_status_t status); 289431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r); 2901148Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r, 2911270Sigor@sysoev.ru nxt_work_handler_t body_handler, void *data); 2921131Smax.romanov@nginx.com void nxt_http_request_ws_frame_start(nxt_task_t *task, nxt_http_request_t *r, 2931131Smax.romanov@nginx.com nxt_buf_t *ws_frame); 294431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r, 295431Sigor@sysoev.ru nxt_buf_t *out); 296608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r, 297608Sigor@sysoev.ru size_t size); 298608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r); 299608Sigor@sysoev.ru void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data); 3001131Smax.romanov@nginx.com void nxt_http_request_close_handler(nxt_task_t *task, void *obj, void *data); 301431Sigor@sysoev.ru 302431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field, 303431Sigor@sysoev.ru uintptr_t data); 304431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field, 305431Sigor@sysoev.ru uintptr_t offset); 306431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field, 307431Sigor@sysoev.ru uintptr_t data); 308431Sigor@sysoev.ru 309964Sigor@sysoev.ru nxt_http_routes_t *nxt_http_routes_create(nxt_task_t *task, 310964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *routes_conf); 3111264Sigor@sysoev.ru nxt_http_action_t *nxt_http_action_create(nxt_task_t *task, 312964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_str_t *name); 3131472Svbart@nginx.com nxt_int_t nxt_http_routes_resolve(nxt_task_t *task, 3141472Svbart@nginx.com nxt_router_temp_conf_t *tmcf); 3151472Svbart@nginx.com nxt_int_t nxt_http_pass_segments(nxt_mp_t *mp, nxt_str_t *pass, 3161472Svbart@nginx.com nxt_str_t *segments, nxt_uint_t n); 3171264Sigor@sysoev.ru nxt_http_action_t *nxt_http_pass_application(nxt_task_t *task, 3181563Svbart@nginx.com nxt_router_conf_t *rtcf, nxt_str_t *name); 3191923Sz.hong@f5.com nxt_http_route_rule_t *nxt_http_route_types_rule_create(nxt_task_t *task, 3201923Sz.hong@f5.com nxt_mp_t *mp, nxt_conf_value_t *types); 3211859So.canty@f5.com nxt_int_t nxt_http_route_test_rule(nxt_http_request_t *r, 3221859So.canty@f5.com nxt_http_route_rule_t *rule, u_char *start, size_t length); 323964Sigor@sysoev.ru 3241923Sz.hong@f5.com nxt_int_t nxt_http_action_init(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, 3251923Sz.hong@f5.com nxt_conf_value_t *cv, nxt_http_action_t *action); 3261923Sz.hong@f5.com void nxt_http_request_action(nxt_task_t *task, nxt_http_request_t *r, 3271923Sz.hong@f5.com nxt_http_action_t *action); 3281923Sz.hong@f5.com 3291394Sigor@sysoev.ru nxt_int_t nxt_upstreams_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, 3301394Sigor@sysoev.ru nxt_conf_value_t *conf); 3311394Sigor@sysoev.ru nxt_int_t nxt_upstreams_joint_create(nxt_router_temp_conf_t *tmcf, 3321394Sigor@sysoev.ru nxt_upstream_t ***upstream_joint); 3331394Sigor@sysoev.ru 3341903Sz.hong@f5.com nxt_int_t nxt_http_return_init(nxt_mp_t *mp, nxt_http_action_t *action, 3351903Sz.hong@f5.com nxt_http_action_conf_t *acf); 3361429Svbart@nginx.com 3371923Sz.hong@f5.com nxt_int_t nxt_http_static_init(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, 3381923Sz.hong@f5.com nxt_http_action_t *action, nxt_http_action_conf_t *acf); 3391183Svbart@nginx.com nxt_int_t nxt_http_static_mtypes_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash); 3401183Svbart@nginx.com nxt_int_t nxt_http_static_mtypes_hash_add(nxt_mp_t *mp, nxt_lvlhsh_t *hash, 3411923Sz.hong@f5.com nxt_str_t *exten, nxt_str_t *type); 3421923Sz.hong@f5.com nxt_str_t *nxt_http_static_mtype_get(nxt_lvlhsh_t *hash, nxt_str_t *exten); 3431183Svbart@nginx.com 3441264Sigor@sysoev.ru nxt_http_action_t *nxt_http_application_handler(nxt_task_t *task, 3451264Sigor@sysoev.ru nxt_http_request_t *r, nxt_http_action_t *action); 3461563Svbart@nginx.com nxt_int_t nxt_upstream_find(nxt_upstreams_t *upstreams, nxt_str_t *name, 3471394Sigor@sysoev.ru nxt_http_action_t *action); 3481394Sigor@sysoev.ru nxt_http_action_t *nxt_upstream_proxy_handler(nxt_task_t *task, 3491394Sigor@sysoev.ru nxt_http_request_t *r, nxt_upstream_t *upstream); 3501394Sigor@sysoev.ru 351*1924Sz.hong@f5.com nxt_int_t nxt_http_proxy_init(nxt_mp_t *mp, nxt_http_action_t *action, 352*1924Sz.hong@f5.com nxt_http_action_conf_t *acf); 3531270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_date(void *ctx, nxt_http_field_t *field, 3541270Sigor@sysoev.ru uintptr_t data); 3551270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_content_length(void *ctx, nxt_http_field_t *field, 3561270Sigor@sysoev.ru uintptr_t data); 3571270Sigor@sysoev.ru nxt_int_t nxt_http_proxy_skip(void *ctx, nxt_http_field_t *field, 3581270Sigor@sysoev.ru uintptr_t data); 3591270Sigor@sysoev.ru nxt_buf_t *nxt_http_proxy_buf_mem_alloc(nxt_task_t *task, nxt_http_request_t *r, 3601270Sigor@sysoev.ru size_t size); 3611270Sigor@sysoev.ru void nxt_http_proxy_buf_mem_free(nxt_task_t *task, nxt_http_request_t *r, 3621270Sigor@sysoev.ru nxt_buf_t *b); 3631270Sigor@sysoev.ru 364740Sigor@sysoev.ru extern nxt_time_string_t nxt_http_date_cache; 365740Sigor@sysoev.ru 366431Sigor@sysoev.ru extern nxt_lvlhsh_t nxt_response_fields_hash; 367431Sigor@sysoev.ru 3681112Sigor@sysoev.ru extern const nxt_http_proto_table_t nxt_http_proto[]; 369431Sigor@sysoev.ru 3701131Smax.romanov@nginx.com void nxt_h1p_websocket_first_frame_start(nxt_task_t *task, 3711131Smax.romanov@nginx.com nxt_http_request_t *r, nxt_buf_t *ws_frame); 3721131Smax.romanov@nginx.com void nxt_h1p_websocket_frame_start(nxt_task_t *task, nxt_http_request_t *r, 3731131Smax.romanov@nginx.com nxt_buf_t *ws_frame); 3741417Smax.romanov@nginx.com void nxt_h1p_complete_buffers(nxt_task_t *task, nxt_h1proto_t *h1p, 3751417Smax.romanov@nginx.com nxt_bool_t all); 3761131Smax.romanov@nginx.com nxt_msec_t nxt_h1p_conn_request_timer_value(nxt_conn_t *c, uintptr_t data); 3771131Smax.romanov@nginx.com 3781131Smax.romanov@nginx.com extern const nxt_conn_state_t nxt_h1p_idle_close_state; 379431Sigor@sysoev.ru 380431Sigor@sysoev.ru #endif /* _NXT_HTTP_H_INCLUDED_ */ 381