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