xref: /unit/src/nxt_application.h (revision 113)
10Sigor@sysoev.ru 
20Sigor@sysoev.ru /*
384Smax.romanov@nginx.com  * Copyright (C) Max Romanov
40Sigor@sysoev.ru  * Copyright (C) Valentin V. Bartenev
50Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
60Sigor@sysoev.ru  */
70Sigor@sysoev.ru 
80Sigor@sysoev.ru #ifndef _NXT_APPLICATION_H_INCLUDED_
90Sigor@sysoev.ru #define _NXT_APPLICATION_H_INCLUDED_
100Sigor@sysoev.ru 
110Sigor@sysoev.ru 
120Sigor@sysoev.ru typedef struct {
130Sigor@sysoev.ru     nxt_str_t                  name;
140Sigor@sysoev.ru     nxt_str_t                  value;
150Sigor@sysoev.ru } nxt_app_header_field_t;
160Sigor@sysoev.ru 
170Sigor@sysoev.ru 
180Sigor@sysoev.ru typedef struct {
190Sigor@sysoev.ru     nxt_str_t                  method;
20112Smax.romanov@nginx.com     nxt_str_t                  target;
21112Smax.romanov@nginx.com     nxt_str_t                  version;
220Sigor@sysoev.ru     nxt_str_t                  path;
2384Smax.romanov@nginx.com     nxt_str_t                  query;
2484Smax.romanov@nginx.com 
2584Smax.romanov@nginx.com     nxt_list_t                 *fields;
260Sigor@sysoev.ru 
2784Smax.romanov@nginx.com     nxt_str_t                  cookie;
2884Smax.romanov@nginx.com     nxt_str_t                  content_length;
2984Smax.romanov@nginx.com     nxt_str_t                  content_type;
3084Smax.romanov@nginx.com     nxt_str_t                  host;
3184Smax.romanov@nginx.com 
3284Smax.romanov@nginx.com     off_t                      parsed_content_length;
3384Smax.romanov@nginx.com     nxt_bool_t                 done;
340Sigor@sysoev.ru } nxt_app_request_header_t;
350Sigor@sysoev.ru 
360Sigor@sysoev.ru 
370Sigor@sysoev.ru typedef struct {
3884Smax.romanov@nginx.com     nxt_str_t                  preread;
3984Smax.romanov@nginx.com     nxt_bool_t                 done;
4084Smax.romanov@nginx.com } nxt_app_request_body_t;
410Sigor@sysoev.ru 
420Sigor@sysoev.ru 
4384Smax.romanov@nginx.com typedef struct {
440Sigor@sysoev.ru     nxt_app_request_header_t   header;
4584Smax.romanov@nginx.com     nxt_app_request_body_t     body;
46*113Smax.romanov@nginx.com 
47*113Smax.romanov@nginx.com     nxt_str_t                  remote;
480Sigor@sysoev.ru } nxt_app_request_t;
490Sigor@sysoev.ru 
500Sigor@sysoev.ru 
510Sigor@sysoev.ru typedef struct {
5284Smax.romanov@nginx.com     nxt_app_request_t         r;
5384Smax.romanov@nginx.com     nxt_http_request_parse_t  parser;
5484Smax.romanov@nginx.com     nxt_mp_t                  *mem_pool;
5584Smax.romanov@nginx.com } nxt_app_parse_ctx_t;
5684Smax.romanov@nginx.com 
5784Smax.romanov@nginx.com 
5884Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_init(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
5984Smax.romanov@nginx.com 
6084Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_parse(nxt_task_t *task, nxt_app_parse_ctx_t *ctx,
6184Smax.romanov@nginx.com     nxt_buf_t *buf);
6284Smax.romanov@nginx.com 
6384Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
6484Smax.romanov@nginx.com 
6584Smax.romanov@nginx.com nxt_int_t nxt_app_http_init(nxt_task_t *task, nxt_runtime_t *rt);
6684Smax.romanov@nginx.com 
6784Smax.romanov@nginx.com 
6884Smax.romanov@nginx.com typedef struct nxt_app_wmsg_s  nxt_app_wmsg_t;
6984Smax.romanov@nginx.com typedef struct nxt_app_rmsg_s  nxt_app_rmsg_t;
7084Smax.romanov@nginx.com 
7184Smax.romanov@nginx.com struct nxt_app_wmsg_s {
7284Smax.romanov@nginx.com     nxt_port_t                 *port;  /* where prepared buf will be sent */
7384Smax.romanov@nginx.com     nxt_buf_t                  *write;
7484Smax.romanov@nginx.com     nxt_buf_t                  **buf;
7584Smax.romanov@nginx.com     uint32_t                   stream;
7684Smax.romanov@nginx.com };
7784Smax.romanov@nginx.com 
7884Smax.romanov@nginx.com struct nxt_app_rmsg_s {
7984Smax.romanov@nginx.com     nxt_buf_t                 *buf;   /* current buffer to read */
8084Smax.romanov@nginx.com };
8184Smax.romanov@nginx.com 
8284Smax.romanov@nginx.com 
8384Smax.romanov@nginx.com nxt_inline u_char *
8484Smax.romanov@nginx.com nxt_app_msg_write_length(u_char *dst, size_t length);
8584Smax.romanov@nginx.com 
8684Smax.romanov@nginx.com /* TODO asynchronous mmap buffer assignment */
8784Smax.romanov@nginx.com u_char *nxt_app_msg_write_get_buf(nxt_task_t *task, nxt_app_wmsg_t *msg,
8884Smax.romanov@nginx.com     size_t size);
8984Smax.romanov@nginx.com 
9084Smax.romanov@nginx.com nxt_int_t nxt_app_msg_write(nxt_task_t *task, nxt_app_wmsg_t *msg,
9184Smax.romanov@nginx.com     u_char *c, size_t size);
9284Smax.romanov@nginx.com 
9384Smax.romanov@nginx.com nxt_int_t nxt_app_msg_write_prefixed_upcase(nxt_task_t *task,
9484Smax.romanov@nginx.com     nxt_app_wmsg_t *msg, const nxt_str_t *prefix, const nxt_str_t *v);
9584Smax.romanov@nginx.com 
9684Smax.romanov@nginx.com nxt_inline nxt_int_t
9784Smax.romanov@nginx.com nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
9884Smax.romanov@nginx.com     u_char *n, size_t nsize, u_char *v, size_t vsize);
9984Smax.romanov@nginx.com 
10084Smax.romanov@nginx.com 
10184Smax.romanov@nginx.com #define nxt_app_msg_write_const(task, msg, c)                                 \
10284Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (u_char *)(c), sizeof(c) - 1)
10384Smax.romanov@nginx.com 
10484Smax.romanov@nginx.com #define nxt_app_msg_write_str(task, msg, str)                                 \
10584Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (str)->start, (str)->length)
10684Smax.romanov@nginx.com 
10784Smax.romanov@nginx.com #define nxt_app_msg_write_cstr(task, msg, c)                                  \
10884Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (c), nxt_strlen(c))
10984Smax.romanov@nginx.com 
11084Smax.romanov@nginx.com #define nxt_app_msg_write_nvp(task, msg, n, v)                                \
11184Smax.romanov@nginx.com     nxt_app_msg_write_nvp_((task), (msg), (u_char *)(n), sizeof(n) - 1,       \
11284Smax.romanov@nginx.com                            (v)->start, (v)->length)
11384Smax.romanov@nginx.com 
11484Smax.romanov@nginx.com nxt_inline nxt_int_t nxt_app_msg_write_size(nxt_task_t *task,
11584Smax.romanov@nginx.com     nxt_app_wmsg_t *msg, size_t size);
11684Smax.romanov@nginx.com 
11784Smax.romanov@nginx.com nxt_int_t nxt_app_msg_flush(nxt_task_t *task, nxt_app_wmsg_t *msg,
11884Smax.romanov@nginx.com     nxt_bool_t last);
11984Smax.romanov@nginx.com 
12084Smax.romanov@nginx.com nxt_int_t nxt_app_msg_write_raw(nxt_task_t *task, nxt_app_wmsg_t *msg,
12184Smax.romanov@nginx.com     const u_char *c, size_t size);
12284Smax.romanov@nginx.com 
12384Smax.romanov@nginx.com nxt_int_t nxt_app_msg_read_str(nxt_task_t *task, nxt_app_rmsg_t *msg,
12484Smax.romanov@nginx.com     nxt_str_t *str);
12584Smax.romanov@nginx.com 
12684Smax.romanov@nginx.com nxt_int_t nxt_app_msg_read_nvp(nxt_task_t *task, nxt_app_rmsg_t *rmsg,
12784Smax.romanov@nginx.com     nxt_str_t *n, nxt_str_t *v);
12884Smax.romanov@nginx.com 
12984Smax.romanov@nginx.com nxt_int_t nxt_app_msg_read_size(nxt_task_t *task, nxt_app_rmsg_t *rmsg,
13084Smax.romanov@nginx.com     size_t *size);
13184Smax.romanov@nginx.com 
13284Smax.romanov@nginx.com 
13384Smax.romanov@nginx.com typedef struct {
13484Smax.romanov@nginx.com     nxt_int_t                  (*init)(nxt_task_t *task);
13584Smax.romanov@nginx.com     nxt_int_t                  (*prepare_msg)(nxt_task_t *task,
13684Smax.romanov@nginx.com                                     nxt_app_request_t *r,
13784Smax.romanov@nginx.com                                     nxt_app_wmsg_t *wmsg);
13884Smax.romanov@nginx.com     nxt_int_t                  (*run)(nxt_task_t *task,
13984Smax.romanov@nginx.com                                     nxt_app_rmsg_t *rmsg,
14084Smax.romanov@nginx.com                                     nxt_app_wmsg_t *wmsg);
1410Sigor@sysoev.ru } nxt_application_module_t;
1420Sigor@sysoev.ru 
1430Sigor@sysoev.ru 
14421Sigor@sysoev.ru extern nxt_application_module_t  *nxt_app;
14521Sigor@sysoev.ru 
1460Sigor@sysoev.ru 
1470Sigor@sysoev.ru 
14820Sigor@sysoev.ru nxt_int_t nxt_app_http_read_body(nxt_app_request_t *r, u_char *data,
14920Sigor@sysoev.ru     size_t len);
1500Sigor@sysoev.ru nxt_int_t nxt_app_write(nxt_app_request_t *r, const u_char *data, size_t len);
1510Sigor@sysoev.ru 
15284Smax.romanov@nginx.com nxt_inline u_char *
15384Smax.romanov@nginx.com nxt_app_msg_write_length(u_char *dst, size_t length)
15484Smax.romanov@nginx.com {
15584Smax.romanov@nginx.com     if (length < 128) {
15684Smax.romanov@nginx.com         *dst = length;
15784Smax.romanov@nginx.com         dst++;
15884Smax.romanov@nginx.com     } else {
15984Smax.romanov@nginx.com         dst[0] = 0x80U | (length >> 24);
16084Smax.romanov@nginx.com         dst[1] = 0xFFU & (length >> 16);
16184Smax.romanov@nginx.com         dst[2] = 0xFFU & (length >> 8);
16284Smax.romanov@nginx.com         dst[3] = 0xFFU & length;
16384Smax.romanov@nginx.com         dst += 4;
16484Smax.romanov@nginx.com     }
16584Smax.romanov@nginx.com 
16684Smax.romanov@nginx.com     return dst;
16784Smax.romanov@nginx.com }
16884Smax.romanov@nginx.com 
16984Smax.romanov@nginx.com 
17084Smax.romanov@nginx.com nxt_inline nxt_int_t
17184Smax.romanov@nginx.com nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
17284Smax.romanov@nginx.com     u_char *n, size_t nsize, u_char *v, size_t vsize)
17384Smax.romanov@nginx.com {
17484Smax.romanov@nginx.com     nxt_int_t rc;
17584Smax.romanov@nginx.com 
17684Smax.romanov@nginx.com     rc = nxt_app_msg_write(task, msg, n, nsize);
17784Smax.romanov@nginx.com     if (nxt_slow_path(rc != NXT_OK)) {
17884Smax.romanov@nginx.com         return rc;
17984Smax.romanov@nginx.com     }
18084Smax.romanov@nginx.com 
18184Smax.romanov@nginx.com     return nxt_app_msg_write(task, msg, v, vsize);
18284Smax.romanov@nginx.com }
18384Smax.romanov@nginx.com 
18484Smax.romanov@nginx.com 
18584Smax.romanov@nginx.com nxt_inline nxt_int_t
18684Smax.romanov@nginx.com nxt_app_msg_write_size(nxt_task_t *task, nxt_app_wmsg_t *msg, size_t size)
18784Smax.romanov@nginx.com {
18884Smax.romanov@nginx.com     u_char  *dst;
18984Smax.romanov@nginx.com     size_t  dst_length;
19084Smax.romanov@nginx.com 
19184Smax.romanov@nginx.com     dst_length = size < 128 ? 1 : 4;
19284Smax.romanov@nginx.com 
19384Smax.romanov@nginx.com     dst = nxt_app_msg_write_get_buf(task, msg, dst_length);
19484Smax.romanov@nginx.com     if (nxt_slow_path(dst == NULL)) {
19584Smax.romanov@nginx.com         return NXT_ERROR;
19684Smax.romanov@nginx.com     }
19784Smax.romanov@nginx.com 
19884Smax.romanov@nginx.com     nxt_app_msg_write_length(dst, size);
19984Smax.romanov@nginx.com 
20084Smax.romanov@nginx.com     return NXT_OK;
20184Smax.romanov@nginx.com }
20284Smax.romanov@nginx.com 
20384Smax.romanov@nginx.com 
20484Smax.romanov@nginx.com nxt_inline u_char *
20584Smax.romanov@nginx.com nxt_app_msg_read_length(u_char *src, size_t *length)
20684Smax.romanov@nginx.com {
20784Smax.romanov@nginx.com     if (src[0] < 128) {
20884Smax.romanov@nginx.com         *length = src[0];
20984Smax.romanov@nginx.com         src++;
21084Smax.romanov@nginx.com     } else {
21184Smax.romanov@nginx.com         *length = ((src[0] & 0x7fU) << 24) +
21284Smax.romanov@nginx.com                   (src[1] << 16) +
21384Smax.romanov@nginx.com                   (src[2] << 8) +
21484Smax.romanov@nginx.com                   src[3];
21584Smax.romanov@nginx.com         src += 4;
21684Smax.romanov@nginx.com     }
21784Smax.romanov@nginx.com 
21884Smax.romanov@nginx.com     return src;
21984Smax.romanov@nginx.com }
22084Smax.romanov@nginx.com 
2210Sigor@sysoev.ru 
2220Sigor@sysoev.ru #endif /* _NXT_APPLICATION_H_INCLIDED_ */
223