xref: /unit/src/nxt_application.h (revision 141)
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 
12133Sigor@sysoev.ru typedef enum {
13*141Smax.romanov@nginx.com     NXT_APP_UNKNOWN = 0,
14*141Smax.romanov@nginx.com     NXT_APP_PYTHON,
15*141Smax.romanov@nginx.com     NXT_APP_PYTHON2,
16*141Smax.romanov@nginx.com     NXT_APP_PYTHON3,
17133Sigor@sysoev.ru     NXT_APP_PHP,
18*141Smax.romanov@nginx.com     NXT_APP_PHP5,
19*141Smax.romanov@nginx.com     NXT_APP_PHP7,
20133Sigor@sysoev.ru     NXT_APP_RUBY,
21133Sigor@sysoev.ru     NXT_APP_GO,
22*141Smax.romanov@nginx.com 
23*141Smax.romanov@nginx.com     NXT_APP_MAX,
24133Sigor@sysoev.ru } nxt_app_type_t;
25133Sigor@sysoev.ru 
26133Sigor@sysoev.ru 
27*141Smax.romanov@nginx.com typedef struct nxt_common_app_conf_s nxt_common_app_conf_t;
28*141Smax.romanov@nginx.com 
29*141Smax.romanov@nginx.com 
30*141Smax.romanov@nginx.com typedef struct {
31*141Smax.romanov@nginx.com     nxt_str_t  path;
32*141Smax.romanov@nginx.com     nxt_str_t  module;
33*141Smax.romanov@nginx.com } nxt_python_app_conf_t;
34*141Smax.romanov@nginx.com 
35*141Smax.romanov@nginx.com 
36*141Smax.romanov@nginx.com typedef struct {
37*141Smax.romanov@nginx.com     nxt_str_t  root;
38*141Smax.romanov@nginx.com     nxt_str_t  script;
39*141Smax.romanov@nginx.com     nxt_str_t  index;
40*141Smax.romanov@nginx.com } nxt_php_app_conf_t;
41*141Smax.romanov@nginx.com 
42*141Smax.romanov@nginx.com 
43*141Smax.romanov@nginx.com typedef struct {
44*141Smax.romanov@nginx.com     nxt_str_t  executable;
45*141Smax.romanov@nginx.com } nxt_go_app_conf_t;
46*141Smax.romanov@nginx.com 
47*141Smax.romanov@nginx.com 
48*141Smax.romanov@nginx.com struct nxt_common_app_conf_s {
49*141Smax.romanov@nginx.com     nxt_str_t       type;
50*141Smax.romanov@nginx.com     nxt_app_type_t  type_id;
51*141Smax.romanov@nginx.com     nxt_str_t       user;
52*141Smax.romanov@nginx.com     nxt_str_t       group;
53*141Smax.romanov@nginx.com 
54*141Smax.romanov@nginx.com     uint32_t   workers;
55*141Smax.romanov@nginx.com 
56*141Smax.romanov@nginx.com     union {
57*141Smax.romanov@nginx.com         nxt_python_app_conf_t  python;
58*141Smax.romanov@nginx.com         nxt_php_app_conf_t     php;
59*141Smax.romanov@nginx.com         nxt_go_app_conf_t      go;
60*141Smax.romanov@nginx.com     } u;
61*141Smax.romanov@nginx.com };
62*141Smax.romanov@nginx.com 
63*141Smax.romanov@nginx.com 
640Sigor@sysoev.ru typedef struct {
650Sigor@sysoev.ru     nxt_str_t                  name;
660Sigor@sysoev.ru     nxt_str_t                  value;
670Sigor@sysoev.ru } nxt_app_header_field_t;
680Sigor@sysoev.ru 
690Sigor@sysoev.ru 
700Sigor@sysoev.ru typedef struct {
710Sigor@sysoev.ru     nxt_str_t                  method;
72112Smax.romanov@nginx.com     nxt_str_t                  target;
73112Smax.romanov@nginx.com     nxt_str_t                  version;
740Sigor@sysoev.ru     nxt_str_t                  path;
7584Smax.romanov@nginx.com     nxt_str_t                  query;
7684Smax.romanov@nginx.com 
7784Smax.romanov@nginx.com     nxt_list_t                 *fields;
780Sigor@sysoev.ru 
7984Smax.romanov@nginx.com     nxt_str_t                  cookie;
8084Smax.romanov@nginx.com     nxt_str_t                  content_length;
8184Smax.romanov@nginx.com     nxt_str_t                  content_type;
8284Smax.romanov@nginx.com     nxt_str_t                  host;
8384Smax.romanov@nginx.com 
8484Smax.romanov@nginx.com     off_t                      parsed_content_length;
8584Smax.romanov@nginx.com     nxt_bool_t                 done;
860Sigor@sysoev.ru } nxt_app_request_header_t;
870Sigor@sysoev.ru 
880Sigor@sysoev.ru 
890Sigor@sysoev.ru typedef struct {
9084Smax.romanov@nginx.com     nxt_str_t                  preread;
9184Smax.romanov@nginx.com     nxt_bool_t                 done;
9284Smax.romanov@nginx.com } nxt_app_request_body_t;
930Sigor@sysoev.ru 
940Sigor@sysoev.ru 
9584Smax.romanov@nginx.com typedef struct {
960Sigor@sysoev.ru     nxt_app_request_header_t   header;
9784Smax.romanov@nginx.com     nxt_app_request_body_t     body;
98113Smax.romanov@nginx.com 
99113Smax.romanov@nginx.com     nxt_str_t                  remote;
1000Sigor@sysoev.ru } nxt_app_request_t;
1010Sigor@sysoev.ru 
1020Sigor@sysoev.ru 
1030Sigor@sysoev.ru typedef struct {
10484Smax.romanov@nginx.com     nxt_app_request_t         r;
10584Smax.romanov@nginx.com     nxt_http_request_parse_t  parser;
10684Smax.romanov@nginx.com     nxt_mp_t                  *mem_pool;
10784Smax.romanov@nginx.com } nxt_app_parse_ctx_t;
10884Smax.romanov@nginx.com 
10984Smax.romanov@nginx.com 
11084Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_init(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
11184Smax.romanov@nginx.com 
11284Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_parse(nxt_task_t *task, nxt_app_parse_ctx_t *ctx,
11384Smax.romanov@nginx.com     nxt_buf_t *buf);
11484Smax.romanov@nginx.com 
11584Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
11684Smax.romanov@nginx.com 
11784Smax.romanov@nginx.com nxt_int_t nxt_app_http_init(nxt_task_t *task, nxt_runtime_t *rt);
11884Smax.romanov@nginx.com 
11984Smax.romanov@nginx.com 
12084Smax.romanov@nginx.com typedef struct nxt_app_wmsg_s  nxt_app_wmsg_t;
12184Smax.romanov@nginx.com typedef struct nxt_app_rmsg_s  nxt_app_rmsg_t;
12284Smax.romanov@nginx.com 
12384Smax.romanov@nginx.com struct nxt_app_wmsg_s {
12484Smax.romanov@nginx.com     nxt_port_t                 *port;  /* where prepared buf will be sent */
12584Smax.romanov@nginx.com     nxt_buf_t                  *write;
12684Smax.romanov@nginx.com     nxt_buf_t                  **buf;
12784Smax.romanov@nginx.com     uint32_t                   stream;
12884Smax.romanov@nginx.com };
12984Smax.romanov@nginx.com 
13084Smax.romanov@nginx.com struct nxt_app_rmsg_s {
13184Smax.romanov@nginx.com     nxt_buf_t                 *buf;   /* current buffer to read */
13284Smax.romanov@nginx.com };
13384Smax.romanov@nginx.com 
13484Smax.romanov@nginx.com 
13584Smax.romanov@nginx.com nxt_inline u_char *
13684Smax.romanov@nginx.com nxt_app_msg_write_length(u_char *dst, size_t length);
13784Smax.romanov@nginx.com 
13884Smax.romanov@nginx.com /* TODO asynchronous mmap buffer assignment */
13984Smax.romanov@nginx.com u_char *nxt_app_msg_write_get_buf(nxt_task_t *task, nxt_app_wmsg_t *msg,
14084Smax.romanov@nginx.com     size_t size);
14184Smax.romanov@nginx.com 
14284Smax.romanov@nginx.com nxt_int_t nxt_app_msg_write(nxt_task_t *task, nxt_app_wmsg_t *msg,
14384Smax.romanov@nginx.com     u_char *c, size_t size);
14484Smax.romanov@nginx.com 
14584Smax.romanov@nginx.com nxt_int_t nxt_app_msg_write_prefixed_upcase(nxt_task_t *task,
14684Smax.romanov@nginx.com     nxt_app_wmsg_t *msg, const nxt_str_t *prefix, const nxt_str_t *v);
14784Smax.romanov@nginx.com 
14884Smax.romanov@nginx.com nxt_inline nxt_int_t
14984Smax.romanov@nginx.com nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
15084Smax.romanov@nginx.com     u_char *n, size_t nsize, u_char *v, size_t vsize);
15184Smax.romanov@nginx.com 
15284Smax.romanov@nginx.com 
15384Smax.romanov@nginx.com #define nxt_app_msg_write_const(task, msg, c)                                 \
15484Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (u_char *)(c), sizeof(c) - 1)
15584Smax.romanov@nginx.com 
15684Smax.romanov@nginx.com #define nxt_app_msg_write_str(task, msg, str)                                 \
15784Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (str)->start, (str)->length)
15884Smax.romanov@nginx.com 
15984Smax.romanov@nginx.com #define nxt_app_msg_write_cstr(task, msg, c)                                  \
16084Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (c), nxt_strlen(c))
16184Smax.romanov@nginx.com 
16284Smax.romanov@nginx.com #define nxt_app_msg_write_nvp(task, msg, n, v)                                \
16384Smax.romanov@nginx.com     nxt_app_msg_write_nvp_((task), (msg), (u_char *)(n), sizeof(n) - 1,       \
16484Smax.romanov@nginx.com                            (v)->start, (v)->length)
16584Smax.romanov@nginx.com 
16684Smax.romanov@nginx.com nxt_inline nxt_int_t nxt_app_msg_write_size(nxt_task_t *task,
16784Smax.romanov@nginx.com     nxt_app_wmsg_t *msg, size_t size);
16884Smax.romanov@nginx.com 
16984Smax.romanov@nginx.com nxt_int_t nxt_app_msg_flush(nxt_task_t *task, nxt_app_wmsg_t *msg,
17084Smax.romanov@nginx.com     nxt_bool_t last);
17184Smax.romanov@nginx.com 
17284Smax.romanov@nginx.com nxt_int_t nxt_app_msg_write_raw(nxt_task_t *task, nxt_app_wmsg_t *msg,
17384Smax.romanov@nginx.com     const u_char *c, size_t size);
17484Smax.romanov@nginx.com 
17584Smax.romanov@nginx.com nxt_int_t nxt_app_msg_read_str(nxt_task_t *task, nxt_app_rmsg_t *msg,
17684Smax.romanov@nginx.com     nxt_str_t *str);
17784Smax.romanov@nginx.com 
17884Smax.romanov@nginx.com nxt_int_t nxt_app_msg_read_nvp(nxt_task_t *task, nxt_app_rmsg_t *rmsg,
17984Smax.romanov@nginx.com     nxt_str_t *n, nxt_str_t *v);
18084Smax.romanov@nginx.com 
18184Smax.romanov@nginx.com nxt_int_t nxt_app_msg_read_size(nxt_task_t *task, nxt_app_rmsg_t *rmsg,
18284Smax.romanov@nginx.com     size_t *size);
18384Smax.romanov@nginx.com 
18484Smax.romanov@nginx.com 
185*141Smax.romanov@nginx.com typedef struct nxt_app_module_s  nxt_application_module_t;
186*141Smax.romanov@nginx.com typedef struct nxt_app_module_s  nxt_app_module_t;
187*141Smax.romanov@nginx.com 
188*141Smax.romanov@nginx.com struct nxt_app_module_s {
189*141Smax.romanov@nginx.com     nxt_int_t                  (*init)(nxt_task_t *task,
190*141Smax.romanov@nginx.com                                     nxt_common_app_conf_t *conf);
19184Smax.romanov@nginx.com     nxt_int_t                  (*prepare_msg)(nxt_task_t *task,
19284Smax.romanov@nginx.com                                     nxt_app_request_t *r,
19384Smax.romanov@nginx.com                                     nxt_app_wmsg_t *wmsg);
19484Smax.romanov@nginx.com     nxt_int_t                  (*run)(nxt_task_t *task,
19584Smax.romanov@nginx.com                                     nxt_app_rmsg_t *rmsg,
19684Smax.romanov@nginx.com                                     nxt_app_wmsg_t *wmsg);
197*141Smax.romanov@nginx.com };
1980Sigor@sysoev.ru 
1990Sigor@sysoev.ru 
200*141Smax.romanov@nginx.com extern nxt_application_module_t  *nxt_app_modules[NXT_APP_MAX];
20121Sigor@sysoev.ru 
2020Sigor@sysoev.ru 
2030Sigor@sysoev.ru 
20420Sigor@sysoev.ru nxt_int_t nxt_app_http_read_body(nxt_app_request_t *r, u_char *data,
20520Sigor@sysoev.ru     size_t len);
2060Sigor@sysoev.ru nxt_int_t nxt_app_write(nxt_app_request_t *r, const u_char *data, size_t len);
2070Sigor@sysoev.ru 
20884Smax.romanov@nginx.com nxt_inline u_char *
20984Smax.romanov@nginx.com nxt_app_msg_write_length(u_char *dst, size_t length)
21084Smax.romanov@nginx.com {
21184Smax.romanov@nginx.com     if (length < 128) {
21284Smax.romanov@nginx.com         *dst = length;
21384Smax.romanov@nginx.com         dst++;
21484Smax.romanov@nginx.com     } else {
21584Smax.romanov@nginx.com         dst[0] = 0x80U | (length >> 24);
21684Smax.romanov@nginx.com         dst[1] = 0xFFU & (length >> 16);
21784Smax.romanov@nginx.com         dst[2] = 0xFFU & (length >> 8);
21884Smax.romanov@nginx.com         dst[3] = 0xFFU & length;
21984Smax.romanov@nginx.com         dst += 4;
22084Smax.romanov@nginx.com     }
22184Smax.romanov@nginx.com 
22284Smax.romanov@nginx.com     return dst;
22384Smax.romanov@nginx.com }
22484Smax.romanov@nginx.com 
22584Smax.romanov@nginx.com 
22684Smax.romanov@nginx.com nxt_inline nxt_int_t
22784Smax.romanov@nginx.com nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
22884Smax.romanov@nginx.com     u_char *n, size_t nsize, u_char *v, size_t vsize)
22984Smax.romanov@nginx.com {
23084Smax.romanov@nginx.com     nxt_int_t rc;
23184Smax.romanov@nginx.com 
23284Smax.romanov@nginx.com     rc = nxt_app_msg_write(task, msg, n, nsize);
23384Smax.romanov@nginx.com     if (nxt_slow_path(rc != NXT_OK)) {
23484Smax.romanov@nginx.com         return rc;
23584Smax.romanov@nginx.com     }
23684Smax.romanov@nginx.com 
23784Smax.romanov@nginx.com     return nxt_app_msg_write(task, msg, v, vsize);
23884Smax.romanov@nginx.com }
23984Smax.romanov@nginx.com 
24084Smax.romanov@nginx.com 
24184Smax.romanov@nginx.com nxt_inline nxt_int_t
24284Smax.romanov@nginx.com nxt_app_msg_write_size(nxt_task_t *task, nxt_app_wmsg_t *msg, size_t size)
24384Smax.romanov@nginx.com {
24484Smax.romanov@nginx.com     u_char  *dst;
24584Smax.romanov@nginx.com     size_t  dst_length;
24684Smax.romanov@nginx.com 
24784Smax.romanov@nginx.com     dst_length = size < 128 ? 1 : 4;
24884Smax.romanov@nginx.com 
24984Smax.romanov@nginx.com     dst = nxt_app_msg_write_get_buf(task, msg, dst_length);
25084Smax.romanov@nginx.com     if (nxt_slow_path(dst == NULL)) {
25184Smax.romanov@nginx.com         return NXT_ERROR;
25284Smax.romanov@nginx.com     }
25384Smax.romanov@nginx.com 
25484Smax.romanov@nginx.com     nxt_app_msg_write_length(dst, size);
25584Smax.romanov@nginx.com 
25684Smax.romanov@nginx.com     return NXT_OK;
25784Smax.romanov@nginx.com }
25884Smax.romanov@nginx.com 
25984Smax.romanov@nginx.com 
26084Smax.romanov@nginx.com nxt_inline u_char *
26184Smax.romanov@nginx.com nxt_app_msg_read_length(u_char *src, size_t *length)
26284Smax.romanov@nginx.com {
26384Smax.romanov@nginx.com     if (src[0] < 128) {
26484Smax.romanov@nginx.com         *length = src[0];
26584Smax.romanov@nginx.com         src++;
26684Smax.romanov@nginx.com     } else {
26784Smax.romanov@nginx.com         *length = ((src[0] & 0x7fU) << 24) +
26884Smax.romanov@nginx.com                   (src[1] << 16) +
26984Smax.romanov@nginx.com                   (src[2] << 8) +
27084Smax.romanov@nginx.com                   src[3];
27184Smax.romanov@nginx.com         src += 4;
27284Smax.romanov@nginx.com     }
27384Smax.romanov@nginx.com 
27484Smax.romanov@nginx.com     return src;
27584Smax.romanov@nginx.com }
27684Smax.romanov@nginx.com 
2770Sigor@sysoev.ru 
278*141Smax.romanov@nginx.com nxt_app_type_t nxt_app_parse_type(nxt_str_t *str);
279*141Smax.romanov@nginx.com 
2800Sigor@sysoev.ru #endif /* _NXT_APPLICATION_H_INCLIDED_ */
281