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 49431Sigor@sysoev.ru typedef struct { 50431Sigor@sysoev.ru nxt_work_handler_t ready_handler; 51431Sigor@sysoev.ru nxt_work_handler_t error_handler; 52431Sigor@sysoev.ru } nxt_http_request_state_t; 53431Sigor@sysoev.ru 54431Sigor@sysoev.ru 55431Sigor@sysoev.ru typedef struct { 56431Sigor@sysoev.ru nxt_http_request_parse_t parser; 57431Sigor@sysoev.ru 58431Sigor@sysoev.ru uint8_t nbuffers; 59431Sigor@sysoev.ru uint8_t keepalive; /* 1 bit */ 60431Sigor@sysoev.ru uint8_t chunked; /* 1 bit */ 61431Sigor@sysoev.ru nxt_http_te_t transfer_encoding:8; /* 2 bits */ 62431Sigor@sysoev.ru 63630Svbart@nginx.com uint32_t header_size; 64630Svbart@nginx.com 65431Sigor@sysoev.ru nxt_http_request_t *request; 66452Sigor@sysoev.ru nxt_buf_t *buffers; 67452Sigor@sysoev.ru /* 68452Sigor@sysoev.ru * All fields before the conn field will 69452Sigor@sysoev.ru * be zeroed in a keep-alive connection. 70452Sigor@sysoev.ru */ 71431Sigor@sysoev.ru nxt_conn_t *conn; 72431Sigor@sysoev.ru } nxt_h1proto_t; 73431Sigor@sysoev.ru 74431Sigor@sysoev.ru 75431Sigor@sysoev.ru typedef union { 76431Sigor@sysoev.ru void *any; 77431Sigor@sysoev.ru nxt_h1proto_t *h1; 78431Sigor@sysoev.ru } nxt_http_proto_t; 79431Sigor@sysoev.ru 80431Sigor@sysoev.ru 81431Sigor@sysoev.ru #define nxt_http_field_name_set(_field, _name) \ 82431Sigor@sysoev.ru do { \ 83703Svbart@nginx.com (_field)->name_length = nxt_length(_name); \ 84431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 85431Sigor@sysoev.ru } while (0) 86431Sigor@sysoev.ru 87431Sigor@sysoev.ru 88431Sigor@sysoev.ru #define nxt_http_field_set(_field, _name, _value) \ 89431Sigor@sysoev.ru do { \ 90703Svbart@nginx.com (_field)->name_length = nxt_length(_name); \ 91703Svbart@nginx.com (_field)->value_length = nxt_length(_value); \ 92431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 93431Sigor@sysoev.ru (_field)->value = (u_char *) _value; \ 94431Sigor@sysoev.ru } while (0) 95431Sigor@sysoev.ru 96431Sigor@sysoev.ru 97431Sigor@sysoev.ru typedef struct { 98431Sigor@sysoev.ru nxt_list_t *fields; 99543Svbart@nginx.com nxt_http_field_t *date; 100431Sigor@sysoev.ru nxt_http_field_t *content_type; 101431Sigor@sysoev.ru nxt_http_field_t *content_length; 102431Sigor@sysoev.ru nxt_off_t content_length_n; 103431Sigor@sysoev.ru } nxt_http_response_t; 104431Sigor@sysoev.ru 105431Sigor@sysoev.ru 106431Sigor@sysoev.ru struct nxt_http_request_s { 107431Sigor@sysoev.ru nxt_http_proto_t proto; 108683Sigor@sysoev.ru nxt_socket_conf_joint_t *conf; 109431Sigor@sysoev.ru 110431Sigor@sysoev.ru nxt_mp_t *mem_pool; 111431Sigor@sysoev.ru 112431Sigor@sysoev.ru nxt_buf_t *body; 113431Sigor@sysoev.ru nxt_buf_t *out; 114431Sigor@sysoev.ru const nxt_http_request_state_t *state; 115431Sigor@sysoev.ru 116964Sigor@sysoev.ru nxt_str_t host; 1171007Salexander.borisov@nginx.com nxt_str_t server_name; 118431Sigor@sysoev.ru nxt_str_t target; 119431Sigor@sysoev.ru nxt_str_t version; 120431Sigor@sysoev.ru nxt_str_t *method; 121431Sigor@sysoev.ru nxt_str_t *path; 122431Sigor@sysoev.ru nxt_str_t *args; 123431Sigor@sysoev.ru 124*1061Sigor@sysoev.ru nxt_array_t *arguments; /* of nxt_http_name_value_t */ 125431Sigor@sysoev.ru nxt_list_t *fields; 126431Sigor@sysoev.ru nxt_http_field_t *content_type; 127431Sigor@sysoev.ru nxt_http_field_t *content_length; 128431Sigor@sysoev.ru nxt_http_field_t *cookie; 129630Svbart@nginx.com nxt_http_field_t *referer; 130630Svbart@nginx.com nxt_http_field_t *user_agent; 131431Sigor@sysoev.ru nxt_off_t content_length_n; 132431Sigor@sysoev.ru 133431Sigor@sysoev.ru nxt_sockaddr_t *remote; 134431Sigor@sysoev.ru nxt_sockaddr_t *local; 1351011Smax.romanov@nginx.com void *tls; 136431Sigor@sysoev.ru 1371007Salexander.borisov@nginx.com nxt_timer_t timer; 1381007Salexander.borisov@nginx.com void *timer_data; 1391007Salexander.borisov@nginx.com 140608Sigor@sysoev.ru nxt_buf_t *last; 141608Sigor@sysoev.ru 142431Sigor@sysoev.ru nxt_http_response_t resp; 143431Sigor@sysoev.ru 144431Sigor@sysoev.ru nxt_http_status_t status:16; 145431Sigor@sysoev.ru 146964Sigor@sysoev.ru uint8_t pass_count; /* 8 bits */ 147431Sigor@sysoev.ru uint8_t protocol; /* 2 bits */ 148431Sigor@sysoev.ru uint8_t logged; /* 1 bit */ 149431Sigor@sysoev.ru uint8_t header_sent; /* 1 bit */ 150608Sigor@sysoev.ru uint8_t error; /* 1 bit */ 151431Sigor@sysoev.ru }; 152431Sigor@sysoev.ru 153431Sigor@sysoev.ru 154964Sigor@sysoev.ru typedef struct nxt_http_route_s nxt_http_route_t; 155964Sigor@sysoev.ru 156964Sigor@sysoev.ru 157964Sigor@sysoev.ru struct nxt_http_pass_s { 158964Sigor@sysoev.ru nxt_http_pass_t *(*handler)(nxt_task_t *task, 159964Sigor@sysoev.ru nxt_http_request_t *r, 160964Sigor@sysoev.ru nxt_http_pass_t *pass); 161964Sigor@sysoev.ru union { 162964Sigor@sysoev.ru nxt_http_route_t *route; 163964Sigor@sysoev.ru nxt_app_t *application; 164964Sigor@sysoev.ru } u; 165964Sigor@sysoev.ru 166964Sigor@sysoev.ru nxt_str_t name; 167964Sigor@sysoev.ru }; 168964Sigor@sysoev.ru 169964Sigor@sysoev.ru 170431Sigor@sysoev.ru typedef void (*nxt_http_proto_body_read_t)(nxt_task_t *task, 171431Sigor@sysoev.ru nxt_http_request_t *r); 172431Sigor@sysoev.ru typedef void (*nxt_http_proto_local_addr_t)(nxt_task_t *task, 173431Sigor@sysoev.ru nxt_http_request_t *r); 1741011Smax.romanov@nginx.com typedef void (*nxt_http_proto_tls_t)(nxt_task_t *task, nxt_http_request_t *r); 175431Sigor@sysoev.ru typedef void (*nxt_http_proto_header_send_t)(nxt_task_t *task, 176431Sigor@sysoev.ru nxt_http_request_t *r); 177431Sigor@sysoev.ru typedef void (*nxt_http_proto_send_t)(nxt_task_t *task, nxt_http_request_t *r, 178431Sigor@sysoev.ru nxt_buf_t *out); 179630Svbart@nginx.com typedef nxt_off_t (*nxt_http_proto_body_bytes_sent_t)(nxt_task_t *task, 180630Svbart@nginx.com nxt_http_proto_t proto); 181608Sigor@sysoev.ru typedef void (*nxt_http_proto_discard_t)(nxt_task_t *task, 182608Sigor@sysoev.ru nxt_http_request_t *r, nxt_buf_t *last); 183431Sigor@sysoev.ru typedef void (*nxt_http_proto_close_t)(nxt_task_t *task, 184683Sigor@sysoev.ru nxt_http_proto_t proto, nxt_socket_conf_joint_t *joint); 185431Sigor@sysoev.ru 186431Sigor@sysoev.ru 187431Sigor@sysoev.ru nxt_int_t nxt_http_init(nxt_task_t *task, nxt_runtime_t *rt); 188431Sigor@sysoev.ru nxt_int_t nxt_h1p_init(nxt_task_t *task, nxt_runtime_t *rt); 189431Sigor@sysoev.ru nxt_int_t nxt_http_response_hash_init(nxt_task_t *task, nxt_runtime_t *rt); 190431Sigor@sysoev.ru 191431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data); 192431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task); 193431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r, 194431Sigor@sysoev.ru nxt_http_status_t status); 195431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r); 196431Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r); 197431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r, 198431Sigor@sysoev.ru nxt_buf_t *out); 199608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r, 200608Sigor@sysoev.ru size_t size); 201608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r); 202608Sigor@sysoev.ru void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data); 203431Sigor@sysoev.ru 204431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field, 205431Sigor@sysoev.ru uintptr_t data); 206431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field, 207431Sigor@sysoev.ru uintptr_t offset); 208431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field, 209431Sigor@sysoev.ru uintptr_t data); 210431Sigor@sysoev.ru 211964Sigor@sysoev.ru nxt_http_routes_t *nxt_http_routes_create(nxt_task_t *task, 212964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *routes_conf); 213964Sigor@sysoev.ru nxt_http_pass_t *nxt_http_pass_create(nxt_task_t *task, 214964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_str_t *name); 215964Sigor@sysoev.ru void nxt_http_routes_resolve(nxt_task_t *task, nxt_router_temp_conf_t *tmcf); 216964Sigor@sysoev.ru nxt_http_pass_t *nxt_http_pass_application(nxt_task_t *task, 217964Sigor@sysoev.ru nxt_router_temp_conf_t *tmcf, nxt_str_t *name); 218964Sigor@sysoev.ru void nxt_http_routes_cleanup(nxt_task_t *task, nxt_http_routes_t *routes); 219964Sigor@sysoev.ru void nxt_http_pass_cleanup(nxt_task_t *task, nxt_http_pass_t *pass); 220964Sigor@sysoev.ru 221964Sigor@sysoev.ru nxt_http_pass_t *nxt_http_request_application(nxt_task_t *task, 222964Sigor@sysoev.ru nxt_http_request_t *r, nxt_http_pass_t *pass); 223431Sigor@sysoev.ru 224740Sigor@sysoev.ru extern nxt_time_string_t nxt_http_date_cache; 225740Sigor@sysoev.ru 226431Sigor@sysoev.ru extern nxt_lvlhsh_t nxt_response_fields_hash; 227431Sigor@sysoev.ru 228630Svbart@nginx.com extern const nxt_http_proto_body_read_t nxt_http_proto_body_read[]; 229630Svbart@nginx.com extern const nxt_http_proto_local_addr_t nxt_http_proto_local_addr[]; 2301011Smax.romanov@nginx.com extern const nxt_http_proto_tls_t nxt_http_proto_tls[]; 231630Svbart@nginx.com extern const nxt_http_proto_header_send_t nxt_http_proto_header_send[]; 232630Svbart@nginx.com extern const nxt_http_proto_send_t nxt_http_proto_send[]; 233630Svbart@nginx.com extern const nxt_http_proto_body_bytes_sent_t nxt_http_proto_body_bytes_sent[]; 234630Svbart@nginx.com extern const nxt_http_proto_discard_t nxt_http_proto_discard[]; 235630Svbart@nginx.com extern const nxt_http_proto_close_t nxt_http_proto_close[]; 236431Sigor@sysoev.ru 237431Sigor@sysoev.ru 238431Sigor@sysoev.ru #endif /* _NXT_HTTP_H_INCLUDED_ */ 239