1*431Sigor@sysoev.ru 2*431Sigor@sysoev.ru /* 3*431Sigor@sysoev.ru * Copyright (C) Igor Sysoev 4*431Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 5*431Sigor@sysoev.ru */ 6*431Sigor@sysoev.ru 7*431Sigor@sysoev.ru #ifndef _NXT_HTTP_H_INCLUDED_ 8*431Sigor@sysoev.ru #define _NXT_HTTP_H_INCLUDED_ 9*431Sigor@sysoev.ru 10*431Sigor@sysoev.ru 11*431Sigor@sysoev.ru typedef enum { 12*431Sigor@sysoev.ru NXT_HTTP_INVALID = 0, 13*431Sigor@sysoev.ru 14*431Sigor@sysoev.ru NXT_HTTP_OK = 200, 15*431Sigor@sysoev.ru 16*431Sigor@sysoev.ru NXT_HTTP_MULTIPLE_CHOICES = 300, 17*431Sigor@sysoev.ru NXT_HTTP_MOVED_PERMANENTLY = 301, 18*431Sigor@sysoev.ru NXT_HTTP_FOUND = 302, 19*431Sigor@sysoev.ru NXT_HTTP_SEE_OTHER = 303, 20*431Sigor@sysoev.ru NXT_HTTP_NOT_MODIFIED = 304, 21*431Sigor@sysoev.ru 22*431Sigor@sysoev.ru NXT_HTTP_BAD_REQUEST = 400, 23*431Sigor@sysoev.ru NXT_HTTP_LENGTH_REQUIRED = 411, 24*431Sigor@sysoev.ru NXT_HTTP_PAYLOAD_TOO_LARGE = 413, 25*431Sigor@sysoev.ru NXT_HTTP_URI_TOO_LONG = 414, 26*431Sigor@sysoev.ru NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431, 27*431Sigor@sysoev.ru 28*431Sigor@sysoev.ru NXT_HTTP_INTERNAL_SERVER_ERROR = 500, 29*431Sigor@sysoev.ru NXT_HTTP_NOT_IMPLEMENTED = 501, 30*431Sigor@sysoev.ru NXT_HTTP_BAD_GATEWAY = 502, 31*431Sigor@sysoev.ru NXT_HTTP_SERVICE_UNAVAILABLE = 503, 32*431Sigor@sysoev.ru NXT_HTTP_GATEWAY_TIMEOUT = 504, 33*431Sigor@sysoev.ru } nxt_http_status_t; 34*431Sigor@sysoev.ru 35*431Sigor@sysoev.ru 36*431Sigor@sysoev.ru typedef enum { 37*431Sigor@sysoev.ru NXT_HTTP_TE_NONE = 0, 38*431Sigor@sysoev.ru NXT_HTTP_TE_CHUNKED = 1, 39*431Sigor@sysoev.ru NXT_HTTP_TE_UNSUPPORTED = 2, 40*431Sigor@sysoev.ru } nxt_http_te_t; 41*431Sigor@sysoev.ru 42*431Sigor@sysoev.ru 43*431Sigor@sysoev.ru typedef struct { 44*431Sigor@sysoev.ru nxt_work_handler_t ready_handler; 45*431Sigor@sysoev.ru nxt_work_handler_t error_handler; 46*431Sigor@sysoev.ru } nxt_http_request_state_t; 47*431Sigor@sysoev.ru 48*431Sigor@sysoev.ru 49*431Sigor@sysoev.ru typedef struct nxt_http_request_s nxt_http_request_t; 50*431Sigor@sysoev.ru 51*431Sigor@sysoev.ru 52*431Sigor@sysoev.ru typedef struct { 53*431Sigor@sysoev.ru nxt_http_request_parse_t parser; 54*431Sigor@sysoev.ru 55*431Sigor@sysoev.ru uint8_t nbuffers; 56*431Sigor@sysoev.ru uint8_t keepalive; /* 1 bit */ 57*431Sigor@sysoev.ru uint8_t chunked; /* 1 bit */ 58*431Sigor@sysoev.ru nxt_http_te_t transfer_encoding:8; /* 2 bits */ 59*431Sigor@sysoev.ru 60*431Sigor@sysoev.ru nxt_http_request_t *request; 61*431Sigor@sysoev.ru nxt_conn_t *conn; 62*431Sigor@sysoev.ru nxt_buf_t *buffers; 63*431Sigor@sysoev.ru } nxt_h1proto_t; 64*431Sigor@sysoev.ru 65*431Sigor@sysoev.ru 66*431Sigor@sysoev.ru typedef union { 67*431Sigor@sysoev.ru void *any; 68*431Sigor@sysoev.ru nxt_h1proto_t *h1; 69*431Sigor@sysoev.ru } nxt_http_proto_t; 70*431Sigor@sysoev.ru 71*431Sigor@sysoev.ru 72*431Sigor@sysoev.ru #define nxt_http_field_name_set(_field, _name) \ 73*431Sigor@sysoev.ru do { \ 74*431Sigor@sysoev.ru (_field)->name_length = sizeof(_name) - 1; \ 75*431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 76*431Sigor@sysoev.ru } while (0) 77*431Sigor@sysoev.ru 78*431Sigor@sysoev.ru 79*431Sigor@sysoev.ru #define nxt_http_field_set(_field, _name, _value) \ 80*431Sigor@sysoev.ru do { \ 81*431Sigor@sysoev.ru (_field)->name_length = sizeof(_name) - 1; \ 82*431Sigor@sysoev.ru (_field)->value_length = sizeof(_value) - 1; \ 83*431Sigor@sysoev.ru (_field)->name = (u_char *) _name; \ 84*431Sigor@sysoev.ru (_field)->value = (u_char *) _value; \ 85*431Sigor@sysoev.ru } while (0) 86*431Sigor@sysoev.ru 87*431Sigor@sysoev.ru 88*431Sigor@sysoev.ru typedef struct { 89*431Sigor@sysoev.ru nxt_list_t *fields; 90*431Sigor@sysoev.ru nxt_http_field_t *content_type; 91*431Sigor@sysoev.ru nxt_http_field_t *content_length; 92*431Sigor@sysoev.ru nxt_off_t content_length_n; 93*431Sigor@sysoev.ru } nxt_http_response_t; 94*431Sigor@sysoev.ru 95*431Sigor@sysoev.ru 96*431Sigor@sysoev.ru struct nxt_http_request_s { 97*431Sigor@sysoev.ru nxt_http_proto_t proto; 98*431Sigor@sysoev.ru nxt_socket_conf_t *socket_conf; 99*431Sigor@sysoev.ru 100*431Sigor@sysoev.ru nxt_mp_t *mem_pool; 101*431Sigor@sysoev.ru 102*431Sigor@sysoev.ru nxt_buf_t *body; 103*431Sigor@sysoev.ru nxt_buf_t *out; 104*431Sigor@sysoev.ru const nxt_http_request_state_t *state; 105*431Sigor@sysoev.ru 106*431Sigor@sysoev.ru nxt_str_t target; 107*431Sigor@sysoev.ru nxt_str_t version; 108*431Sigor@sysoev.ru nxt_str_t *method; 109*431Sigor@sysoev.ru nxt_str_t *path; 110*431Sigor@sysoev.ru nxt_str_t *args; 111*431Sigor@sysoev.ru 112*431Sigor@sysoev.ru nxt_list_t *fields; 113*431Sigor@sysoev.ru nxt_http_field_t *host; 114*431Sigor@sysoev.ru nxt_http_field_t *content_type; 115*431Sigor@sysoev.ru nxt_http_field_t *content_length; 116*431Sigor@sysoev.ru nxt_http_field_t *cookie; 117*431Sigor@sysoev.ru nxt_off_t content_length_n; 118*431Sigor@sysoev.ru nxt_off_t rest_length; 119*431Sigor@sysoev.ru 120*431Sigor@sysoev.ru nxt_sockaddr_t *remote; 121*431Sigor@sysoev.ru nxt_sockaddr_t *local; 122*431Sigor@sysoev.ru 123*431Sigor@sysoev.ru nxt_http_response_t resp; 124*431Sigor@sysoev.ru 125*431Sigor@sysoev.ru nxt_http_status_t status:16; 126*431Sigor@sysoev.ru 127*431Sigor@sysoev.ru uint8_t protocol; /* 2 bits */ 128*431Sigor@sysoev.ru uint8_t logged; /* 1 bit */ 129*431Sigor@sysoev.ru uint8_t header_sent; /* 1 bit */ 130*431Sigor@sysoev.ru }; 131*431Sigor@sysoev.ru 132*431Sigor@sysoev.ru 133*431Sigor@sysoev.ru typedef void (*nxt_http_proto_body_read_t)(nxt_task_t *task, 134*431Sigor@sysoev.ru nxt_http_request_t *r); 135*431Sigor@sysoev.ru typedef void (*nxt_http_proto_local_addr_t)(nxt_task_t *task, 136*431Sigor@sysoev.ru nxt_http_request_t *r); 137*431Sigor@sysoev.ru typedef void (*nxt_http_proto_header_send_t)(nxt_task_t *task, 138*431Sigor@sysoev.ru nxt_http_request_t *r); 139*431Sigor@sysoev.ru typedef void (*nxt_http_proto_send_t)(nxt_task_t *task, nxt_http_request_t *r, 140*431Sigor@sysoev.ru nxt_buf_t *out); 141*431Sigor@sysoev.ru typedef void (*nxt_http_proto_close_t)(nxt_task_t *task, 142*431Sigor@sysoev.ru nxt_http_proto_t proto); 143*431Sigor@sysoev.ru 144*431Sigor@sysoev.ru 145*431Sigor@sysoev.ru nxt_int_t nxt_http_init(nxt_task_t *task, nxt_runtime_t *rt); 146*431Sigor@sysoev.ru nxt_int_t nxt_h1p_init(nxt_task_t *task, nxt_runtime_t *rt); 147*431Sigor@sysoev.ru nxt_int_t nxt_http_response_hash_init(nxt_task_t *task, nxt_runtime_t *rt); 148*431Sigor@sysoev.ru 149*431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data); 150*431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task); 151*431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r, 152*431Sigor@sysoev.ru nxt_http_status_t status); 153*431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r); 154*431Sigor@sysoev.ru void nxt_http_request_local_addr(nxt_task_t *task, nxt_http_request_t *r); 155*431Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r); 156*431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r, 157*431Sigor@sysoev.ru nxt_buf_t *out); 158*431Sigor@sysoev.ru void nxt_http_request_release(nxt_task_t *task, nxt_http_request_t *r); 159*431Sigor@sysoev.ru nxt_buf_t *nxt_http_request_last_buffer(nxt_task_t *task, 160*431Sigor@sysoev.ru nxt_http_request_t *r); 161*431Sigor@sysoev.ru void nxt_http_request_close_handler(nxt_task_t *task, void *obj, void *data); 162*431Sigor@sysoev.ru 163*431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field, 164*431Sigor@sysoev.ru uintptr_t data); 165*431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field, 166*431Sigor@sysoev.ru uintptr_t offset); 167*431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field, 168*431Sigor@sysoev.ru uintptr_t data); 169*431Sigor@sysoev.ru 170*431Sigor@sysoev.ru 171*431Sigor@sysoev.ru extern nxt_lvlhsh_t nxt_response_fields_hash; 172*431Sigor@sysoev.ru extern const nxt_conn_state_t nxt_router_conn_close_state; 173*431Sigor@sysoev.ru 174*431Sigor@sysoev.ru extern const nxt_http_proto_body_read_t nxt_http_proto_body_read[]; 175*431Sigor@sysoev.ru extern const nxt_http_proto_local_addr_t nxt_http_proto_local_addr[]; 176*431Sigor@sysoev.ru extern const nxt_http_proto_header_send_t nxt_http_proto_header_send[]; 177*431Sigor@sysoev.ru extern const nxt_http_proto_send_t nxt_http_proto_send[]; 178*431Sigor@sysoev.ru extern const nxt_http_proto_close_t nxt_http_proto_close[]; 179*431Sigor@sysoev.ru 180*431Sigor@sysoev.ru 181*431Sigor@sysoev.ru #endif /* _NXT_HTTP_H_INCLUDED_ */ 182