diff options
author | Valentin Bartenev <vbart@nginx.com> | 2017-04-10 17:06:22 +0300 |
---|---|---|
committer | Valentin Bartenev <vbart@nginx.com> | 2017-04-10 17:06:22 +0300 |
commit | bf401fa5440d5cc2026c8e181471dbc852cf6a80 (patch) | |
tree | 861bb19772add2c05510c623b9fac38469b7631a /src/nxt_controller.c | |
parent | 3b8963da4d9d92d83431cb35eefb3226d8e177e9 (diff) | |
download | unit-bf401fa5440d5cc2026c8e181471dbc852cf6a80.tar.gz unit-bf401fa5440d5cc2026c8e181471dbc852cf6a80.tar.bz2 |
JSON parsing in controller.
Diffstat (limited to 'src/nxt_controller.c')
-rw-r--r-- | src/nxt_controller.c | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/src/nxt_controller.c b/src/nxt_controller.c index 2c8efd09..e4ca0669 100644 --- a/src/nxt_controller.c +++ b/src/nxt_controller.c @@ -8,6 +8,7 @@ #include <nxt_main.h> #include <nxt_runtime.h> #include <nxt_master_process.h> +#include <nxt_conf.h> typedef struct { @@ -39,7 +40,8 @@ static nxt_int_t nxt_controller_request_content_length(void *ctx, static void nxt_controller_process_request(nxt_task_t *task, nxt_event_conn_t *c, nxt_controller_request_t *r); -static nxt_int_t nxt_controller_request_body_parse(nxt_buf_mem_t *b); +static nxt_int_t nxt_controller_request_body_parse(nxt_task_t *task, + nxt_event_conn_t *c); static nxt_http_fields_t nxt_controller_request_fields[] = { @@ -511,27 +513,31 @@ static void nxt_controller_process_request(nxt_task_t *task, nxt_event_conn_t *c, nxt_controller_request_t *r) { - size_t size; - nxt_buf_t *b, *wb; + nxt_str_t response; + nxt_buf_t *b; - static const u_char response[] = "HTTP/1.0 200 OK\r\n\r\n"; + static const u_char response_good[] + = "HTTP/1.0 200 OK\r\n\r\ndone\r\n"; - b = c->read; + static const u_char response_bad[] + = "HTTP/1.0 418 I'm a teapot\r\n\r\nerror\r\n"; - nxt_controller_request_body_parse(&b->mem); + if (nxt_controller_request_body_parse(task, c) == NXT_OK) { + nxt_str_set(&response, response_good); - size = nxt_buf_mem_used_size(&b->mem); + } else { + nxt_str_set(&response, response_bad); + } - wb = nxt_buf_mem_alloc(c->mem_pool, sizeof(response) - 1 + size, 0); - if (nxt_slow_path(wb == NULL)) { + b = nxt_buf_mem_alloc(c->mem_pool, response.length, 0); + if (nxt_slow_path(b == NULL)) { nxt_controller_conn_close(task, c, r); return; } - wb->mem.free = nxt_cpymem(wb->mem.free, response, sizeof(response) - 1); - wb->mem.free = nxt_cpymem(wb->mem.free, b->mem.pos, size); + b->mem.free = nxt_cpymem(b->mem.free, response.start, response.length); - c->write = wb; + c->write = b; c->write_state = &nxt_controller_conn_write_state; nxt_event_conn_write(task->thread->engine, c); @@ -539,8 +545,18 @@ nxt_controller_process_request(nxt_task_t *task, nxt_event_conn_t *c, static nxt_int_t -nxt_controller_request_body_parse(nxt_buf_mem_t *b) +nxt_controller_request_body_parse(nxt_task_t *task, nxt_event_conn_t *c) { - /* TODO */ + nxt_buf_t *b; + nxt_conf_json_value_t *value; + + b = c->read; + + value = nxt_conf_json_parse(&b->mem, c->mem_pool); + + if (value == NULL) { + return NXT_ERROR; + } + return NXT_OK; } |