diff options
author | Igor Sysoev <igor@sysoev.ru> | 2017-12-28 16:01:06 +0300 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2017-12-28 16:01:06 +0300 |
commit | 9a6d3c5775d945509c7c2cbec48be59757da42c3 (patch) | |
tree | 7129c13d6027a45e1a324deab373125bd7a14794 /src/nxt_http.h | |
parent | 497faf1b9abb188cab40c389a9e6221add5dd496 (diff) | |
download | unit-9a6d3c5775d945509c7c2cbec48be59757da42c3.tar.gz unit-9a6d3c5775d945509c7c2cbec48be59757da42c3.tar.bz2 |
HTTP keep-alive connections support.
Diffstat (limited to 'src/nxt_http.h')
-rw-r--r-- | src/nxt_http.h | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/src/nxt_http.h b/src/nxt_http.h new file mode 100644 index 00000000..c6704d68 --- /dev/null +++ b/src/nxt_http.h @@ -0,0 +1,181 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#ifndef _NXT_HTTP_H_INCLUDED_ +#define _NXT_HTTP_H_INCLUDED_ + + +typedef enum { + NXT_HTTP_INVALID = 0, + + NXT_HTTP_OK = 200, + + NXT_HTTP_MULTIPLE_CHOICES = 300, + NXT_HTTP_MOVED_PERMANENTLY = 301, + NXT_HTTP_FOUND = 302, + NXT_HTTP_SEE_OTHER = 303, + NXT_HTTP_NOT_MODIFIED = 304, + + NXT_HTTP_BAD_REQUEST = 400, + NXT_HTTP_LENGTH_REQUIRED = 411, + NXT_HTTP_PAYLOAD_TOO_LARGE = 413, + NXT_HTTP_URI_TOO_LONG = 414, + NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431, + + NXT_HTTP_INTERNAL_SERVER_ERROR = 500, + NXT_HTTP_NOT_IMPLEMENTED = 501, + NXT_HTTP_BAD_GATEWAY = 502, + NXT_HTTP_SERVICE_UNAVAILABLE = 503, + NXT_HTTP_GATEWAY_TIMEOUT = 504, +} nxt_http_status_t; + + +typedef enum { + NXT_HTTP_TE_NONE = 0, + NXT_HTTP_TE_CHUNKED = 1, + NXT_HTTP_TE_UNSUPPORTED = 2, +} nxt_http_te_t; + + +typedef struct { + nxt_work_handler_t ready_handler; + nxt_work_handler_t error_handler; +} nxt_http_request_state_t; + + +typedef struct nxt_http_request_s nxt_http_request_t; + + +typedef struct { + nxt_http_request_parse_t parser; + + uint8_t nbuffers; + uint8_t keepalive; /* 1 bit */ + uint8_t chunked; /* 1 bit */ + nxt_http_te_t transfer_encoding:8; /* 2 bits */ + + nxt_http_request_t *request; + nxt_conn_t *conn; + nxt_buf_t *buffers; +} nxt_h1proto_t; + + +typedef union { + void *any; + nxt_h1proto_t *h1; +} nxt_http_proto_t; + + +#define nxt_http_field_name_set(_field, _name) \ + do { \ + (_field)->name_length = sizeof(_name) - 1; \ + (_field)->name = (u_char *) _name; \ + } while (0) + + +#define nxt_http_field_set(_field, _name, _value) \ + do { \ + (_field)->name_length = sizeof(_name) - 1; \ + (_field)->value_length = sizeof(_value) - 1; \ + (_field)->name = (u_char *) _name; \ + (_field)->value = (u_char *) _value; \ + } while (0) + + +typedef struct { + nxt_list_t *fields; + nxt_http_field_t *content_type; + nxt_http_field_t *content_length; + nxt_off_t content_length_n; +} nxt_http_response_t; + + +struct nxt_http_request_s { + nxt_http_proto_t proto; + nxt_socket_conf_t *socket_conf; + + nxt_mp_t *mem_pool; + + nxt_buf_t *body; + nxt_buf_t *out; + const nxt_http_request_state_t *state; + + nxt_str_t target; + nxt_str_t version; + nxt_str_t *method; + nxt_str_t *path; + nxt_str_t *args; + + nxt_list_t *fields; + nxt_http_field_t *host; + nxt_http_field_t *content_type; + nxt_http_field_t *content_length; + nxt_http_field_t *cookie; + nxt_off_t content_length_n; + nxt_off_t rest_length; + + nxt_sockaddr_t *remote; + nxt_sockaddr_t *local; + + nxt_http_response_t resp; + + nxt_http_status_t status:16; + + uint8_t protocol; /* 2 bits */ + uint8_t logged; /* 1 bit */ + uint8_t header_sent; /* 1 bit */ +}; + + +typedef void (*nxt_http_proto_body_read_t)(nxt_task_t *task, + nxt_http_request_t *r); +typedef void (*nxt_http_proto_local_addr_t)(nxt_task_t *task, + nxt_http_request_t *r); +typedef void (*nxt_http_proto_header_send_t)(nxt_task_t *task, + nxt_http_request_t *r); +typedef void (*nxt_http_proto_send_t)(nxt_task_t *task, nxt_http_request_t *r, + nxt_buf_t *out); +typedef void (*nxt_http_proto_close_t)(nxt_task_t *task, + nxt_http_proto_t proto); + + +nxt_int_t nxt_http_init(nxt_task_t *task, nxt_runtime_t *rt); +nxt_int_t nxt_h1p_init(nxt_task_t *task, nxt_runtime_t *rt); +nxt_int_t nxt_http_response_hash_init(nxt_task_t *task, nxt_runtime_t *rt); + +void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data); +nxt_http_request_t *nxt_http_request_create(nxt_task_t *task); +void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r, + nxt_http_status_t status); +void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r); +void nxt_http_request_local_addr(nxt_task_t *task, nxt_http_request_t *r); +void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r); +void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r, + nxt_buf_t *out); +void nxt_http_request_release(nxt_task_t *task, nxt_http_request_t *r); +nxt_buf_t *nxt_http_request_last_buffer(nxt_task_t *task, + nxt_http_request_t *r); +void nxt_http_request_close_handler(nxt_task_t *task, void *obj, void *data); + +nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field, + uintptr_t data); +nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field, + uintptr_t offset); +nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field, + uintptr_t data); + + +extern nxt_lvlhsh_t nxt_response_fields_hash; +extern const nxt_conn_state_t nxt_router_conn_close_state; + +extern const nxt_http_proto_body_read_t nxt_http_proto_body_read[]; +extern const nxt_http_proto_local_addr_t nxt_http_proto_local_addr[]; +extern const nxt_http_proto_header_send_t nxt_http_proto_header_send[]; +extern const nxt_http_proto_send_t nxt_http_proto_send[]; +extern const nxt_http_proto_close_t nxt_http_proto_close[]; + + +#endif /* _NXT_HTTP_H_INCLUDED_ */ |