136a137,142
> static nxt_int_t nxt_python_prepare_msg(nxt_task_t *task, nxt_app_request_t *r,
> nxt_app_wmsg_t *wmsg);
> static nxt_int_t nxt_php_prepare_msg(nxt_task_t *task, nxt_app_request_t *r,
> nxt_app_wmsg_t *wmsg);
> static nxt_int_t nxt_go_prepare_msg(nxt_task_t *task, nxt_app_request_t *r,
> nxt_app_wmsg_t *wmsg);
148a155,162
>
> static nxt_app_prepare_msg_t nxt_app_prepare_msg[] = {
> nxt_python_prepare_msg,
> nxt_php_prepare_msg,
> nxt_go_prepare_msg,
> };
>
>
656a671
> nxt_app_lang_module_t *lang;
738c753
< type = nxt_app_parse_type(&apcf.type);
---
> lang = nxt_app_lang_module(task->thread->runtime, &apcf.type);
740c755
< if (type == NXT_APP_UNKNOWN) {
---
> if (lang == NULL) {
746c761,771
< if (nxt_app_modules[type] == NULL) {
---
> nxt_debug(task, "application language module: \"%s\"", lang->file);
>
> type = nxt_app_parse_type(&lang->type);
>
> if (type == NXT_APP_UNKNOWN) {
> nxt_log(task, NXT_LOG_CRIT, "unknown application type: \"%V\"",
> &lang->type);
> goto app_fail;
> }
>
> if (nxt_app_prepare_msg[type] == NULL) {
748c773
< &apcf.type);
---
> &lang->type);
766c791
< app->module = nxt_app_modules[type];
---
> app->prepare_msg = nxt_app_prepare_msg[type];
2690c2715
< res = port->app->module->prepare_msg(task, &ap->r, &wmsg);
---
> res = port->app->prepare_msg(task, &ap->r, &wmsg);
2712a2738,2977
> static nxt_int_t
> nxt_python_prepare_msg(nxt_task_t *task, nxt_app_request_t *r,
> nxt_app_wmsg_t *wmsg)
> {
> nxt_int_t rc;
> nxt_buf_t *b;
> nxt_http_field_t *field;
> nxt_app_request_header_t *h;
>
> static const nxt_str_t prefix = nxt_string("HTTP_");
> static const nxt_str_t eof = nxt_null_string;
>
> h = &r->header;
>
> #define RC(S) \
> do { \
> rc = (S); \
> if (nxt_slow_path(rc != NXT_OK)) { \
> goto fail; \
> } \
> } while(0)
>
> #define NXT_WRITE(N) \
> RC(nxt_app_msg_write_str(task, wmsg, N))
>
> /* TODO error handle, async mmap buffer assignment */
>
> NXT_WRITE(&h->method);
> NXT_WRITE(&h->target);
> if (h->path.start == h->target.start) {
> NXT_WRITE(&eof);
> } else {
> NXT_WRITE(&h->path);
> }
>
> if (h->query.start != NULL) {
> RC(nxt_app_msg_write_size(task, wmsg,
> h->query.start - h->target.start + 1));
> } else {
> RC(nxt_app_msg_write_size(task, wmsg, 0));
> }
>
> NXT_WRITE(&h->version);
>
> NXT_WRITE(&r->remote);
>
> NXT_WRITE(&h->host);
> NXT_WRITE(&h->content_type);
> NXT_WRITE(&h->content_length);
>
> nxt_list_each(field, h->fields) {
> RC(nxt_app_msg_write_prefixed_upcase(task, wmsg,
> &prefix, &field->name));
> NXT_WRITE(&field->value);
>
> } nxt_list_loop;
>
> /* end-of-headers mark */
> NXT_WRITE(&eof);
>
> RC(nxt_app_msg_write_size(task, wmsg, r->body.preread_size));
>
> for(b = r->body.buf; b != NULL; b = b->next) {
> RC(nxt_app_msg_write_raw(task, wmsg, b->mem.pos,
> nxt_buf_mem_used_size(&b->mem)));
> }
>
> #undef NXT_WRITE
> #undef RC
>
> return NXT_OK;
>
> fail:
>
> return NXT_ERROR;
> }
>
>
> static nxt_int_t
> nxt_php_prepare_msg(nxt_task_t *task, nxt_app_request_t *r,
> nxt_app_wmsg_t *wmsg)
> {
> nxt_int_t rc;
> nxt_buf_t *b;
> nxt_http_field_t *field;
> nxt_app_request_header_t *h;
>
> static const nxt_str_t prefix = nxt_string("HTTP_");
> static const nxt_str_t eof = nxt_null_string;
>
> h = &r->header;
>
> #define RC(S) \
> do { \
> rc = (S); \
> if (nxt_slow_path(rc != NXT_OK)) { \
> goto fail; \
> } \
> } while(0)
>
> #define NXT_WRITE(N) \
> RC(nxt_app_msg_write_str(task, wmsg, N))
>
> /* TODO error handle, async mmap buffer assignment */
>
> NXT_WRITE(&h->method);
> NXT_WRITE(&h->target);
> if (h->path.start == h->target.start) {
> NXT_WRITE(&eof);
> } else {
> NXT_WRITE(&h->path);
> }
>
> if (h->query.start != NULL) {
> RC(nxt_app_msg_write_size(task, wmsg,
> h->query.start - h->target.start + 1));
> } else {
> RC(nxt_app_msg_write_size(task, wmsg, 0));
> }
>
> NXT_WRITE(&h->version);
>
> // PHP_SELF
> // SCRIPT_NAME
> // SCRIPT_FILENAME
> // DOCUMENT_ROOT
>
> NXT_WRITE(&r->remote);
>
> NXT_WRITE(&h->host);
> NXT_WRITE(&h->cookie);
> NXT_WRITE(&h->content_type);
> NXT_WRITE(&h->content_length);
>
> RC(nxt_app_msg_write_size(task, wmsg, h->parsed_content_length));
>
> nxt_list_each(field, h->fields) {
> RC(nxt_app_msg_write_prefixed_upcase(task, wmsg,
> &prefix, &field->name));
> NXT_WRITE(&field->value);
>
> } nxt_list_loop;
>
> /* end-of-headers mark */
> NXT_WRITE(&eof);
>
> RC(nxt_app_msg_write_size(task, wmsg, r->body.preread_size));
>
> for(b = r->body.buf; b != NULL; b = b->next) {
> RC(nxt_app_msg_write_raw(task, wmsg, b->mem.pos,
> nxt_buf_mem_used_size(&b->mem)));
> }
>
> #undef NXT_WRITE
> #undef RC
>
> return NXT_OK;
>
> fail:
>
> return NXT_ERROR;
> }
>
>
> static nxt_int_t
> nxt_go_prepare_msg(nxt_task_t *task, nxt_app_request_t *r, nxt_app_wmsg_t *wmsg)
> {
> nxt_int_t rc;
> nxt_buf_t *b;
> nxt_http_field_t *field;
> nxt_app_request_header_t *h;
>
> static const nxt_str_t eof = nxt_null_string;
>
> h = &r->header;
>
> #define RC(S) \
> do { \
> rc = (S); \
> if (nxt_slow_path(rc != NXT_OK)) { \
> goto fail; \
> } \
> } while(0)
>
> #define NXT_WRITE(N) \
> RC(nxt_app_msg_write_str(task, wmsg, N))
>
> /* TODO error handle, async mmap buffer assignment */
>
> NXT_WRITE(&h->method);
> NXT_WRITE(&h->target);
> if (h->path.start == h->target.start) {
> NXT_WRITE(&eof);
> } else {
> NXT_WRITE(&h->path);
> }
>
> if (h->query.start != NULL) {
> RC(nxt_app_msg_write_size(task, wmsg,
> h->query.start - h->target.start + 1));
> } else {
> RC(nxt_app_msg_write_size(task, wmsg, 0));
> }
>
> NXT_WRITE(&h->version);
>
> NXT_WRITE(&h->host);
> NXT_WRITE(&h->cookie);
> NXT_WRITE(&h->content_type);
> NXT_WRITE(&h->content_length);
>
> RC(nxt_app_msg_write_size(task, wmsg, h->parsed_content_length));
>
> nxt_list_each(field, h->fields) {
> NXT_WRITE(&field->name);
> NXT_WRITE(&field->value);
>
> } nxt_list_loop;
>
> /* end-of-headers mark */
> NXT_WRITE(&eof);
>
> RC(nxt_app_msg_write_size(task, wmsg, r->body.preread_size));
>
> for(b = r->body.buf; b != NULL; b = b->next) {
> RC(nxt_app_msg_write_raw(task, wmsg, b->mem.pos,
> nxt_buf_mem_used_size(&b->mem)));
> }
>
> #undef NXT_WRITE
> #undef RC
>
> return NXT_OK;
>
> fail:
>
> return NXT_ERROR;
> }
>
>