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 { 12431Sigor@sysoev.ru NXT_HTTP_INVALID = 0, 13431Sigor@sysoev.ru 14431Sigor@sysoev.ru NXT_HTTP_OK = 200, 15793Sigor@sysoev.ru NXT_HTTP_NO_CONTENT = 204, 16431Sigor@sysoev.ru 17431Sigor@sysoev.ru NXT_HTTP_MULTIPLE_CHOICES = 300, 18431Sigor@sysoev.ru NXT_HTTP_MOVED_PERMANENTLY = 301, 19431Sigor@sysoev.ru NXT_HTTP_FOUND = 302, 20431Sigor@sysoev.ru NXT_HTTP_SEE_OTHER = 303, 21431Sigor@sysoev.ru NXT_HTTP_NOT_MODIFIED = 304, 22431Sigor@sysoev.ru 23431Sigor@sysoev.ru NXT_HTTP_BAD_REQUEST = 400, 24964Sigor@sysoev.ru NXT_HTTP_NOT_FOUND = 404, 25624Sigor@sysoev.ru NXT_HTTP_REQUEST_TIMEOUT = 408, 26431Sigor@sysoev.ru NXT_HTTP_LENGTH_REQUIRED = 411, 27431Sigor@sysoev.ru NXT_HTTP_PAYLOAD_TOO_LARGE = 413, 28431Sigor@sysoev.ru NXT_HTTP_URI_TOO_LONG = 414, 29431Sigor@sysoev.ru NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431, 30431Sigor@sysoev.ru 31772Sigor@sysoev.ru NXT_HTTP_TO_HTTPS = 497, 32772Sigor@sysoev.ru 33431Sigor@sysoev.ru NXT_HTTP_INTERNAL_SERVER_ERROR = 500, 34431Sigor@sysoev.ru NXT_HTTP_NOT_IMPLEMENTED = 501, 35431Sigor@sysoev.ru NXT_HTTP_BAD_GATEWAY = 502, 36431Sigor@sysoev.ru NXT_HTTP_SERVICE_UNAVAILABLE = 503, 37431Sigor@sysoev.ru NXT_HTTP_GATEWAY_TIMEOUT = 504, 38482Svbart@nginx.com NXT_HTTP_VERSION_NOT_SUPPORTED = 505, 39431Sigor@sysoev.ru } nxt_http_status_t; 40431Sigor@sysoev.ru 41431Sigor@sysoev.ru 42431Sigor@sysoev.ru typedef enum { 43431Sigor@sysoev.ru NXT_HTTP_TE_NONE = 0, 44431Sigor@sysoev.ru NXT_HTTP_TE_CHUNKED = 1, 45431Sigor@sysoev.ru NXT_HTTP_TE_UNSUPPORTED = 2, 46431Sigor@sysoev.ru } nxt_http_te_t; 47431Sigor@sysoev.ru 48431Sigor@sysoev.ru 49*1112Sigor@sysoev.ru typedef enum { 50*1112Sigor@sysoev.ru NXT_HTTP_PROTO_H1 = 0, 51*1112Sigor@sysoev.ru NXT_HTTP_PROTO_H2, 52*1112Sigor@sysoev.ru NXT_HTTP_PROTO_DEVNULL, 53*1112Sigor@sysoev.ru } nxt_http_protocol_t; 54*1112Sigor@sysoev.ru 55*1112Sigor@sysoev.ru 56431Sigor@sysoev.ru typedef struct { 57431Sigor@sysoev.ru nxt_work_handler_t ready_handler; 58431Sigor@sysoev.ru nxt_work_handler_t error_handler; 59431Sigor@sysoev.ru } nxt_http_request_state_t; 60431Sigor@sysoev.ru 61431Sigor@sysoev.ru 62431Sigor@sysoev.ru typedef struct { 63431Sigor@sysoev.ru nxt_http_request_parse_t parser; 64431Sigor@sysoev.ru 65431Sigor@sysoev.ru uint8_t nbuffers; 66431Sigor@sysoev.ru uint8_t keepalive; /* 1 bit */ 67431Sigor@sysoev.ru uint8_t chunked; /* 1 bit */ 68431Sigor@sysoev.ru nxt_http_te_t transfer_encoding:8; /* 2 bits */ 69431Sigor@sysoev.ru 70630Svbart@nginx.com uint32_t header_size; 71630Svbart@nginx.com 72431Sigor@sysoev.ru nxt_http_request_t *request; 73452Sigor@sysoev.ru nxt_buf_t *buffers; 74452Sigor@sysoev.ru /* 75452Sigor@sysoev.ru * All fields before the conn field will 76452Sigor@sysoev.ru * be zeroed in a keep-alive connection. 77452Sigor@sysoev.ru */ 78431Sigor@sysoev.ru nxt_conn_t *conn; 79431Sigor@sysoev.ru } nxt_h1proto_t; 80431Sigor@sysoev.ru 81431Sigor@sysoev.ru 82431Sigor@sysoev.ru typedef union { 83431Sigor@sysoev.ru void *any; 84431Sigor@sysoev.ru nxt_h1proto_t *h1; 85431Sigor@sysoev.ru } nxt_http_proto_t; 86431Sigor@sysoev.ru 87431Sigor@sysoev.ru 88431Sigor@sysoev.ru #define nxt_http_field_name_set(_field, _name) \ 89431Sigor@sysoev.ru do { \ 90703Svbart@nginx.com (_field)->name_length = nxt_length(_name); \ 91431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 92431Sigor@sysoev.ru } while (0) 93431Sigor@sysoev.ru 94431Sigor@sysoev.ru 95431Sigor@sysoev.ru #define nxt_http_field_set(_field, _name, _value) \ 96431Sigor@sysoev.ru do { \ 97703Svbart@nginx.com (_field)->name_length = nxt_length(_name); \ 98703Svbart@nginx.com (_field)->value_length = nxt_length(_value); \ 99431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 100431Sigor@sysoev.ru (_field)->value = (u_char *) _value; \ 101431Sigor@sysoev.ru } while (0) 102431Sigor@sysoev.ru 103431Sigor@sysoev.ru 104431Sigor@sysoev.ru typedef struct { 105431Sigor@sysoev.ru nxt_list_t *fields; 106543Svbart@nginx.com nxt_http_field_t *date; 107431Sigor@sysoev.ru nxt_http_field_t *content_type; 108431Sigor@sysoev.ru nxt_http_field_t *content_length; 109431Sigor@sysoev.ru nxt_off_t content_length_n; 110431Sigor@sysoev.ru } nxt_http_response_t; 111431Sigor@sysoev.ru 112431Sigor@sysoev.ru 113431Sigor@sysoev.ru struct nxt_http_request_s { 114431Sigor@sysoev.ru nxt_http_proto_t proto; 115683Sigor@sysoev.ru nxt_socket_conf_joint_t *conf; 116431Sigor@sysoev.ru 117431Sigor@sysoev.ru nxt_mp_t *mem_pool; 118431Sigor@sysoev.ru 119431Sigor@sysoev.ru nxt_buf_t *body; 120431Sigor@sysoev.ru nxt_buf_t *out; 121431Sigor@sysoev.ru const nxt_http_request_state_t *state; 122431Sigor@sysoev.ru 123964Sigor@sysoev.ru nxt_str_t host; 1241007Salexander.borisov@nginx.com nxt_str_t server_name; 125431Sigor@sysoev.ru nxt_str_t target; 126431Sigor@sysoev.ru nxt_str_t version; 127431Sigor@sysoev.ru nxt_str_t *method; 128431Sigor@sysoev.ru nxt_str_t *path; 129431Sigor@sysoev.ru nxt_str_t *args; 130431Sigor@sysoev.ru 1311061Sigor@sysoev.ru nxt_array_t *arguments; /* of nxt_http_name_value_t */ 1321062Sigor@sysoev.ru nxt_array_t *cookies; /* of nxt_http_name_value_t */ 133431Sigor@sysoev.ru nxt_list_t *fields; 134431Sigor@sysoev.ru nxt_http_field_t *content_type; 135431Sigor@sysoev.ru nxt_http_field_t *content_length; 136431Sigor@sysoev.ru nxt_http_field_t *cookie; 137630Svbart@nginx.com nxt_http_field_t *referer; 138630Svbart@nginx.com nxt_http_field_t *user_agent; 139431Sigor@sysoev.ru nxt_off_t content_length_n; 140431Sigor@sysoev.ru 141431Sigor@sysoev.ru nxt_sockaddr_t *remote; 142431Sigor@sysoev.ru nxt_sockaddr_t *local; 1431011Smax.romanov@nginx.com void *tls; 144431Sigor@sysoev.ru 1451007Salexander.borisov@nginx.com nxt_timer_t timer; 1461007Salexander.borisov@nginx.com void *timer_data; 1471007Salexander.borisov@nginx.com 148608Sigor@sysoev.ru nxt_buf_t *last; 149608Sigor@sysoev.ru 150431Sigor@sysoev.ru nxt_http_response_t resp; 151431Sigor@sysoev.ru 152431Sigor@sysoev.ru nxt_http_status_t status:16; 153431Sigor@sysoev.ru 154964Sigor@sysoev.ru uint8_t pass_count; /* 8 bits */ 155*1112Sigor@sysoev.ru nxt_http_protocol_t protocol:8; /* 2 bits */ 156431Sigor@sysoev.ru uint8_t logged; /* 1 bit */ 157431Sigor@sysoev.ru uint8_t header_sent; /* 1 bit */ 158608Sigor@sysoev.ru uint8_t error; /* 1 bit */ 159431Sigor@sysoev.ru }; 160431Sigor@sysoev.ru 161431Sigor@sysoev.ru 162964Sigor@sysoev.ru typedef struct nxt_http_route_s nxt_http_route_t; 163964Sigor@sysoev.ru 164964Sigor@sysoev.ru 165964Sigor@sysoev.ru struct nxt_http_pass_s { 166964Sigor@sysoev.ru nxt_http_pass_t *(*handler)(nxt_task_t *task, 167964Sigor@sysoev.ru nxt_http_request_t *r, 168964Sigor@sysoev.ru nxt_http_pass_t *pass); 169964Sigor@sysoev.ru union { 170964Sigor@sysoev.ru nxt_http_route_t *route; 171964Sigor@sysoev.ru nxt_app_t *application; 172964Sigor@sysoev.ru } u; 173964Sigor@sysoev.ru 174964Sigor@sysoev.ru nxt_str_t name; 175964Sigor@sysoev.ru }; 176964Sigor@sysoev.ru 177964Sigor@sysoev.ru 178*1112Sigor@sysoev.ru typedef struct { 179*1112Sigor@sysoev.ru void (*body_read)(nxt_task_t *task, nxt_http_request_t *r); 180*1112Sigor@sysoev.ru void (*local_addr)(nxt_task_t *task, nxt_http_request_t *r); 181*1112Sigor@sysoev.ru void (*header_send)(nxt_task_t *task, nxt_http_request_t *r); 182*1112Sigor@sysoev.ru void (*send)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *out); 183*1112Sigor@sysoev.ru nxt_off_t (*body_bytes_sent)(nxt_task_t *task, nxt_http_proto_t proto); 184*1112Sigor@sysoev.ru void (*discard)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *last); 185*1112Sigor@sysoev.ru void (*close)(nxt_task_t *task, nxt_http_proto_t proto, 186*1112Sigor@sysoev.ru nxt_socket_conf_joint_t *joint); 187*1112Sigor@sysoev.ru } nxt_http_proto_table_t; 188431Sigor@sysoev.ru 189431Sigor@sysoev.ru 190431Sigor@sysoev.ru nxt_int_t nxt_http_init(nxt_task_t *task, nxt_runtime_t *rt); 191431Sigor@sysoev.ru nxt_int_t nxt_h1p_init(nxt_task_t *task, nxt_runtime_t *rt); 192431Sigor@sysoev.ru nxt_int_t nxt_http_response_hash_init(nxt_task_t *task, nxt_runtime_t *rt); 193431Sigor@sysoev.ru 194431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data); 195431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task); 196431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r, 197431Sigor@sysoev.ru nxt_http_status_t status); 198431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r); 199431Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r); 200431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r, 201431Sigor@sysoev.ru nxt_buf_t *out); 202608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r, 203608Sigor@sysoev.ru size_t size); 204608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r); 205608Sigor@sysoev.ru void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data); 206431Sigor@sysoev.ru 207431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field, 208431Sigor@sysoev.ru uintptr_t data); 209431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field, 210431Sigor@sysoev.ru uintptr_t offset); 211431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field, 212431Sigor@sysoev.ru uintptr_t data); 213431Sigor@sysoev.ru 214964Sigor@sysoev.ru nxt_http_routes_t *nxt_http_routes_create(nxt_task_t *task, 215964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *routes_conf); 216964Sigor@sysoev.ru nxt_http_pass_t *nxt_http_pass_create(nxt_task_t *task, 217964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_str_t *name); 218964Sigor@sysoev.ru void nxt_http_routes_resolve(nxt_task_t *task, nxt_router_temp_conf_t *tmcf); 219964Sigor@sysoev.ru nxt_http_pass_t *nxt_http_pass_application(nxt_task_t *task, 220964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_str_t *name); 221964Sigor@sysoev.ru void nxt_http_routes_cleanup(nxt_task_t *task, nxt_http_routes_t *routes); 222964Sigor@sysoev.ru void nxt_http_pass_cleanup(nxt_task_t *task, nxt_http_pass_t *pass); 223964Sigor@sysoev.ru 224964Sigor@sysoev.ru nxt_http_pass_t *nxt_http_request_application(nxt_task_t *task, 225964Sigor@sysoev.ru nxt_http_request_t *r, nxt_http_pass_t *pass); 226431Sigor@sysoev.ru 227740Sigor@sysoev.ru extern nxt_time_string_t nxt_http_date_cache; 228740Sigor@sysoev.ru 229431Sigor@sysoev.ru extern nxt_lvlhsh_t nxt_response_fields_hash; 230431Sigor@sysoev.ru 231*1112Sigor@sysoev.ru extern const nxt_http_proto_table_t nxt_http_proto[]; 232431Sigor@sysoev.ru 233431Sigor@sysoev.ru 234431Sigor@sysoev.ru #endif /* _NXT_HTTP_H_INCLUDED_ */ 235