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, 15431Sigor@sysoev.ru 16431Sigor@sysoev.ru NXT_HTTP_MULTIPLE_CHOICES = 300, 17431Sigor@sysoev.ru NXT_HTTP_MOVED_PERMANENTLY = 301, 18431Sigor@sysoev.ru NXT_HTTP_FOUND = 302, 19431Sigor@sysoev.ru NXT_HTTP_SEE_OTHER = 303, 20431Sigor@sysoev.ru NXT_HTTP_NOT_MODIFIED = 304, 21431Sigor@sysoev.ru 22431Sigor@sysoev.ru NXT_HTTP_BAD_REQUEST = 400, 23624Sigor@sysoev.ru NXT_HTTP_REQUEST_TIMEOUT = 408, 24431Sigor@sysoev.ru NXT_HTTP_LENGTH_REQUIRED = 411, 25431Sigor@sysoev.ru NXT_HTTP_PAYLOAD_TOO_LARGE = 413, 26431Sigor@sysoev.ru NXT_HTTP_URI_TOO_LONG = 414, 27431Sigor@sysoev.ru NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431, 28431Sigor@sysoev.ru 29431Sigor@sysoev.ru NXT_HTTP_INTERNAL_SERVER_ERROR = 500, 30431Sigor@sysoev.ru NXT_HTTP_NOT_IMPLEMENTED = 501, 31431Sigor@sysoev.ru NXT_HTTP_BAD_GATEWAY = 502, 32431Sigor@sysoev.ru NXT_HTTP_SERVICE_UNAVAILABLE = 503, 33431Sigor@sysoev.ru NXT_HTTP_GATEWAY_TIMEOUT = 504, 34482Svbart@nginx.com NXT_HTTP_VERSION_NOT_SUPPORTED = 505, 35431Sigor@sysoev.ru } nxt_http_status_t; 36431Sigor@sysoev.ru 37431Sigor@sysoev.ru 38431Sigor@sysoev.ru typedef enum { 39431Sigor@sysoev.ru NXT_HTTP_TE_NONE = 0, 40431Sigor@sysoev.ru NXT_HTTP_TE_CHUNKED = 1, 41431Sigor@sysoev.ru NXT_HTTP_TE_UNSUPPORTED = 2, 42431Sigor@sysoev.ru } nxt_http_te_t; 43431Sigor@sysoev.ru 44431Sigor@sysoev.ru 45431Sigor@sysoev.ru typedef struct { 46431Sigor@sysoev.ru nxt_work_handler_t ready_handler; 47431Sigor@sysoev.ru nxt_work_handler_t error_handler; 48431Sigor@sysoev.ru } nxt_http_request_state_t; 49431Sigor@sysoev.ru 50431Sigor@sysoev.ru 51431Sigor@sysoev.ru typedef struct { 52431Sigor@sysoev.ru nxt_http_request_parse_t parser; 53431Sigor@sysoev.ru 54431Sigor@sysoev.ru uint8_t nbuffers; 55431Sigor@sysoev.ru uint8_t keepalive; /* 1 bit */ 56431Sigor@sysoev.ru uint8_t chunked; /* 1 bit */ 57431Sigor@sysoev.ru nxt_http_te_t transfer_encoding:8; /* 2 bits */ 58431Sigor@sysoev.ru 59*630Svbart@nginx.com uint32_t header_size; 60*630Svbart@nginx.com 61431Sigor@sysoev.ru nxt_http_request_t *request; 62452Sigor@sysoev.ru nxt_buf_t *buffers; 63452Sigor@sysoev.ru /* 64452Sigor@sysoev.ru * All fields before the conn field will 65452Sigor@sysoev.ru * be zeroed in a keep-alive connection. 66452Sigor@sysoev.ru */ 67431Sigor@sysoev.ru nxt_conn_t *conn; 68431Sigor@sysoev.ru } nxt_h1proto_t; 69431Sigor@sysoev.ru 70431Sigor@sysoev.ru 71431Sigor@sysoev.ru typedef union { 72431Sigor@sysoev.ru void *any; 73431Sigor@sysoev.ru nxt_h1proto_t *h1; 74431Sigor@sysoev.ru } nxt_http_proto_t; 75431Sigor@sysoev.ru 76431Sigor@sysoev.ru 77431Sigor@sysoev.ru #define nxt_http_field_name_set(_field, _name) \ 78431Sigor@sysoev.ru do { \ 79431Sigor@sysoev.ru (_field)->name_length = sizeof(_name) - 1; \ 80431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 81431Sigor@sysoev.ru } while (0) 82431Sigor@sysoev.ru 83431Sigor@sysoev.ru 84431Sigor@sysoev.ru #define nxt_http_field_set(_field, _name, _value) \ 85431Sigor@sysoev.ru do { \ 86431Sigor@sysoev.ru (_field)->name_length = sizeof(_name) - 1; \ 87431Sigor@sysoev.ru (_field)->value_length = sizeof(_value) - 1; \ 88431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 89431Sigor@sysoev.ru (_field)->value = (u_char *) _value; \ 90431Sigor@sysoev.ru } while (0) 91431Sigor@sysoev.ru 92431Sigor@sysoev.ru 93431Sigor@sysoev.ru typedef struct { 94431Sigor@sysoev.ru nxt_list_t *fields; 95543Svbart@nginx.com nxt_http_field_t *date; 96431Sigor@sysoev.ru nxt_http_field_t *content_type; 97431Sigor@sysoev.ru nxt_http_field_t *content_length; 98431Sigor@sysoev.ru nxt_off_t content_length_n; 99431Sigor@sysoev.ru } nxt_http_response_t; 100431Sigor@sysoev.ru 101431Sigor@sysoev.ru 102431Sigor@sysoev.ru struct nxt_http_request_s { 103431Sigor@sysoev.ru nxt_http_proto_t proto; 104431Sigor@sysoev.ru nxt_socket_conf_t *socket_conf; 105431Sigor@sysoev.ru 106431Sigor@sysoev.ru nxt_mp_t *mem_pool; 107431Sigor@sysoev.ru 108431Sigor@sysoev.ru nxt_buf_t *body; 109431Sigor@sysoev.ru nxt_buf_t *out; 110431Sigor@sysoev.ru const nxt_http_request_state_t *state; 111431Sigor@sysoev.ru 112431Sigor@sysoev.ru nxt_str_t target; 113431Sigor@sysoev.ru nxt_str_t version; 114431Sigor@sysoev.ru nxt_str_t *method; 115431Sigor@sysoev.ru nxt_str_t *path; 116431Sigor@sysoev.ru nxt_str_t *args; 117431Sigor@sysoev.ru 118431Sigor@sysoev.ru nxt_list_t *fields; 119431Sigor@sysoev.ru nxt_http_field_t *host; 120431Sigor@sysoev.ru nxt_http_field_t *content_type; 121431Sigor@sysoev.ru nxt_http_field_t *content_length; 122431Sigor@sysoev.ru nxt_http_field_t *cookie; 123*630Svbart@nginx.com nxt_http_field_t *referer; 124*630Svbart@nginx.com nxt_http_field_t *user_agent; 125431Sigor@sysoev.ru nxt_off_t content_length_n; 126431Sigor@sysoev.ru 127431Sigor@sysoev.ru nxt_sockaddr_t *remote; 128431Sigor@sysoev.ru nxt_sockaddr_t *local; 129431Sigor@sysoev.ru 130608Sigor@sysoev.ru nxt_buf_t *last; 131608Sigor@sysoev.ru 132431Sigor@sysoev.ru nxt_http_response_t resp; 133431Sigor@sysoev.ru 134431Sigor@sysoev.ru nxt_http_status_t status:16; 135431Sigor@sysoev.ru 136431Sigor@sysoev.ru uint8_t protocol; /* 2 bits */ 137431Sigor@sysoev.ru uint8_t logged; /* 1 bit */ 138431Sigor@sysoev.ru uint8_t header_sent; /* 1 bit */ 139608Sigor@sysoev.ru uint8_t error; /* 1 bit */ 140431Sigor@sysoev.ru }; 141431Sigor@sysoev.ru 142431Sigor@sysoev.ru 143431Sigor@sysoev.ru typedef void (*nxt_http_proto_body_read_t)(nxt_task_t *task, 144431Sigor@sysoev.ru nxt_http_request_t *r); 145431Sigor@sysoev.ru typedef void (*nxt_http_proto_local_addr_t)(nxt_task_t *task, 146431Sigor@sysoev.ru nxt_http_request_t *r); 147431Sigor@sysoev.ru typedef void (*nxt_http_proto_header_send_t)(nxt_task_t *task, 148431Sigor@sysoev.ru nxt_http_request_t *r); 149431Sigor@sysoev.ru typedef void (*nxt_http_proto_send_t)(nxt_task_t *task, nxt_http_request_t *r, 150431Sigor@sysoev.ru nxt_buf_t *out); 151*630Svbart@nginx.com typedef nxt_off_t (*nxt_http_proto_body_bytes_sent_t)(nxt_task_t *task, 152*630Svbart@nginx.com nxt_http_proto_t proto); 153608Sigor@sysoev.ru typedef void (*nxt_http_proto_discard_t)(nxt_task_t *task, 154608Sigor@sysoev.ru nxt_http_request_t *r, nxt_buf_t *last); 155431Sigor@sysoev.ru typedef void (*nxt_http_proto_close_t)(nxt_task_t *task, 156431Sigor@sysoev.ru nxt_http_proto_t proto); 157431Sigor@sysoev.ru 158431Sigor@sysoev.ru 159431Sigor@sysoev.ru nxt_int_t nxt_http_init(nxt_task_t *task, nxt_runtime_t *rt); 160431Sigor@sysoev.ru nxt_int_t nxt_h1p_init(nxt_task_t *task, nxt_runtime_t *rt); 161431Sigor@sysoev.ru nxt_int_t nxt_http_response_hash_init(nxt_task_t *task, nxt_runtime_t *rt); 162431Sigor@sysoev.ru 163431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data); 164431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task); 165431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r, 166431Sigor@sysoev.ru nxt_http_status_t status); 167431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r); 168431Sigor@sysoev.ru void nxt_http_request_local_addr(nxt_task_t *task, nxt_http_request_t *r); 169431Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r); 170431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r, 171431Sigor@sysoev.ru nxt_buf_t *out); 172608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r, 173608Sigor@sysoev.ru size_t size); 174608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r); 175608Sigor@sysoev.ru void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data); 176431Sigor@sysoev.ru void nxt_http_request_close_handler(nxt_task_t *task, void *obj, void *data); 177431Sigor@sysoev.ru 178431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field, 179431Sigor@sysoev.ru uintptr_t data); 180431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field, 181431Sigor@sysoev.ru uintptr_t offset); 182431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field, 183431Sigor@sysoev.ru uintptr_t data); 184431Sigor@sysoev.ru 185431Sigor@sysoev.ru 186431Sigor@sysoev.ru extern nxt_lvlhsh_t nxt_response_fields_hash; 187431Sigor@sysoev.ru extern const nxt_conn_state_t nxt_router_conn_close_state; 188431Sigor@sysoev.ru 189*630Svbart@nginx.com extern const nxt_http_proto_body_read_t nxt_http_proto_body_read[]; 190*630Svbart@nginx.com extern const nxt_http_proto_local_addr_t nxt_http_proto_local_addr[]; 191*630Svbart@nginx.com extern const nxt_http_proto_header_send_t nxt_http_proto_header_send[]; 192*630Svbart@nginx.com extern const nxt_http_proto_send_t nxt_http_proto_send[]; 193*630Svbart@nginx.com extern const nxt_http_proto_body_bytes_sent_t nxt_http_proto_body_bytes_sent[]; 194*630Svbart@nginx.com extern const nxt_http_proto_discard_t nxt_http_proto_discard[]; 195*630Svbart@nginx.com extern const nxt_http_proto_close_t nxt_http_proto_close[]; 196431Sigor@sysoev.ru 197431Sigor@sysoev.ru 198431Sigor@sysoev.ru #endif /* _NXT_HTTP_H_INCLUDED_ */ 199