diff options
author | Igor Sysoev <igor@sysoev.ru> | 2017-12-28 16:01:06 +0300 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2017-12-28 16:01:06 +0300 |
commit | 9a6d3c5775d945509c7c2cbec48be59757da42c3 (patch) | |
tree | 7129c13d6027a45e1a324deab373125bd7a14794 /src/nxt_application.c | |
parent | 497faf1b9abb188cab40c389a9e6221add5dd496 (diff) | |
download | unit-9a6d3c5775d945509c7c2cbec48be59757da42c3.tar.gz unit-9a6d3c5775d945509c7c2cbec48be59757da42c3.tar.bz2 |
HTTP keep-alive connections support.
Diffstat (limited to 'src/nxt_application.c')
-rw-r--r-- | src/nxt_application.c | 223 |
1 files changed, 16 insertions, 207 deletions
diff --git a/src/nxt_application.c b/src/nxt_application.c index 29b7a1e6..e77a9796 100644 --- a/src/nxt_application.c +++ b/src/nxt_application.c @@ -10,6 +10,8 @@ #include <nxt_runtime.h> #include <nxt_application.h> #include <nxt_main_process.h> +#include <nxt_router.h> +#include <nxt_http.h> #include <glob.h> @@ -28,22 +30,8 @@ static nxt_app_module_t *nxt_app_module_load(nxt_task_t *task, const char *name); static nxt_app_type_t nxt_app_parse_type(u_char *p, size_t length); -static nxt_int_t nxt_app_request_content_length(void *ctx, - nxt_http_field_t *field, uintptr_t data); -static nxt_int_t nxt_app_request_content_type(void *ctx, - nxt_http_field_t *field, uintptr_t data); -static nxt_int_t nxt_app_request_cookie(void *ctx, nxt_http_field_t *field, - uintptr_t data); -static nxt_int_t nxt_app_request_host(void *ctx, nxt_http_field_t *field, - uintptr_t data); - - -static nxt_http_field_proc_t nxt_app_request_fields[] = { - { nxt_string("Content-Length"), &nxt_app_request_content_length, 0 }, - { nxt_string("Content-Type"), &nxt_app_request_content_type, 0 }, - { nxt_string("Cookie"), &nxt_app_request_cookie, 0 }, - { nxt_string("Host"), &nxt_app_request_host, 0 }, -}; + +static void nxt_app_http_release(nxt_task_t *task, void *obj, void *data); static uint32_t compat[] = { @@ -51,8 +39,6 @@ static uint32_t compat[] = { }; -static nxt_lvlhsh_t nxt_app_request_fields_hash; - static nxt_thread_mutex_t nxt_app_mutex; static nxt_thread_cond_t nxt_app_cond; @@ -372,15 +358,6 @@ nxt_app_module_load(nxt_task_t *task, const char *name) } -nxt_int_t -nxt_app_http_init(nxt_task_t *task, nxt_runtime_t *rt) -{ - return nxt_http_fields_hash(&nxt_app_request_fields_hash, rt->mem_pool, - nxt_app_request_fields, - nxt_nitems(nxt_app_request_fields)); -} - - void nxt_app_quit_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg) { @@ -704,197 +681,29 @@ nxt_app_msg_read_size(nxt_task_t *task, nxt_app_rmsg_t *msg, size_t *size) } -static nxt_int_t -nxt_app_request_content_length(void *ctx, nxt_http_field_t *field, - uintptr_t data) -{ - nxt_app_parse_ctx_t *c; - nxt_app_request_header_t *h; - - c = ctx; - h = &c->r.header; - - h->content_length.length = field->value_length; - h->content_length.start = field->value; - - h->parsed_content_length = nxt_off_t_parse(field->value, - field->value_length); - - return NXT_OK; -} - - -static nxt_int_t -nxt_app_request_content_type(void *ctx, nxt_http_field_t *field, - uintptr_t data) -{ - nxt_app_parse_ctx_t *c; - nxt_app_request_header_t *h; - - c = ctx; - h = &c->r.header; - - h->content_type.length = field->value_length; - h->content_type.start = field->value; - - return NXT_OK; -} - - -static nxt_int_t -nxt_app_request_cookie(void *ctx, nxt_http_field_t *field, uintptr_t data) -{ - nxt_app_parse_ctx_t *c; - nxt_app_request_header_t *h; - - c = ctx; - h = &c->r.header; - - h->cookie.length = field->value_length; - h->cookie.start = field->value; - - return NXT_OK; -} - - -static nxt_int_t -nxt_app_request_host(void *ctx, nxt_http_field_t *field, uintptr_t data) -{ - nxt_app_parse_ctx_t *c; - nxt_app_request_header_t *h; - - c = ctx; - h = &c->r.header; - - h->host.length = field->value_length; - h->host.start = field->value; - - return NXT_OK; -} - - -nxt_app_parse_ctx_t * -nxt_app_http_req_init(nxt_task_t *task) -{ - nxt_mp_t *mp; - nxt_int_t rc; - nxt_app_parse_ctx_t *ctx; - - mp = nxt_mp_create(1024, 128, 256, 32); - if (nxt_slow_path(mp == NULL)) { - return NULL; - } - - ctx = nxt_mp_zget(mp, sizeof(nxt_app_parse_ctx_t)); - if (nxt_slow_path(ctx == NULL)) { - nxt_mp_destroy(mp); - return NULL; - } - - ctx->mem_pool = mp; - - rc = nxt_http_parse_request_init(&ctx->parser, mp); - if (nxt_slow_path(rc != NXT_OK)) { - nxt_mp_destroy(mp); - return NULL; - } - - return ctx; -} - - nxt_int_t -nxt_app_http_req_header_parse(nxt_task_t *task, nxt_app_parse_ctx_t *ctx, - nxt_buf_t *buf) +nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ar) { - nxt_int_t rc; - nxt_app_request_body_t *b; - nxt_http_request_parse_t *p; - nxt_app_request_header_t *h; - - p = &ctx->parser; - b = &ctx->r.body; - h = &ctx->r.header; - - nxt_assert(h->done == 0); - - rc = nxt_http_parse_request(p, &buf->mem); - - if (nxt_slow_path(rc != NXT_DONE)) { - return rc; - } - - rc = nxt_http_fields_process(p->fields, &nxt_app_request_fields_hash, ctx); - - if (nxt_slow_path(rc != NXT_OK)) { - return rc; - } - - h->fields = p->fields; - h->done = 1; + ar->timer.handler = nxt_app_http_release; + nxt_timer_add(task->thread->engine, &ar->timer, 0); - h->version.start = p->version.str; - h->version.length = sizeof(p->version.str); - - h->method = p->method; - - h->target.start = p->target_start; - h->target.length = p->target_end - p->target_start; - - h->path = p->path; - h->query = p->args; - - if (h->parsed_content_length == 0) { - b->done = 1; - - } - - if (buf->mem.free == buf->mem.pos) { - return NXT_DONE; - } - - b->buf = buf; - b->done = nxt_buf_mem_used_size(&buf->mem) >= - h->parsed_content_length; - - if (b->done == 1) { - b->preread_size = nxt_buf_mem_used_size(&buf->mem); - } - - return NXT_DONE; + return NXT_OK; } -nxt_int_t -nxt_app_http_req_body_read(nxt_task_t *task, nxt_app_parse_ctx_t *ctx, - nxt_buf_t *buf) +static void +nxt_app_http_release(nxt_task_t *task, void *obj, void *data) { - nxt_app_request_body_t *b; - nxt_app_request_header_t *h; - - b = &ctx->r.body; - h = &ctx->r.header; - - nxt_assert(h->done == 1); - nxt_assert(b->done == 0); - - b->done = nxt_buf_mem_used_size(&buf->mem) + b->preread_size >= - (size_t) h->parsed_content_length; + nxt_timer_t *timer; + nxt_app_parse_ctx_t *ar; - if (b->done == 1) { - b->preread_size += nxt_buf_mem_used_size(&buf->mem); - } - - return b->done == 1 ? NXT_DONE : NXT_AGAIN; -} + timer = obj; + nxt_debug(task, "http app release"); -nxt_int_t -nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx) -{ - nxt_mp_release(ctx->mem_pool); + ar = nxt_timer_data(timer, nxt_app_parse_ctx_t, timer); - return NXT_OK; + nxt_mp_release(ar->request->mem_pool); } |