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,
|
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_ */
|