nxt_application.h (112:6f1809436b10) nxt_application.h (113:b0148ec28c4d)
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 struct {
13 nxt_str_t name;
14 nxt_str_t value;
15} nxt_app_header_field_t;
16
17
18typedef struct {
19 nxt_str_t method;
20 nxt_str_t target;
21 nxt_str_t version;
22 nxt_str_t path;
23 nxt_str_t query;
24
25 nxt_list_t *fields;
26
27 nxt_str_t cookie;
28 nxt_str_t content_length;
29 nxt_str_t content_type;
30 nxt_str_t host;
31
32 off_t parsed_content_length;
33 nxt_bool_t done;
34} nxt_app_request_header_t;
35
36
37typedef struct {
38 nxt_str_t preread;
39 nxt_bool_t done;
40} nxt_app_request_body_t;
41
42
43typedef struct {
44 nxt_app_request_header_t header;
45 nxt_app_request_body_t body;
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 struct {
13 nxt_str_t name;
14 nxt_str_t value;
15} nxt_app_header_field_t;
16
17
18typedef struct {
19 nxt_str_t method;
20 nxt_str_t target;
21 nxt_str_t version;
22 nxt_str_t path;
23 nxt_str_t query;
24
25 nxt_list_t *fields;
26
27 nxt_str_t cookie;
28 nxt_str_t content_length;
29 nxt_str_t content_type;
30 nxt_str_t host;
31
32 off_t parsed_content_length;
33 nxt_bool_t done;
34} nxt_app_request_header_t;
35
36
37typedef struct {
38 nxt_str_t preread;
39 nxt_bool_t done;
40} nxt_app_request_body_t;
41
42
43typedef struct {
44 nxt_app_request_header_t header;
45 nxt_app_request_body_t body;
46
47 nxt_str_t remote;
46} nxt_app_request_t;
47
48
49typedef struct {
50 nxt_app_request_t r;
51 nxt_http_request_parse_t parser;
52 nxt_mp_t *mem_pool;
53} nxt_app_parse_ctx_t;
54
55
56nxt_int_t nxt_app_http_req_init(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
57
58nxt_int_t nxt_app_http_req_parse(nxt_task_t *task, nxt_app_parse_ctx_t *ctx,
59 nxt_buf_t *buf);
60
61nxt_int_t nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
62
63nxt_int_t nxt_app_http_init(nxt_task_t *task, nxt_runtime_t *rt);
64
65
66typedef struct nxt_app_wmsg_s nxt_app_wmsg_t;
67typedef struct nxt_app_rmsg_s nxt_app_rmsg_t;
68
69struct nxt_app_wmsg_s {
70 nxt_port_t *port; /* where prepared buf will be sent */
71 nxt_buf_t *write;
72 nxt_buf_t **buf;
73 uint32_t stream;
74};
75
76struct nxt_app_rmsg_s {
77 nxt_buf_t *buf; /* current buffer to read */
78};
79
80
81nxt_inline u_char *
82nxt_app_msg_write_length(u_char *dst, size_t length);
83
84/* TODO asynchronous mmap buffer assignment */
85u_char *nxt_app_msg_write_get_buf(nxt_task_t *task, nxt_app_wmsg_t *msg,
86 size_t size);
87
88nxt_int_t nxt_app_msg_write(nxt_task_t *task, nxt_app_wmsg_t *msg,
89 u_char *c, size_t size);
90
91nxt_int_t nxt_app_msg_write_prefixed_upcase(nxt_task_t *task,
92 nxt_app_wmsg_t *msg, const nxt_str_t *prefix, const nxt_str_t *v);
93
94nxt_inline nxt_int_t
95nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
96 u_char *n, size_t nsize, u_char *v, size_t vsize);
97
98
99#define nxt_app_msg_write_const(task, msg, c) \
100 nxt_app_msg_write((task), (msg), (u_char *)(c), sizeof(c) - 1)
101
102#define nxt_app_msg_write_str(task, msg, str) \
103 nxt_app_msg_write((task), (msg), (str)->start, (str)->length)
104
105#define nxt_app_msg_write_cstr(task, msg, c) \
106 nxt_app_msg_write((task), (msg), (c), nxt_strlen(c))
107
108#define nxt_app_msg_write_nvp(task, msg, n, v) \
109 nxt_app_msg_write_nvp_((task), (msg), (u_char *)(n), sizeof(n) - 1, \
110 (v)->start, (v)->length)
111
112nxt_inline nxt_int_t nxt_app_msg_write_size(nxt_task_t *task,
113 nxt_app_wmsg_t *msg, size_t size);
114
115nxt_int_t nxt_app_msg_flush(nxt_task_t *task, nxt_app_wmsg_t *msg,
116 nxt_bool_t last);
117
118nxt_int_t nxt_app_msg_write_raw(nxt_task_t *task, nxt_app_wmsg_t *msg,
119 const u_char *c, size_t size);
120
121nxt_int_t nxt_app_msg_read_str(nxt_task_t *task, nxt_app_rmsg_t *msg,
122 nxt_str_t *str);
123
124nxt_int_t nxt_app_msg_read_nvp(nxt_task_t *task, nxt_app_rmsg_t *rmsg,
125 nxt_str_t *n, nxt_str_t *v);
126
127nxt_int_t nxt_app_msg_read_size(nxt_task_t *task, nxt_app_rmsg_t *rmsg,
128 size_t *size);
129
130
131typedef struct {
132 nxt_int_t (*init)(nxt_task_t *task);
133 nxt_int_t (*prepare_msg)(nxt_task_t *task,
134 nxt_app_request_t *r,
135 nxt_app_wmsg_t *wmsg);
136 nxt_int_t (*run)(nxt_task_t *task,
137 nxt_app_rmsg_t *rmsg,
138 nxt_app_wmsg_t *wmsg);
139} nxt_application_module_t;
140
141
142extern nxt_application_module_t *nxt_app;
143
144
145
146nxt_int_t nxt_app_http_read_body(nxt_app_request_t *r, u_char *data,
147 size_t len);
148nxt_int_t nxt_app_write(nxt_app_request_t *r, const u_char *data, size_t len);
149
150nxt_inline u_char *
151nxt_app_msg_write_length(u_char *dst, size_t length)
152{
153 if (length < 128) {
154 *dst = length;
155 dst++;
156 } else {
157 dst[0] = 0x80U | (length >> 24);
158 dst[1] = 0xFFU & (length >> 16);
159 dst[2] = 0xFFU & (length >> 8);
160 dst[3] = 0xFFU & length;
161 dst += 4;
162 }
163
164 return dst;
165}
166
167
168nxt_inline nxt_int_t
169nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
170 u_char *n, size_t nsize, u_char *v, size_t vsize)
171{
172 nxt_int_t rc;
173
174 rc = nxt_app_msg_write(task, msg, n, nsize);
175 if (nxt_slow_path(rc != NXT_OK)) {
176 return rc;
177 }
178
179 return nxt_app_msg_write(task, msg, v, vsize);
180}
181
182
183nxt_inline nxt_int_t
184nxt_app_msg_write_size(nxt_task_t *task, nxt_app_wmsg_t *msg, size_t size)
185{
186 u_char *dst;
187 size_t dst_length;
188
189 dst_length = size < 128 ? 1 : 4;
190
191 dst = nxt_app_msg_write_get_buf(task, msg, dst_length);
192 if (nxt_slow_path(dst == NULL)) {
193 return NXT_ERROR;
194 }
195
196 nxt_app_msg_write_length(dst, size);
197
198 return NXT_OK;
199}
200
201
202nxt_inline u_char *
203nxt_app_msg_read_length(u_char *src, size_t *length)
204{
205 if (src[0] < 128) {
206 *length = src[0];
207 src++;
208 } else {
209 *length = ((src[0] & 0x7fU) << 24) +
210 (src[1] << 16) +
211 (src[2] << 8) +
212 src[3];
213 src += 4;
214 }
215
216 return src;
217}
218
219
220#endif /* _NXT_APPLICATION_H_INCLIDED_ */
48} nxt_app_request_t;
49
50
51typedef struct {
52 nxt_app_request_t r;
53 nxt_http_request_parse_t parser;
54 nxt_mp_t *mem_pool;
55} nxt_app_parse_ctx_t;
56
57
58nxt_int_t nxt_app_http_req_init(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
59
60nxt_int_t nxt_app_http_req_parse(nxt_task_t *task, nxt_app_parse_ctx_t *ctx,
61 nxt_buf_t *buf);
62
63nxt_int_t nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
64
65nxt_int_t nxt_app_http_init(nxt_task_t *task, nxt_runtime_t *rt);
66
67
68typedef struct nxt_app_wmsg_s nxt_app_wmsg_t;
69typedef struct nxt_app_rmsg_s nxt_app_rmsg_t;
70
71struct nxt_app_wmsg_s {
72 nxt_port_t *port; /* where prepared buf will be sent */
73 nxt_buf_t *write;
74 nxt_buf_t **buf;
75 uint32_t stream;
76};
77
78struct nxt_app_rmsg_s {
79 nxt_buf_t *buf; /* current buffer to read */
80};
81
82
83nxt_inline u_char *
84nxt_app_msg_write_length(u_char *dst, size_t length);
85
86/* TODO asynchronous mmap buffer assignment */
87u_char *nxt_app_msg_write_get_buf(nxt_task_t *task, nxt_app_wmsg_t *msg,
88 size_t size);
89
90nxt_int_t nxt_app_msg_write(nxt_task_t *task, nxt_app_wmsg_t *msg,
91 u_char *c, size_t size);
92
93nxt_int_t nxt_app_msg_write_prefixed_upcase(nxt_task_t *task,
94 nxt_app_wmsg_t *msg, const nxt_str_t *prefix, const nxt_str_t *v);
95
96nxt_inline nxt_int_t
97nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
98 u_char *n, size_t nsize, u_char *v, size_t vsize);
99
100
101#define nxt_app_msg_write_const(task, msg, c) \
102 nxt_app_msg_write((task), (msg), (u_char *)(c), sizeof(c) - 1)
103
104#define nxt_app_msg_write_str(task, msg, str) \
105 nxt_app_msg_write((task), (msg), (str)->start, (str)->length)
106
107#define nxt_app_msg_write_cstr(task, msg, c) \
108 nxt_app_msg_write((task), (msg), (c), nxt_strlen(c))
109
110#define nxt_app_msg_write_nvp(task, msg, n, v) \
111 nxt_app_msg_write_nvp_((task), (msg), (u_char *)(n), sizeof(n) - 1, \
112 (v)->start, (v)->length)
113
114nxt_inline nxt_int_t nxt_app_msg_write_size(nxt_task_t *task,
115 nxt_app_wmsg_t *msg, size_t size);
116
117nxt_int_t nxt_app_msg_flush(nxt_task_t *task, nxt_app_wmsg_t *msg,
118 nxt_bool_t last);
119
120nxt_int_t nxt_app_msg_write_raw(nxt_task_t *task, nxt_app_wmsg_t *msg,
121 const u_char *c, size_t size);
122
123nxt_int_t nxt_app_msg_read_str(nxt_task_t *task, nxt_app_rmsg_t *msg,
124 nxt_str_t *str);
125
126nxt_int_t nxt_app_msg_read_nvp(nxt_task_t *task, nxt_app_rmsg_t *rmsg,
127 nxt_str_t *n, nxt_str_t *v);
128
129nxt_int_t nxt_app_msg_read_size(nxt_task_t *task, nxt_app_rmsg_t *rmsg,
130 size_t *size);
131
132
133typedef struct {
134 nxt_int_t (*init)(nxt_task_t *task);
135 nxt_int_t (*prepare_msg)(nxt_task_t *task,
136 nxt_app_request_t *r,
137 nxt_app_wmsg_t *wmsg);
138 nxt_int_t (*run)(nxt_task_t *task,
139 nxt_app_rmsg_t *rmsg,
140 nxt_app_wmsg_t *wmsg);
141} nxt_application_module_t;
142
143
144extern nxt_application_module_t *nxt_app;
145
146
147
148nxt_int_t nxt_app_http_read_body(nxt_app_request_t *r, u_char *data,
149 size_t len);
150nxt_int_t nxt_app_write(nxt_app_request_t *r, const u_char *data, size_t len);
151
152nxt_inline u_char *
153nxt_app_msg_write_length(u_char *dst, size_t length)
154{
155 if (length < 128) {
156 *dst = length;
157 dst++;
158 } else {
159 dst[0] = 0x80U | (length >> 24);
160 dst[1] = 0xFFU & (length >> 16);
161 dst[2] = 0xFFU & (length >> 8);
162 dst[3] = 0xFFU & length;
163 dst += 4;
164 }
165
166 return dst;
167}
168
169
170nxt_inline nxt_int_t
171nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
172 u_char *n, size_t nsize, u_char *v, size_t vsize)
173{
174 nxt_int_t rc;
175
176 rc = nxt_app_msg_write(task, msg, n, nsize);
177 if (nxt_slow_path(rc != NXT_OK)) {
178 return rc;
179 }
180
181 return nxt_app_msg_write(task, msg, v, vsize);
182}
183
184
185nxt_inline nxt_int_t
186nxt_app_msg_write_size(nxt_task_t *task, nxt_app_wmsg_t *msg, size_t size)
187{
188 u_char *dst;
189 size_t dst_length;
190
191 dst_length = size < 128 ? 1 : 4;
192
193 dst = nxt_app_msg_write_get_buf(task, msg, dst_length);
194 if (nxt_slow_path(dst == NULL)) {
195 return NXT_ERROR;
196 }
197
198 nxt_app_msg_write_length(dst, size);
199
200 return NXT_OK;
201}
202
203
204nxt_inline u_char *
205nxt_app_msg_read_length(u_char *src, size_t *length)
206{
207 if (src[0] < 128) {
208 *length = src[0];
209 src++;
210 } else {
211 *length = ((src[0] & 0x7fU) << 24) +
212 (src[1] << 16) +
213 (src[2] << 8) +
214 src[3];
215 src += 4;
216 }
217
218 return src;
219}
220
221
222#endif /* _NXT_APPLICATION_H_INCLIDED_ */