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