nxt_application.h (394:28ec49e1e6b0) nxt_application.h (417:47366bb40f2c)
1
2/*
3 * Copyright (C) Max Romanov
4 * Copyright (C) Valentin V. Bartenev
5 * Copyright (C) NGINX, Inc.
6 */
7
8#ifndef _NXT_APPLICATION_H_INCLUDED_
9#define _NXT_APPLICATION_H_INCLUDED_
10
11
12typedef enum {
13 NXT_APP_PYTHON,
14 NXT_APP_PHP,
15 NXT_APP_GO,
16
17 NXT_APP_UNKNOWN,
18} nxt_app_type_t;
19
20
21typedef struct nxt_app_module_s nxt_application_module_t;
22typedef struct nxt_app_module_s nxt_app_module_t;
23
24
25typedef struct {
26 nxt_app_type_t type;
27 u_char *version;
28 char *file;
29 nxt_application_module_t *module;
30} nxt_app_lang_module_t;
31
32
33typedef struct nxt_common_app_conf_s nxt_common_app_conf_t;
34
35
36typedef struct {
37 char *home;
38 nxt_str_t path;
39 nxt_str_t module;
40} nxt_python_app_conf_t;
41
42
43typedef struct {
44 nxt_str_t root;
45 nxt_str_t script;
46 nxt_str_t index;
47} nxt_php_app_conf_t;
48
49
50typedef struct {
51 char *executable;
52} nxt_go_app_conf_t;
53
54
55struct nxt_common_app_conf_s {
56 nxt_str_t name;
57 nxt_str_t type;
58 nxt_str_t user;
59 nxt_str_t group;
60
61 char *working_directory;
62
63 uint32_t workers;
64
65 union {
66 nxt_python_app_conf_t python;
67 nxt_php_app_conf_t php;
68 nxt_go_app_conf_t go;
69 } u;
70};
71
72
73typedef struct {
74 nxt_str_t name;
75 nxt_str_t value;
76} nxt_app_header_field_t;
77
78
79typedef struct {
80 nxt_str_t method;
81 nxt_str_t target;
82 nxt_str_t version;
83 nxt_str_t path;
84 nxt_str_t query;
85
86 nxt_list_t *fields;
87
88 nxt_str_t cookie;
89 nxt_str_t content_length;
90 nxt_str_t content_type;
91 nxt_str_t host;
92
93 off_t parsed_content_length;
94 nxt_bool_t done;
95
96 size_t bufs;
97 nxt_buf_t *buf;
98} nxt_app_request_header_t;
99
100
101typedef struct {
102 size_t preread_size;
103 nxt_bool_t done;
104
105 nxt_buf_t *buf;
106} nxt_app_request_body_t;
107
108
109typedef struct {
110 nxt_app_request_header_t header;
111 nxt_app_request_body_t body;
112
113 nxt_str_t remote;
114 nxt_str_t local;
115} nxt_app_request_t;
116
117
118typedef struct nxt_app_parse_ctx_s nxt_app_parse_ctx_t;
119
120struct nxt_app_parse_ctx_s {
121 nxt_app_request_t r;
122 nxt_http_request_parse_t parser;
123 nxt_mp_t *mem_pool;
124};
125
126
127nxt_app_parse_ctx_t *nxt_app_http_req_init(nxt_task_t *task);
128
129nxt_int_t nxt_app_http_req_header_parse(nxt_task_t *task,
130 nxt_app_parse_ctx_t *ctx, nxt_buf_t *buf);
131
132nxt_int_t nxt_app_http_req_body_read(nxt_task_t *task,
133 nxt_app_parse_ctx_t *ctx, nxt_buf_t *buf);
134
135
136nxt_int_t nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
137
138nxt_int_t nxt_app_http_init(nxt_task_t *task, nxt_runtime_t *rt);
139
140
141typedef struct nxt_app_wmsg_s nxt_app_wmsg_t;
142typedef struct nxt_app_rmsg_s nxt_app_rmsg_t;
143
144struct nxt_app_wmsg_s {
145 nxt_port_t *port; /* where prepared buf will be sent */
146 nxt_buf_t *write;
147 nxt_buf_t **buf;
148 uint32_t stream;
149};
150
151struct nxt_app_rmsg_s {
152 nxt_buf_t *buf; /* current buffer to read */
153};
154
155
156nxt_inline u_char *
157nxt_app_msg_write_length(u_char *dst, size_t length);
158
159/* TODO asynchronous mmap buffer assignment */
160NXT_EXPORT u_char *nxt_app_msg_write_get_buf(nxt_task_t *task,
161 nxt_app_wmsg_t *msg, size_t size);
162
163NXT_EXPORT nxt_int_t nxt_app_msg_write(nxt_task_t *task, nxt_app_wmsg_t *msg,
164 u_char *c, size_t size);
165
166NXT_EXPORT nxt_int_t nxt_app_msg_write_prefixed_upcase(nxt_task_t *task,
1
2/*
3 * Copyright (C) Max Romanov
4 * Copyright (C) Valentin V. Bartenev
5 * Copyright (C) NGINX, Inc.
6 */
7
8#ifndef _NXT_APPLICATION_H_INCLUDED_
9#define _NXT_APPLICATION_H_INCLUDED_
10
11
12typedef enum {
13 NXT_APP_PYTHON,
14 NXT_APP_PHP,
15 NXT_APP_GO,
16
17 NXT_APP_UNKNOWN,
18} nxt_app_type_t;
19
20
21typedef struct nxt_app_module_s nxt_application_module_t;
22typedef struct nxt_app_module_s nxt_app_module_t;
23
24
25typedef struct {
26 nxt_app_type_t type;
27 u_char *version;
28 char *file;
29 nxt_application_module_t *module;
30} nxt_app_lang_module_t;
31
32
33typedef struct nxt_common_app_conf_s nxt_common_app_conf_t;
34
35
36typedef struct {
37 char *home;
38 nxt_str_t path;
39 nxt_str_t module;
40} nxt_python_app_conf_t;
41
42
43typedef struct {
44 nxt_str_t root;
45 nxt_str_t script;
46 nxt_str_t index;
47} nxt_php_app_conf_t;
48
49
50typedef struct {
51 char *executable;
52} nxt_go_app_conf_t;
53
54
55struct nxt_common_app_conf_s {
56 nxt_str_t name;
57 nxt_str_t type;
58 nxt_str_t user;
59 nxt_str_t group;
60
61 char *working_directory;
62
63 uint32_t workers;
64
65 union {
66 nxt_python_app_conf_t python;
67 nxt_php_app_conf_t php;
68 nxt_go_app_conf_t go;
69 } u;
70};
71
72
73typedef struct {
74 nxt_str_t name;
75 nxt_str_t value;
76} nxt_app_header_field_t;
77
78
79typedef struct {
80 nxt_str_t method;
81 nxt_str_t target;
82 nxt_str_t version;
83 nxt_str_t path;
84 nxt_str_t query;
85
86 nxt_list_t *fields;
87
88 nxt_str_t cookie;
89 nxt_str_t content_length;
90 nxt_str_t content_type;
91 nxt_str_t host;
92
93 off_t parsed_content_length;
94 nxt_bool_t done;
95
96 size_t bufs;
97 nxt_buf_t *buf;
98} nxt_app_request_header_t;
99
100
101typedef struct {
102 size_t preread_size;
103 nxt_bool_t done;
104
105 nxt_buf_t *buf;
106} nxt_app_request_body_t;
107
108
109typedef struct {
110 nxt_app_request_header_t header;
111 nxt_app_request_body_t body;
112
113 nxt_str_t remote;
114 nxt_str_t local;
115} nxt_app_request_t;
116
117
118typedef struct nxt_app_parse_ctx_s nxt_app_parse_ctx_t;
119
120struct nxt_app_parse_ctx_s {
121 nxt_app_request_t r;
122 nxt_http_request_parse_t parser;
123 nxt_mp_t *mem_pool;
124};
125
126
127nxt_app_parse_ctx_t *nxt_app_http_req_init(nxt_task_t *task);
128
129nxt_int_t nxt_app_http_req_header_parse(nxt_task_t *task,
130 nxt_app_parse_ctx_t *ctx, nxt_buf_t *buf);
131
132nxt_int_t nxt_app_http_req_body_read(nxt_task_t *task,
133 nxt_app_parse_ctx_t *ctx, nxt_buf_t *buf);
134
135
136nxt_int_t nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
137
138nxt_int_t nxt_app_http_init(nxt_task_t *task, nxt_runtime_t *rt);
139
140
141typedef struct nxt_app_wmsg_s nxt_app_wmsg_t;
142typedef struct nxt_app_rmsg_s nxt_app_rmsg_t;
143
144struct nxt_app_wmsg_s {
145 nxt_port_t *port; /* where prepared buf will be sent */
146 nxt_buf_t *write;
147 nxt_buf_t **buf;
148 uint32_t stream;
149};
150
151struct nxt_app_rmsg_s {
152 nxt_buf_t *buf; /* current buffer to read */
153};
154
155
156nxt_inline u_char *
157nxt_app_msg_write_length(u_char *dst, size_t length);
158
159/* TODO asynchronous mmap buffer assignment */
160NXT_EXPORT u_char *nxt_app_msg_write_get_buf(nxt_task_t *task,
161 nxt_app_wmsg_t *msg, size_t size);
162
163NXT_EXPORT nxt_int_t nxt_app_msg_write(nxt_task_t *task, nxt_app_wmsg_t *msg,
164 u_char *c, size_t size);
165
166NXT_EXPORT nxt_int_t nxt_app_msg_write_prefixed_upcase(nxt_task_t *task,
167 nxt_app_wmsg_t *msg, const nxt_str_t *prefix, const nxt_str_t *v);
167 nxt_app_wmsg_t *msg, const nxt_str_t *prefix, u_char *c, size_t size);
168
169nxt_inline nxt_int_t
170nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
171 u_char *n, size_t nsize, u_char *v, size_t vsize);
172
173
174#define nxt_app_msg_write_const(task, msg, c) \
175 nxt_app_msg_write((task), (msg), (u_char *)(c), sizeof(c) - 1)
176
177#define nxt_app_msg_write_str(task, msg, str) \
178 nxt_app_msg_write((task), (msg), (str)->start, (str)->length)
179
180#define nxt_app_msg_write_cstr(task, msg, c) \
181 nxt_app_msg_write((task), (msg), (c), nxt_strlen(c))
182
183#define nxt_app_msg_write_nvp(task, msg, n, v) \
184 nxt_app_msg_write_nvp_((task), (msg), (u_char *)(n), sizeof(n) - 1, \
185 (v)->start, (v)->length)
186
187nxt_inline nxt_int_t nxt_app_msg_write_size(nxt_task_t *task,
188 nxt_app_wmsg_t *msg, size_t size);
189
190NXT_EXPORT nxt_int_t nxt_app_msg_flush(nxt_task_t *task, nxt_app_wmsg_t *msg,
191 nxt_bool_t last);
192
193NXT_EXPORT nxt_int_t nxt_app_msg_write_raw(nxt_task_t *task,
194 nxt_app_wmsg_t *msg, const u_char *c, size_t size);
195
196NXT_EXPORT nxt_int_t nxt_app_msg_read_str(nxt_task_t *task, nxt_app_rmsg_t *msg,
197 nxt_str_t *str);
198
199NXT_EXPORT size_t nxt_app_msg_read_raw(nxt_task_t *task,
200 nxt_app_rmsg_t *msg, void *buf, size_t size);
201
202NXT_EXPORT nxt_int_t nxt_app_msg_read_nvp(nxt_task_t *task,
203 nxt_app_rmsg_t *rmsg, nxt_str_t *n, nxt_str_t *v);
204
205NXT_EXPORT nxt_int_t nxt_app_msg_read_size(nxt_task_t *task,
206 nxt_app_rmsg_t *rmsg, size_t *size);
207
208
209struct nxt_app_module_s {
210 size_t compat_length;
211 uint32_t *compat;
212
213 nxt_str_t type;
214 nxt_str_t version;
215
216 nxt_int_t (*init)(nxt_task_t *task,
217 nxt_common_app_conf_t *conf);
218 nxt_int_t (*run)(nxt_task_t *task,
219 nxt_app_rmsg_t *rmsg,
220 nxt_app_wmsg_t *wmsg);
221};
222
223
224nxt_int_t nxt_app_http_read_body(nxt_app_request_t *r, u_char *data,
225 size_t len);
226nxt_int_t nxt_app_write(nxt_app_request_t *r, const u_char *data, size_t len);
227
228nxt_inline u_char *
229nxt_app_msg_write_length(u_char *dst, size_t length)
230{
231 if (length < 128) {
232 *dst = length;
233 dst++;
234
235 } else {
236 dst[0] = 0x80U | (length >> 24);
237 dst[1] = 0xFFU & (length >> 16);
238 dst[2] = 0xFFU & (length >> 8);
239 dst[3] = 0xFFU & length;
240 dst += 4;
241 }
242
243 return dst;
244}
245
246
247nxt_inline nxt_int_t
248nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
249 u_char *n, size_t nsize, u_char *v, size_t vsize)
250{
251 nxt_int_t rc;
252
253 rc = nxt_app_msg_write(task, msg, n, nsize);
254 if (nxt_slow_path(rc != NXT_OK)) {
255 return rc;
256 }
257
258 return nxt_app_msg_write(task, msg, v, vsize);
259}
260
261
262nxt_inline nxt_int_t
263nxt_app_msg_write_size(nxt_task_t *task, nxt_app_wmsg_t *msg, size_t size)
264{
265 u_char *dst;
266 size_t dst_length;
267
268 dst_length = size < 128 ? 1 : 4;
269
270 dst = nxt_app_msg_write_get_buf(task, msg, dst_length);
271 if (nxt_slow_path(dst == NULL)) {
272 return NXT_ERROR;
273 }
274
275 nxt_app_msg_write_length(dst, size);
276
277 return NXT_OK;
278}
279
280
281nxt_inline u_char *
282nxt_app_msg_read_length(u_char *src, size_t *length)
283{
284 if (src[0] < 128) {
285 *length = src[0];
286 src++;
287
288 } else {
289 *length = ((src[0] & 0x7fU) << 24) +
290 (src[1] << 16) +
291 (src[2] << 8) +
292 src[3];
293 src += 4;
294 }
295
296 return src;
297}
298
299
300nxt_app_lang_module_t *nxt_app_lang_module(nxt_runtime_t *rt, nxt_str_t *name);
301
302
303extern nxt_application_module_t nxt_go_module;
304
305
306#endif /* _NXT_APPLICATION_H_INCLIDED_ */
168
169nxt_inline nxt_int_t
170nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
171 u_char *n, size_t nsize, u_char *v, size_t vsize);
172
173
174#define nxt_app_msg_write_const(task, msg, c) \
175 nxt_app_msg_write((task), (msg), (u_char *)(c), sizeof(c) - 1)
176
177#define nxt_app_msg_write_str(task, msg, str) \
178 nxt_app_msg_write((task), (msg), (str)->start, (str)->length)
179
180#define nxt_app_msg_write_cstr(task, msg, c) \
181 nxt_app_msg_write((task), (msg), (c), nxt_strlen(c))
182
183#define nxt_app_msg_write_nvp(task, msg, n, v) \
184 nxt_app_msg_write_nvp_((task), (msg), (u_char *)(n), sizeof(n) - 1, \
185 (v)->start, (v)->length)
186
187nxt_inline nxt_int_t nxt_app_msg_write_size(nxt_task_t *task,
188 nxt_app_wmsg_t *msg, size_t size);
189
190NXT_EXPORT nxt_int_t nxt_app_msg_flush(nxt_task_t *task, nxt_app_wmsg_t *msg,
191 nxt_bool_t last);
192
193NXT_EXPORT nxt_int_t nxt_app_msg_write_raw(nxt_task_t *task,
194 nxt_app_wmsg_t *msg, const u_char *c, size_t size);
195
196NXT_EXPORT nxt_int_t nxt_app_msg_read_str(nxt_task_t *task, nxt_app_rmsg_t *msg,
197 nxt_str_t *str);
198
199NXT_EXPORT size_t nxt_app_msg_read_raw(nxt_task_t *task,
200 nxt_app_rmsg_t *msg, void *buf, size_t size);
201
202NXT_EXPORT nxt_int_t nxt_app_msg_read_nvp(nxt_task_t *task,
203 nxt_app_rmsg_t *rmsg, nxt_str_t *n, nxt_str_t *v);
204
205NXT_EXPORT nxt_int_t nxt_app_msg_read_size(nxt_task_t *task,
206 nxt_app_rmsg_t *rmsg, size_t *size);
207
208
209struct nxt_app_module_s {
210 size_t compat_length;
211 uint32_t *compat;
212
213 nxt_str_t type;
214 nxt_str_t version;
215
216 nxt_int_t (*init)(nxt_task_t *task,
217 nxt_common_app_conf_t *conf);
218 nxt_int_t (*run)(nxt_task_t *task,
219 nxt_app_rmsg_t *rmsg,
220 nxt_app_wmsg_t *wmsg);
221};
222
223
224nxt_int_t nxt_app_http_read_body(nxt_app_request_t *r, u_char *data,
225 size_t len);
226nxt_int_t nxt_app_write(nxt_app_request_t *r, const u_char *data, size_t len);
227
228nxt_inline u_char *
229nxt_app_msg_write_length(u_char *dst, size_t length)
230{
231 if (length < 128) {
232 *dst = length;
233 dst++;
234
235 } else {
236 dst[0] = 0x80U | (length >> 24);
237 dst[1] = 0xFFU & (length >> 16);
238 dst[2] = 0xFFU & (length >> 8);
239 dst[3] = 0xFFU & length;
240 dst += 4;
241 }
242
243 return dst;
244}
245
246
247nxt_inline nxt_int_t
248nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
249 u_char *n, size_t nsize, u_char *v, size_t vsize)
250{
251 nxt_int_t rc;
252
253 rc = nxt_app_msg_write(task, msg, n, nsize);
254 if (nxt_slow_path(rc != NXT_OK)) {
255 return rc;
256 }
257
258 return nxt_app_msg_write(task, msg, v, vsize);
259}
260
261
262nxt_inline nxt_int_t
263nxt_app_msg_write_size(nxt_task_t *task, nxt_app_wmsg_t *msg, size_t size)
264{
265 u_char *dst;
266 size_t dst_length;
267
268 dst_length = size < 128 ? 1 : 4;
269
270 dst = nxt_app_msg_write_get_buf(task, msg, dst_length);
271 if (nxt_slow_path(dst == NULL)) {
272 return NXT_ERROR;
273 }
274
275 nxt_app_msg_write_length(dst, size);
276
277 return NXT_OK;
278}
279
280
281nxt_inline u_char *
282nxt_app_msg_read_length(u_char *src, size_t *length)
283{
284 if (src[0] < 128) {
285 *length = src[0];
286 src++;
287
288 } else {
289 *length = ((src[0] & 0x7fU) << 24) +
290 (src[1] << 16) +
291 (src[2] << 8) +
292 src[3];
293 src += 4;
294 }
295
296 return src;
297}
298
299
300nxt_app_lang_module_t *nxt_app_lang_module(nxt_runtime_t *rt, nxt_str_t *name);
301
302
303extern nxt_application_module_t nxt_go_module;
304
305
306#endif /* _NXT_APPLICATION_H_INCLIDED_ */