1 2/* 3 * Copyright (C) Igor Sysoev 4 * Copyright (C) NGINX, Inc. 5 */ 6 7#ifndef _NXT_HTTP_H_INCLUDED_ 8#define _NXT_HTTP_H_INCLUDED_ 9 10#include <nxt_regex.h> 11 12 13typedef enum { 14 NXT_HTTP_UNSET = -1, 15 NXT_HTTP_INVALID = 0, 16 17 NXT_HTTP_CONTINUE = 100, 18 NXT_HTTP_SWITCHING_PROTOCOLS = 101, 19 20 NXT_HTTP_OK = 200, 21 NXT_HTTP_NO_CONTENT = 204, 22 23 NXT_HTTP_MULTIPLE_CHOICES = 300, 24 NXT_HTTP_MOVED_PERMANENTLY = 301, 25 NXT_HTTP_FOUND = 302, 26 NXT_HTTP_SEE_OTHER = 303, 27 NXT_HTTP_NOT_MODIFIED = 304, 28 NXT_HTTP_TEMPORARY_REDIRECT = 307, 29 NXT_HTTP_PERMANENT_REDIRECT = 308, 30 31 NXT_HTTP_BAD_REQUEST = 400, 32 NXT_HTTP_FORBIDDEN = 403, 33 NXT_HTTP_NOT_FOUND = 404, 34 NXT_HTTP_METHOD_NOT_ALLOWED = 405, 35 NXT_HTTP_REQUEST_TIMEOUT = 408, 36 NXT_HTTP_LENGTH_REQUIRED = 411, 37 NXT_HTTP_PAYLOAD_TOO_LARGE = 413, 38 NXT_HTTP_URI_TOO_LONG = 414, 39 NXT_HTTP_UPGRADE_REQUIRED = 426, 40 NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431, 41 42 NXT_HTTP_TO_HTTPS = 497, 43 44 NXT_HTTP_INTERNAL_SERVER_ERROR = 500, 45 NXT_HTTP_NOT_IMPLEMENTED = 501, 46 NXT_HTTP_BAD_GATEWAY = 502, 47 NXT_HTTP_SERVICE_UNAVAILABLE = 503, 48 NXT_HTTP_GATEWAY_TIMEOUT = 504, 49 NXT_HTTP_VERSION_NOT_SUPPORTED = 505, 50 NXT_HTTP_SERVER_ERROR_MAX = 599, 51 52 NXT_HTTP_STATUS_MAX = 999, 53} nxt_http_status_t; 54 55 56typedef enum { 57 NXT_HTTP_TE_NONE = 0, 58 NXT_HTTP_TE_CHUNKED = 1, 59 NXT_HTTP_TE_UNSUPPORTED = 2, 60} nxt_http_te_t; 61 62 63typedef enum { 64 NXT_HTTP_PROTO_H1 = 0, 65 NXT_HTTP_PROTO_H2, 66 NXT_HTTP_PROTO_DEVNULL, 67} nxt_http_protocol_t; 68 69 70typedef struct { 71 nxt_work_handler_t ready_handler; 72 nxt_work_handler_t error_handler; 73} nxt_http_request_state_t; 74 75 76typedef struct nxt_h1proto_s nxt_h1proto_t; 77 78struct nxt_h1p_websocket_timer_s { 79 nxt_timer_t timer; 80 nxt_h1proto_t *h1p; 81 nxt_msec_t keepalive_interval; 82}; 83 84 85typedef union { 86 void *any; 87 nxt_h1proto_t *h1; 88} nxt_http_proto_t; 89 90 91#define nxt_http_field_name_set(_field, _name) \ 92 do { \ 93 (_field)->name_length = nxt_length(_name); \ 94 (_field)->name = (u_char *) _name; \ 95 } while (0) 96 97 98#define nxt_http_field_set(_field, _name, _value) \ 99 do { \ 100 (_field)->name_length = nxt_length(_name); \ 101 (_field)->value_length = nxt_length(_value); \ 102 (_field)->name = (u_char *) _name; \ 103 (_field)->value = (u_char *) _value; \ 104 } while (0) 105 106 107typedef struct { 108 nxt_list_t *fields; 109 nxt_http_field_t *date; 110 nxt_http_field_t *content_type; 111 nxt_http_field_t *content_length; 112 nxt_off_t content_length_n; 113} nxt_http_response_t; 114 115 116typedef struct nxt_upstream_server_s nxt_upstream_server_t; 117 118typedef struct { 119 nxt_http_proto_t proto; 120 nxt_http_request_t *request; 121 nxt_upstream_server_t *server; 122 nxt_list_t *fields; 123 nxt_buf_t *body; 124 125 nxt_http_status_t status:16; 126 nxt_http_protocol_t protocol:8; /* 2 bits */ 127 uint8_t header_received; /* 1 bit */ 128 uint8_t closed; /* 1 bit */ 129} nxt_http_peer_t; 130 131 132struct nxt_http_request_s { 133 nxt_http_proto_t proto; 134 nxt_socket_conf_joint_t *conf; 135 136 nxt_mp_t *mem_pool; 137 138 nxt_buf_t *body; 139 nxt_buf_t *ws_frame; 140 nxt_buf_t *out; 141 const nxt_http_request_state_t *state; 142 143 nxt_str_t host; 144 nxt_str_t server_name; 145 nxt_str_t target; 146 nxt_str_t version; 147 nxt_str_t *method; 148 nxt_str_t *path; 149 nxt_str_t *args; 150 151 nxt_array_t *arguments; /* of nxt_http_name_value_t */ 152 nxt_array_t *cookies; /* of nxt_http_name_value_t */ 153 nxt_list_t *fields; 154 nxt_http_field_t *content_type; 155 nxt_http_field_t *content_length; 156 nxt_http_field_t *cookie; 157 nxt_http_field_t *referer; 158 nxt_http_field_t *user_agent; 159 nxt_http_field_t *authorization; 160 nxt_off_t content_length_n; 161 162 nxt_sockaddr_t *remote; 163 nxt_sockaddr_t *local; 164 void *tls; 165 nxt_task_t task; 166 167 nxt_timer_t timer; 168 void *timer_data; 169 170 nxt_var_query_t *var_query; 171 172 void *req_rpc_data; 173 174#if (NXT_HAVE_REGEX) 175 nxt_regex_match_t *regex_match; 176#endif 177 178 nxt_http_peer_t *peer; 179 nxt_buf_t *last; 180 181 nxt_queue_link_t app_link; /* nxt_app_t.ack_waiting_req */ 182 nxt_event_engine_t *engine; 183 nxt_work_t err_work; 184 185 nxt_http_response_t resp; 186 187 nxt_http_status_t status:16; 188 189 uint8_t pass_count; /* 8 bits */ 190 uint8_t app_target; 191 nxt_http_protocol_t protocol:8; /* 2 bits */ 192 uint8_t logged; /* 1 bit */ 193 uint8_t header_sent; /* 1 bit */ 194 uint8_t inconsistent; /* 1 bit */ 195 uint8_t error; /* 1 bit */ 196 uint8_t websocket_handshake; /* 1 bit */ 197}; 198 199
| 1 2/* 3 * Copyright (C) Igor Sysoev 4 * Copyright (C) NGINX, Inc. 5 */ 6 7#ifndef _NXT_HTTP_H_INCLUDED_ 8#define _NXT_HTTP_H_INCLUDED_ 9 10#include <nxt_regex.h> 11 12 13typedef enum { 14 NXT_HTTP_UNSET = -1, 15 NXT_HTTP_INVALID = 0, 16 17 NXT_HTTP_CONTINUE = 100, 18 NXT_HTTP_SWITCHING_PROTOCOLS = 101, 19 20 NXT_HTTP_OK = 200, 21 NXT_HTTP_NO_CONTENT = 204, 22 23 NXT_HTTP_MULTIPLE_CHOICES = 300, 24 NXT_HTTP_MOVED_PERMANENTLY = 301, 25 NXT_HTTP_FOUND = 302, 26 NXT_HTTP_SEE_OTHER = 303, 27 NXT_HTTP_NOT_MODIFIED = 304, 28 NXT_HTTP_TEMPORARY_REDIRECT = 307, 29 NXT_HTTP_PERMANENT_REDIRECT = 308, 30 31 NXT_HTTP_BAD_REQUEST = 400, 32 NXT_HTTP_FORBIDDEN = 403, 33 NXT_HTTP_NOT_FOUND = 404, 34 NXT_HTTP_METHOD_NOT_ALLOWED = 405, 35 NXT_HTTP_REQUEST_TIMEOUT = 408, 36 NXT_HTTP_LENGTH_REQUIRED = 411, 37 NXT_HTTP_PAYLOAD_TOO_LARGE = 413, 38 NXT_HTTP_URI_TOO_LONG = 414, 39 NXT_HTTP_UPGRADE_REQUIRED = 426, 40 NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431, 41 42 NXT_HTTP_TO_HTTPS = 497, 43 44 NXT_HTTP_INTERNAL_SERVER_ERROR = 500, 45 NXT_HTTP_NOT_IMPLEMENTED = 501, 46 NXT_HTTP_BAD_GATEWAY = 502, 47 NXT_HTTP_SERVICE_UNAVAILABLE = 503, 48 NXT_HTTP_GATEWAY_TIMEOUT = 504, 49 NXT_HTTP_VERSION_NOT_SUPPORTED = 505, 50 NXT_HTTP_SERVER_ERROR_MAX = 599, 51 52 NXT_HTTP_STATUS_MAX = 999, 53} nxt_http_status_t; 54 55 56typedef enum { 57 NXT_HTTP_TE_NONE = 0, 58 NXT_HTTP_TE_CHUNKED = 1, 59 NXT_HTTP_TE_UNSUPPORTED = 2, 60} nxt_http_te_t; 61 62 63typedef enum { 64 NXT_HTTP_PROTO_H1 = 0, 65 NXT_HTTP_PROTO_H2, 66 NXT_HTTP_PROTO_DEVNULL, 67} nxt_http_protocol_t; 68 69 70typedef struct { 71 nxt_work_handler_t ready_handler; 72 nxt_work_handler_t error_handler; 73} nxt_http_request_state_t; 74 75 76typedef struct nxt_h1proto_s nxt_h1proto_t; 77 78struct nxt_h1p_websocket_timer_s { 79 nxt_timer_t timer; 80 nxt_h1proto_t *h1p; 81 nxt_msec_t keepalive_interval; 82}; 83 84 85typedef union { 86 void *any; 87 nxt_h1proto_t *h1; 88} nxt_http_proto_t; 89 90 91#define nxt_http_field_name_set(_field, _name) \ 92 do { \ 93 (_field)->name_length = nxt_length(_name); \ 94 (_field)->name = (u_char *) _name; \ 95 } while (0) 96 97 98#define nxt_http_field_set(_field, _name, _value) \ 99 do { \ 100 (_field)->name_length = nxt_length(_name); \ 101 (_field)->value_length = nxt_length(_value); \ 102 (_field)->name = (u_char *) _name; \ 103 (_field)->value = (u_char *) _value; \ 104 } while (0) 105 106 107typedef struct { 108 nxt_list_t *fields; 109 nxt_http_field_t *date; 110 nxt_http_field_t *content_type; 111 nxt_http_field_t *content_length; 112 nxt_off_t content_length_n; 113} nxt_http_response_t; 114 115 116typedef struct nxt_upstream_server_s nxt_upstream_server_t; 117 118typedef struct { 119 nxt_http_proto_t proto; 120 nxt_http_request_t *request; 121 nxt_upstream_server_t *server; 122 nxt_list_t *fields; 123 nxt_buf_t *body; 124 125 nxt_http_status_t status:16; 126 nxt_http_protocol_t protocol:8; /* 2 bits */ 127 uint8_t header_received; /* 1 bit */ 128 uint8_t closed; /* 1 bit */ 129} nxt_http_peer_t; 130 131 132struct nxt_http_request_s { 133 nxt_http_proto_t proto; 134 nxt_socket_conf_joint_t *conf; 135 136 nxt_mp_t *mem_pool; 137 138 nxt_buf_t *body; 139 nxt_buf_t *ws_frame; 140 nxt_buf_t *out; 141 const nxt_http_request_state_t *state; 142 143 nxt_str_t host; 144 nxt_str_t server_name; 145 nxt_str_t target; 146 nxt_str_t version; 147 nxt_str_t *method; 148 nxt_str_t *path; 149 nxt_str_t *args; 150 151 nxt_array_t *arguments; /* of nxt_http_name_value_t */ 152 nxt_array_t *cookies; /* of nxt_http_name_value_t */ 153 nxt_list_t *fields; 154 nxt_http_field_t *content_type; 155 nxt_http_field_t *content_length; 156 nxt_http_field_t *cookie; 157 nxt_http_field_t *referer; 158 nxt_http_field_t *user_agent; 159 nxt_http_field_t *authorization; 160 nxt_off_t content_length_n; 161 162 nxt_sockaddr_t *remote; 163 nxt_sockaddr_t *local; 164 void *tls; 165 nxt_task_t task; 166 167 nxt_timer_t timer; 168 void *timer_data; 169 170 nxt_var_query_t *var_query; 171 172 void *req_rpc_data; 173 174#if (NXT_HAVE_REGEX) 175 nxt_regex_match_t *regex_match; 176#endif 177 178 nxt_http_peer_t *peer; 179 nxt_buf_t *last; 180 181 nxt_queue_link_t app_link; /* nxt_app_t.ack_waiting_req */ 182 nxt_event_engine_t *engine; 183 nxt_work_t err_work; 184 185 nxt_http_response_t resp; 186 187 nxt_http_status_t status:16; 188 189 uint8_t pass_count; /* 8 bits */ 190 uint8_t app_target; 191 nxt_http_protocol_t protocol:8; /* 2 bits */ 192 uint8_t logged; /* 1 bit */ 193 uint8_t header_sent; /* 1 bit */ 194 uint8_t inconsistent; /* 1 bit */ 195 uint8_t error; /* 1 bit */ 196 uint8_t websocket_handshake; /* 1 bit */ 197}; 198 199
|
200typedef struct nxt_http_route_s nxt_http_route_t; 201typedef struct nxt_http_route_rule_s nxt_http_route_rule_t;
| 200typedef struct nxt_http_route_s nxt_http_route_t; 201typedef struct nxt_http_route_rule_s nxt_http_route_rule_t; 202typedef struct nxt_http_route_addr_rule_s nxt_http_route_addr_rule_t;
|
202 203 204typedef struct { 205 nxt_conf_value_t *pass; 206 nxt_conf_value_t *ret; 207 nxt_str_t location; 208 nxt_conf_value_t *proxy; 209 nxt_conf_value_t *share; 210 nxt_str_t chroot; 211 nxt_conf_value_t *follow_symlinks; 212 nxt_conf_value_t *traverse_mounts; 213 nxt_conf_value_t *types; 214 nxt_conf_value_t *fallback; 215} nxt_http_action_conf_t; 216 217 218struct nxt_http_action_s { 219 nxt_http_action_t *(*handler)(nxt_task_t *task, 220 nxt_http_request_t *r, 221 nxt_http_action_t *action); 222 union { 223 void *conf; 224 nxt_http_route_t *route; 225 nxt_upstream_t *upstream; 226 uint32_t upstream_number; 227 nxt_var_t *var; 228 } u; 229 230 nxt_str_t name; 231 nxt_http_action_t *fallback; 232}; 233 234 235typedef struct { 236 void (*body_read)(nxt_task_t *task, nxt_http_request_t *r); 237 void (*local_addr)(nxt_task_t *task, nxt_http_request_t *r); 238 void (*header_send)(nxt_task_t *task, nxt_http_request_t *r, 239 nxt_work_handler_t body_handler, void *data); 240 void (*send)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *out); 241 nxt_off_t (*body_bytes_sent)(nxt_task_t *task, nxt_http_proto_t proto); 242 void (*discard)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *last); 243 void (*close)(nxt_task_t *task, nxt_http_proto_t proto, 244 nxt_socket_conf_joint_t *joint); 245 246 void (*peer_connect)(nxt_task_t *task, nxt_http_peer_t *peer); 247 void (*peer_header_send)(nxt_task_t *task, nxt_http_peer_t *peer); 248 void (*peer_header_read)(nxt_task_t *task, nxt_http_peer_t *peer); 249 void (*peer_read)(nxt_task_t *task, nxt_http_peer_t *peer); 250 void (*peer_close)(nxt_task_t *task, nxt_http_peer_t *peer); 251 252 void (*ws_frame_start)(nxt_task_t *task, nxt_http_request_t *r, 253 nxt_buf_t *ws_frame); 254} nxt_http_proto_table_t; 255 256
| 203 204 205typedef struct { 206 nxt_conf_value_t *pass; 207 nxt_conf_value_t *ret; 208 nxt_str_t location; 209 nxt_conf_value_t *proxy; 210 nxt_conf_value_t *share; 211 nxt_str_t chroot; 212 nxt_conf_value_t *follow_symlinks; 213 nxt_conf_value_t *traverse_mounts; 214 nxt_conf_value_t *types; 215 nxt_conf_value_t *fallback; 216} nxt_http_action_conf_t; 217 218 219struct nxt_http_action_s { 220 nxt_http_action_t *(*handler)(nxt_task_t *task, 221 nxt_http_request_t *r, 222 nxt_http_action_t *action); 223 union { 224 void *conf; 225 nxt_http_route_t *route; 226 nxt_upstream_t *upstream; 227 uint32_t upstream_number; 228 nxt_var_t *var; 229 } u; 230 231 nxt_str_t name; 232 nxt_http_action_t *fallback; 233}; 234 235 236typedef struct { 237 void (*body_read)(nxt_task_t *task, nxt_http_request_t *r); 238 void (*local_addr)(nxt_task_t *task, nxt_http_request_t *r); 239 void (*header_send)(nxt_task_t *task, nxt_http_request_t *r, 240 nxt_work_handler_t body_handler, void *data); 241 void (*send)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *out); 242 nxt_off_t (*body_bytes_sent)(nxt_task_t *task, nxt_http_proto_t proto); 243 void (*discard)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *last); 244 void (*close)(nxt_task_t *task, nxt_http_proto_t proto, 245 nxt_socket_conf_joint_t *joint); 246 247 void (*peer_connect)(nxt_task_t *task, nxt_http_peer_t *peer); 248 void (*peer_header_send)(nxt_task_t *task, nxt_http_peer_t *peer); 249 void (*peer_header_read)(nxt_task_t *task, nxt_http_peer_t *peer); 250 void (*peer_read)(nxt_task_t *task, nxt_http_peer_t *peer); 251 void (*peer_close)(nxt_task_t *task, nxt_http_peer_t *peer); 252 253 void (*ws_frame_start)(nxt_task_t *task, nxt_http_request_t *r, 254 nxt_buf_t *ws_frame); 255} nxt_http_proto_table_t; 256 257
|
| 258struct nxt_http_client_ip_s { 259 nxt_http_route_addr_rule_t *source; 260 nxt_str_t *header; 261 uint32_t header_hash; 262 uint8_t recursive; /* 1 bit */ 263}; 264 265
|
257#define NXT_HTTP_DATE_LEN nxt_length("Wed, 31 Dec 1986 16:40:00 GMT") 258 259nxt_inline u_char * 260nxt_http_date(u_char *buf, struct tm *tm) 261{ 262 static const char *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", 263 "Sat" }; 264 265 static const char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", 266 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; 267 268 return nxt_sprintf(buf, buf + NXT_HTTP_DATE_LEN, 269 "%s, %02d %s %4d %02d:%02d:%02d GMT", 270 week[tm->tm_wday], tm->tm_mday, 271 month[tm->tm_mon], tm->tm_year + 1900, 272 tm->tm_hour, tm->tm_min, tm->tm_sec); 273} 274 275 276nxt_int_t nxt_http_init(nxt_task_t *task); 277nxt_int_t nxt_h1p_init(nxt_task_t *task); 278nxt_int_t nxt_http_response_hash_init(nxt_task_t *task); 279 280void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data); 281nxt_http_request_t *nxt_http_request_create(nxt_task_t *task); 282void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r, 283 nxt_http_status_t status); 284void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r); 285void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r, 286 nxt_work_handler_t body_handler, void *data); 287void nxt_http_request_ws_frame_start(nxt_task_t *task, nxt_http_request_t *r, 288 nxt_buf_t *ws_frame); 289void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r, 290 nxt_buf_t *out); 291nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r, 292 size_t size); 293nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r); 294void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data); 295void nxt_http_request_close_handler(nxt_task_t *task, void *obj, void *data); 296 297nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field, 298 uintptr_t data); 299nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field, 300 uintptr_t offset); 301nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field, 302 uintptr_t data); 303 304nxt_http_routes_t *nxt_http_routes_create(nxt_task_t *task, 305 nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *routes_conf); 306nxt_http_action_t *nxt_http_action_create(nxt_task_t *task, 307 nxt_router_temp_conf_t *tmcf, nxt_str_t *name); 308nxt_int_t nxt_http_routes_resolve(nxt_task_t *task, 309 nxt_router_temp_conf_t *tmcf); 310nxt_int_t nxt_http_pass_segments(nxt_mp_t *mp, nxt_str_t *pass, 311 nxt_str_t *segments, nxt_uint_t n); 312nxt_http_action_t *nxt_http_pass_application(nxt_task_t *task, 313 nxt_router_conf_t *rtcf, nxt_str_t *name);
| 266#define NXT_HTTP_DATE_LEN nxt_length("Wed, 31 Dec 1986 16:40:00 GMT") 267 268nxt_inline u_char * 269nxt_http_date(u_char *buf, struct tm *tm) 270{ 271 static const char *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", 272 "Sat" }; 273 274 static const char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", 275 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; 276 277 return nxt_sprintf(buf, buf + NXT_HTTP_DATE_LEN, 278 "%s, %02d %s %4d %02d:%02d:%02d GMT", 279 week[tm->tm_wday], tm->tm_mday, 280 month[tm->tm_mon], tm->tm_year + 1900, 281 tm->tm_hour, tm->tm_min, tm->tm_sec); 282} 283 284 285nxt_int_t nxt_http_init(nxt_task_t *task); 286nxt_int_t nxt_h1p_init(nxt_task_t *task); 287nxt_int_t nxt_http_response_hash_init(nxt_task_t *task); 288 289void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data); 290nxt_http_request_t *nxt_http_request_create(nxt_task_t *task); 291void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r, 292 nxt_http_status_t status); 293void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r); 294void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r, 295 nxt_work_handler_t body_handler, void *data); 296void nxt_http_request_ws_frame_start(nxt_task_t *task, nxt_http_request_t *r, 297 nxt_buf_t *ws_frame); 298void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r, 299 nxt_buf_t *out); 300nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r, 301 size_t size); 302nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r); 303void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data); 304void nxt_http_request_close_handler(nxt_task_t *task, void *obj, void *data); 305 306nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field, 307 uintptr_t data); 308nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field, 309 uintptr_t offset); 310nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field, 311 uintptr_t data); 312 313nxt_http_routes_t *nxt_http_routes_create(nxt_task_t *task, 314 nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *routes_conf); 315nxt_http_action_t *nxt_http_action_create(nxt_task_t *task, 316 nxt_router_temp_conf_t *tmcf, nxt_str_t *name); 317nxt_int_t nxt_http_routes_resolve(nxt_task_t *task, 318 nxt_router_temp_conf_t *tmcf); 319nxt_int_t nxt_http_pass_segments(nxt_mp_t *mp, nxt_str_t *pass, 320 nxt_str_t *segments, nxt_uint_t n); 321nxt_http_action_t *nxt_http_pass_application(nxt_task_t *task, 322 nxt_router_conf_t *rtcf, nxt_str_t *name);
|
| 323nxt_http_route_addr_rule_t *nxt_http_route_addr_rule_create( 324 nxt_task_t *task, nxt_mp_t *mp, nxt_conf_value_t *cv); 325nxt_int_t nxt_http_route_addr_rule(nxt_http_request_t *r, 326 nxt_http_route_addr_rule_t *addr_rule, nxt_sockaddr_t *sockaddr);
|
314nxt_http_route_rule_t *nxt_http_route_types_rule_create(nxt_task_t *task, 315 nxt_mp_t *mp, nxt_conf_value_t *types); 316nxt_int_t nxt_http_route_test_rule(nxt_http_request_t *r, 317 nxt_http_route_rule_t *rule, u_char *start, size_t length); 318 319nxt_int_t nxt_http_action_init(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, 320 nxt_conf_value_t *cv, nxt_http_action_t *action); 321void nxt_http_request_action(nxt_task_t *task, nxt_http_request_t *r, 322 nxt_http_action_t *action); 323 324nxt_int_t nxt_upstreams_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, 325 nxt_conf_value_t *conf); 326nxt_int_t nxt_upstreams_joint_create(nxt_router_temp_conf_t *tmcf, 327 nxt_upstream_t ***upstream_joint); 328 329nxt_int_t nxt_http_return_init(nxt_mp_t *mp, nxt_http_action_t *action, 330 nxt_http_action_conf_t *acf); 331 332nxt_int_t nxt_http_static_init(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, 333 nxt_http_action_t *action, nxt_http_action_conf_t *acf); 334nxt_int_t nxt_http_static_mtypes_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash); 335nxt_int_t nxt_http_static_mtypes_hash_add(nxt_mp_t *mp, nxt_lvlhsh_t *hash, 336 nxt_str_t *exten, nxt_str_t *type); 337nxt_str_t *nxt_http_static_mtype_get(nxt_lvlhsh_t *hash, nxt_str_t *exten); 338 339nxt_http_action_t *nxt_http_application_handler(nxt_task_t *task, 340 nxt_http_request_t *r, nxt_http_action_t *action); 341nxt_int_t nxt_upstream_find(nxt_upstreams_t *upstreams, nxt_str_t *name, 342 nxt_http_action_t *action); 343nxt_http_action_t *nxt_upstream_proxy_handler(nxt_task_t *task, 344 nxt_http_request_t *r, nxt_upstream_t *upstream); 345 346nxt_int_t nxt_http_proxy_init(nxt_mp_t *mp, nxt_http_action_t *action, 347 nxt_http_action_conf_t *acf); 348nxt_int_t nxt_http_proxy_date(void *ctx, nxt_http_field_t *field, 349 uintptr_t data); 350nxt_int_t nxt_http_proxy_content_length(void *ctx, nxt_http_field_t *field, 351 uintptr_t data); 352nxt_int_t nxt_http_proxy_skip(void *ctx, nxt_http_field_t *field, 353 uintptr_t data); 354nxt_buf_t *nxt_http_proxy_buf_mem_alloc(nxt_task_t *task, nxt_http_request_t *r, 355 size_t size); 356void nxt_http_proxy_buf_mem_free(nxt_task_t *task, nxt_http_request_t *r, 357 nxt_buf_t *b); 358 359extern nxt_time_string_t nxt_http_date_cache; 360 361extern nxt_lvlhsh_t nxt_response_fields_hash; 362 363extern const nxt_http_proto_table_t nxt_http_proto[]; 364 365void nxt_h1p_websocket_first_frame_start(nxt_task_t *task, 366 nxt_http_request_t *r, nxt_buf_t *ws_frame); 367void nxt_h1p_websocket_frame_start(nxt_task_t *task, nxt_http_request_t *r, 368 nxt_buf_t *ws_frame); 369void nxt_h1p_complete_buffers(nxt_task_t *task, nxt_h1proto_t *h1p, 370 nxt_bool_t all); 371nxt_msec_t nxt_h1p_conn_request_timer_value(nxt_conn_t *c, uintptr_t data); 372 373extern const nxt_conn_state_t nxt_h1p_idle_close_state; 374 375#endif /* _NXT_HTTP_H_INCLUDED_ */
| 327nxt_http_route_rule_t *nxt_http_route_types_rule_create(nxt_task_t *task, 328 nxt_mp_t *mp, nxt_conf_value_t *types); 329nxt_int_t nxt_http_route_test_rule(nxt_http_request_t *r, 330 nxt_http_route_rule_t *rule, u_char *start, size_t length); 331 332nxt_int_t nxt_http_action_init(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, 333 nxt_conf_value_t *cv, nxt_http_action_t *action); 334void nxt_http_request_action(nxt_task_t *task, nxt_http_request_t *r, 335 nxt_http_action_t *action); 336 337nxt_int_t nxt_upstreams_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, 338 nxt_conf_value_t *conf); 339nxt_int_t nxt_upstreams_joint_create(nxt_router_temp_conf_t *tmcf, 340 nxt_upstream_t ***upstream_joint); 341 342nxt_int_t nxt_http_return_init(nxt_mp_t *mp, nxt_http_action_t *action, 343 nxt_http_action_conf_t *acf); 344 345nxt_int_t nxt_http_static_init(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, 346 nxt_http_action_t *action, nxt_http_action_conf_t *acf); 347nxt_int_t nxt_http_static_mtypes_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash); 348nxt_int_t nxt_http_static_mtypes_hash_add(nxt_mp_t *mp, nxt_lvlhsh_t *hash, 349 nxt_str_t *exten, nxt_str_t *type); 350nxt_str_t *nxt_http_static_mtype_get(nxt_lvlhsh_t *hash, nxt_str_t *exten); 351 352nxt_http_action_t *nxt_http_application_handler(nxt_task_t *task, 353 nxt_http_request_t *r, nxt_http_action_t *action); 354nxt_int_t nxt_upstream_find(nxt_upstreams_t *upstreams, nxt_str_t *name, 355 nxt_http_action_t *action); 356nxt_http_action_t *nxt_upstream_proxy_handler(nxt_task_t *task, 357 nxt_http_request_t *r, nxt_upstream_t *upstream); 358 359nxt_int_t nxt_http_proxy_init(nxt_mp_t *mp, nxt_http_action_t *action, 360 nxt_http_action_conf_t *acf); 361nxt_int_t nxt_http_proxy_date(void *ctx, nxt_http_field_t *field, 362 uintptr_t data); 363nxt_int_t nxt_http_proxy_content_length(void *ctx, nxt_http_field_t *field, 364 uintptr_t data); 365nxt_int_t nxt_http_proxy_skip(void *ctx, nxt_http_field_t *field, 366 uintptr_t data); 367nxt_buf_t *nxt_http_proxy_buf_mem_alloc(nxt_task_t *task, nxt_http_request_t *r, 368 size_t size); 369void nxt_http_proxy_buf_mem_free(nxt_task_t *task, nxt_http_request_t *r, 370 nxt_buf_t *b); 371 372extern nxt_time_string_t nxt_http_date_cache; 373 374extern nxt_lvlhsh_t nxt_response_fields_hash; 375 376extern const nxt_http_proto_table_t nxt_http_proto[]; 377 378void nxt_h1p_websocket_first_frame_start(nxt_task_t *task, 379 nxt_http_request_t *r, nxt_buf_t *ws_frame); 380void nxt_h1p_websocket_frame_start(nxt_task_t *task, nxt_http_request_t *r, 381 nxt_buf_t *ws_frame); 382void nxt_h1p_complete_buffers(nxt_task_t *task, nxt_h1proto_t *h1p, 383 nxt_bool_t all); 384nxt_msec_t nxt_h1p_conn_request_timer_value(nxt_conn_t *c, uintptr_t data); 385 386extern const nxt_conn_state_t nxt_h1p_idle_close_state; 387 388#endif /* _NXT_HTTP_H_INCLUDED_ */
|