10Sigor@sysoev.ru 20Sigor@sysoev.ru /* 386Smax.romanov@nginx.com * Copyright (C) Max Romanov 40Sigor@sysoev.ru * Copyright (C) Valentin V. Bartenev 50Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 60Sigor@sysoev.ru */ 70Sigor@sysoev.ru 80Sigor@sysoev.ru #include "php.h" 90Sigor@sysoev.ru #include "SAPI.h" 100Sigor@sysoev.ru #include "php_main.h" 110Sigor@sysoev.ru #include "php_variables.h" 120Sigor@sysoev.ru 130Sigor@sysoev.ru #include <nxt_main.h> 140Sigor@sysoev.ru #include <nxt_application.h> 150Sigor@sysoev.ru 160Sigor@sysoev.ru 17142Smax.romanov@nginx.com static nxt_int_t nxt_php_init(nxt_task_t *task, nxt_common_app_conf_t *conf); 180Sigor@sysoev.ru 1986Smax.romanov@nginx.com static nxt_int_t nxt_php_prepare_msg(nxt_task_t *task, 2086Smax.romanov@nginx.com nxt_app_request_t *r, nxt_app_wmsg_t *wmsg); 210Sigor@sysoev.ru 2286Smax.romanov@nginx.com static nxt_int_t nxt_php_run(nxt_task_t *task, 2386Smax.romanov@nginx.com nxt_app_rmsg_t *rmsg, nxt_app_wmsg_t *wmsg); 240Sigor@sysoev.ru 2586Smax.romanov@nginx.com #if PHP_MAJOR_VERSION >= 7 2686Smax.romanov@nginx.com # define NXT_PHP7 1 2786Smax.romanov@nginx.com # if PHP_MINOR_VERSION >= 1 2886Smax.romanov@nginx.com # define NXT_HAVE_PHP_LOG_MESSAGE_WITH_SYSLOG_TYPE 1 2986Smax.romanov@nginx.com # else 3086Smax.romanov@nginx.com # define NXT_HAVE_PHP_INTERRUPTS 1 3186Smax.romanov@nginx.com # endif 3286Smax.romanov@nginx.com # define NXT_HAVE_PHP_IGNORE_CWD 1 3386Smax.romanov@nginx.com #else 3486Smax.romanov@nginx.com # define NXT_HAVE_PHP_INTERRUPTS 1 3586Smax.romanov@nginx.com # if PHP_MINOR_VERSION >= 4 3686Smax.romanov@nginx.com # define NXT_HAVE_PHP_IGNORE_CWD 1 3786Smax.romanov@nginx.com # endif 3886Smax.romanov@nginx.com #endif 390Sigor@sysoev.ru 400Sigor@sysoev.ru static int nxt_php_startup(sapi_module_struct *sapi_module); 410Sigor@sysoev.ru static int nxt_php_send_headers(sapi_headers_struct *sapi_headers); 420Sigor@sysoev.ru static char *nxt_php_read_cookies(void); 430Sigor@sysoev.ru static void nxt_php_register_variables(zval *track_vars_array); 4486Smax.romanov@nginx.com static void nxt_php_log_message(char *message 4586Smax.romanov@nginx.com #ifdef NXT_HAVE_PHP_LOG_MESSAGE_WITH_SYSLOG_TYPE 4686Smax.romanov@nginx.com , int syslog_type_int 4786Smax.romanov@nginx.com #endif 4886Smax.romanov@nginx.com ); 490Sigor@sysoev.ru 500Sigor@sysoev.ru #ifdef NXT_PHP7 510Sigor@sysoev.ru static size_t nxt_php_unbuffered_write(const char *str, 520Sigor@sysoev.ru size_t str_length TSRMLS_DC); 530Sigor@sysoev.ru static size_t nxt_php_read_post(char *buffer, size_t count_bytes TSRMLS_DC); 540Sigor@sysoev.ru #else 550Sigor@sysoev.ru static int nxt_php_unbuffered_write(const char *str, uint str_length TSRMLS_DC); 560Sigor@sysoev.ru static int nxt_php_read_post(char *buffer, uint count_bytes TSRMLS_DC); 570Sigor@sysoev.ru #endif 580Sigor@sysoev.ru 59114Smax.romanov@nginx.com static void nxt_php_flush(void *server_context); 60114Smax.romanov@nginx.com 6186Smax.romanov@nginx.com extern nxt_int_t nxt_php_sapi_init(nxt_thread_t *thr, nxt_runtime_t *rt); 6286Smax.romanov@nginx.com 630Sigor@sysoev.ru 640Sigor@sysoev.ru static sapi_module_struct nxt_php_sapi_module = 650Sigor@sysoev.ru { 660Sigor@sysoev.ru (char *) "cli-server", 679Sigor@sysoev.ru (char *) "nginext", 680Sigor@sysoev.ru 690Sigor@sysoev.ru nxt_php_startup, /* startup */ 700Sigor@sysoev.ru php_module_shutdown_wrapper, /* shutdown */ 710Sigor@sysoev.ru 720Sigor@sysoev.ru NULL, /* activate */ 730Sigor@sysoev.ru NULL, /* deactivate */ 740Sigor@sysoev.ru 750Sigor@sysoev.ru nxt_php_unbuffered_write, /* unbuffered write */ 76114Smax.romanov@nginx.com nxt_php_flush, /* flush */ 770Sigor@sysoev.ru NULL, /* get uid */ 780Sigor@sysoev.ru NULL, /* getenv */ 790Sigor@sysoev.ru 800Sigor@sysoev.ru php_error, /* error handler */ 810Sigor@sysoev.ru 820Sigor@sysoev.ru NULL, /* header handler */ 830Sigor@sysoev.ru nxt_php_send_headers, /* send headers handler */ 840Sigor@sysoev.ru NULL, /* send header handler */ 850Sigor@sysoev.ru 860Sigor@sysoev.ru nxt_php_read_post, /* read POST data */ 870Sigor@sysoev.ru nxt_php_read_cookies, /* read Cookies */ 880Sigor@sysoev.ru 890Sigor@sysoev.ru nxt_php_register_variables, /* register server variables */ 900Sigor@sysoev.ru nxt_php_log_message, /* log message */ 9186Smax.romanov@nginx.com NULL, /* get request time */ 9286Smax.romanov@nginx.com NULL, /* terminate process */ 930Sigor@sysoev.ru 9486Smax.romanov@nginx.com NULL, /* php_ini_path_override */ 9586Smax.romanov@nginx.com #ifdef NXT_HAVE_PHP_INTERRUPTS 9686Smax.romanov@nginx.com NULL, /* block_interruptions */ 9786Smax.romanov@nginx.com NULL, /* unblock_interruptions */ 9886Smax.romanov@nginx.com #endif 9986Smax.romanov@nginx.com NULL, /* default_post_reader */ 10086Smax.romanov@nginx.com NULL, /* treat_data */ 10186Smax.romanov@nginx.com NULL, /* executable_location */ 10286Smax.romanov@nginx.com 10386Smax.romanov@nginx.com 0, /* php_ini_ignore */ 10486Smax.romanov@nginx.com #ifdef NXT_HAVE_PHP_IGNORE_CWD 10586Smax.romanov@nginx.com 0, /* php_ini_ignore_cwd */ 10686Smax.romanov@nginx.com #endif 10786Smax.romanov@nginx.com NULL, /* get_fd */ 10886Smax.romanov@nginx.com 10986Smax.romanov@nginx.com NULL, /* force_http_10 */ 11086Smax.romanov@nginx.com 11186Smax.romanov@nginx.com NULL, /* get_target_uid */ 11286Smax.romanov@nginx.com NULL, /* get_target_gid */ 11386Smax.romanov@nginx.com 11486Smax.romanov@nginx.com NULL, /* input_filter */ 11586Smax.romanov@nginx.com 11686Smax.romanov@nginx.com NULL, /* ini_defaults */ 11786Smax.romanov@nginx.com 0, /* phpinfo_as_text */ 11886Smax.romanov@nginx.com 11986Smax.romanov@nginx.com NULL, /* ini_entries */ 12086Smax.romanov@nginx.com NULL, /* additional_functions */ 12186Smax.romanov@nginx.com NULL /* input_filter_init */ 1220Sigor@sysoev.ru }; 1230Sigor@sysoev.ru 12486Smax.romanov@nginx.com typedef struct { 12586Smax.romanov@nginx.com nxt_task_t *task; 12686Smax.romanov@nginx.com nxt_app_rmsg_t *rmsg; 12786Smax.romanov@nginx.com nxt_app_request_t r; 12886Smax.romanov@nginx.com nxt_str_t script; 12986Smax.romanov@nginx.com nxt_app_wmsg_t *wmsg; 13086Smax.romanov@nginx.com nxt_mp_t *mem_pool; 131*206Smax.romanov@nginx.com 132*206Smax.romanov@nginx.com size_t body_preread_size; 13386Smax.romanov@nginx.com } nxt_php_run_ctx_t; 13486Smax.romanov@nginx.com 13586Smax.romanov@nginx.com nxt_inline nxt_int_t nxt_php_write(nxt_php_run_ctx_t *ctx, 13686Smax.romanov@nginx.com const u_char *data, size_t len, 13786Smax.romanov@nginx.com nxt_bool_t flush, nxt_bool_t last); 13886Smax.romanov@nginx.com 1390Sigor@sysoev.ru 1400Sigor@sysoev.ru static nxt_str_t nxt_php_path; 1410Sigor@sysoev.ru static nxt_str_t nxt_php_root; 1420Sigor@sysoev.ru static nxt_str_t nxt_php_script; 143142Smax.romanov@nginx.com static nxt_str_t nxt_php_index = nxt_string("index.php"); 144142Smax.romanov@nginx.com 145142Smax.romanov@nginx.com static void 146142Smax.romanov@nginx.com nxt_php_strdup(nxt_str_t *dst, nxt_str_t *src) 147142Smax.romanov@nginx.com { 148142Smax.romanov@nginx.com dst->start = malloc(src->length + 1); 149142Smax.romanov@nginx.com nxt_memcpy(dst->start, src->start, src->length); 150142Smax.romanov@nginx.com dst->start[src->length] = '\0'; 151142Smax.romanov@nginx.com 152142Smax.romanov@nginx.com dst->length = src->length; 153142Smax.romanov@nginx.com } 154142Smax.romanov@nginx.com 155142Smax.romanov@nginx.com static void 156142Smax.romanov@nginx.com nxt_php_str_trim_trail(nxt_str_t *str, u_char t) 157142Smax.romanov@nginx.com { 158142Smax.romanov@nginx.com while (str->length > 0 && str->start[str->length - 1] == t) { 159142Smax.romanov@nginx.com str->length--; 160142Smax.romanov@nginx.com } 161142Smax.romanov@nginx.com 162142Smax.romanov@nginx.com str->start[str->length] = '\0'; 163142Smax.romanov@nginx.com } 164142Smax.romanov@nginx.com 165142Smax.romanov@nginx.com 166142Smax.romanov@nginx.com static void 167142Smax.romanov@nginx.com nxt_php_str_trim_lead(nxt_str_t *str, u_char t) 168142Smax.romanov@nginx.com { 169142Smax.romanov@nginx.com while (str->length > 0 && str->start[0] == t) { 170142Smax.romanov@nginx.com str->length--; 171142Smax.romanov@nginx.com str->start++; 172142Smax.romanov@nginx.com } 173142Smax.romanov@nginx.com } 1740Sigor@sysoev.ru 1750Sigor@sysoev.ru 17686Smax.romanov@nginx.com nxt_application_module_t nxt_php_module = { 17786Smax.romanov@nginx.com nxt_php_init, 17886Smax.romanov@nginx.com nxt_php_prepare_msg, 17986Smax.romanov@nginx.com nxt_php_run 18086Smax.romanov@nginx.com }; 1810Sigor@sysoev.ru 1820Sigor@sysoev.ru 18386Smax.romanov@nginx.com nxt_int_t 18486Smax.romanov@nginx.com nxt_php_sapi_init(nxt_thread_t *thr, nxt_runtime_t *rt) 1850Sigor@sysoev.ru { 186142Smax.romanov@nginx.com nxt_app_modules[NXT_APP_PHP] = &nxt_php_module; 18786Smax.romanov@nginx.com 188142Smax.romanov@nginx.com #if PHP_MAJOR_VERSION == 5 189142Smax.romanov@nginx.com nxt_app_modules[NXT_APP_PHP5] = &nxt_php_module; 190142Smax.romanov@nginx.com #endif 19186Smax.romanov@nginx.com 192142Smax.romanov@nginx.com #if PHP_MAJOR_VERSION == 7 193142Smax.romanov@nginx.com nxt_app_modules[NXT_APP_PHP7] = &nxt_php_module; 194142Smax.romanov@nginx.com #endif 1950Sigor@sysoev.ru 196142Smax.romanov@nginx.com return NXT_OK; 1970Sigor@sysoev.ru } 1980Sigor@sysoev.ru 1990Sigor@sysoev.ru 20086Smax.romanov@nginx.com static nxt_int_t 201142Smax.romanov@nginx.com nxt_php_init(nxt_task_t *task, nxt_common_app_conf_t *conf) 2020Sigor@sysoev.ru { 203142Smax.romanov@nginx.com nxt_str_t *root, *path, *script, *index; 204142Smax.romanov@nginx.com nxt_php_app_conf_t *c; 205142Smax.romanov@nginx.com 206142Smax.romanov@nginx.com c = &conf->u.php; 207142Smax.romanov@nginx.com 208142Smax.romanov@nginx.com if (c->root.length == 0) { 209142Smax.romanov@nginx.com nxt_log_emerg(task->log, "php root is empty"); 210142Smax.romanov@nginx.com return NXT_ERROR; 211142Smax.romanov@nginx.com } 212142Smax.romanov@nginx.com 213142Smax.romanov@nginx.com root = &nxt_php_root; 214142Smax.romanov@nginx.com path = &nxt_php_path; 215142Smax.romanov@nginx.com script = &nxt_php_script; 216142Smax.romanov@nginx.com index = &nxt_php_index; 217142Smax.romanov@nginx.com 218142Smax.romanov@nginx.com nxt_php_strdup(root, &c->root); 219142Smax.romanov@nginx.com 220142Smax.romanov@nginx.com nxt_php_str_trim_trail(root, '/'); 221142Smax.romanov@nginx.com 222142Smax.romanov@nginx.com if (c->script.length > 0) { 223142Smax.romanov@nginx.com nxt_php_str_trim_lead(&c->script, '/'); 224142Smax.romanov@nginx.com 225142Smax.romanov@nginx.com path->length = root->length + c->script.length + 1; 226142Smax.romanov@nginx.com path->start = malloc(path->length + 1); 227142Smax.romanov@nginx.com 228142Smax.romanov@nginx.com nxt_memcpy(path->start, root->start, root->length); 229142Smax.romanov@nginx.com path->start[root->length] = '/'; 230142Smax.romanov@nginx.com 231142Smax.romanov@nginx.com nxt_memcpy(path->start + root->length + 1, 232142Smax.romanov@nginx.com c->script.start, c->script.length); 233142Smax.romanov@nginx.com 234142Smax.romanov@nginx.com path->start[path->length] = '\0'; 235142Smax.romanov@nginx.com 236142Smax.romanov@nginx.com 237142Smax.romanov@nginx.com script->length = c->script.length + 1; 238142Smax.romanov@nginx.com script->start = malloc(script->length + 1); 239142Smax.romanov@nginx.com script->start[0] = '/'; 240142Smax.romanov@nginx.com nxt_memcpy(script->start + 1, c->script.start, c->script.length); 241142Smax.romanov@nginx.com script->start[script->length] = '\0'; 242142Smax.romanov@nginx.com 243142Smax.romanov@nginx.com nxt_log_error(NXT_LOG_INFO, task->log, 244142Smax.romanov@nginx.com "(ABS_MODE) php script \"%V\" root: \"%V\"", 245142Smax.romanov@nginx.com script, root); 246142Smax.romanov@nginx.com } else { 247142Smax.romanov@nginx.com nxt_log_error(NXT_LOG_INFO, task->log, 248142Smax.romanov@nginx.com "(non ABS_MODE) php root: \"%V\"", root); 249142Smax.romanov@nginx.com } 250142Smax.romanov@nginx.com 251142Smax.romanov@nginx.com if (c->index.length > 0) { 252142Smax.romanov@nginx.com nxt_php_strdup(index, &c->index); 253142Smax.romanov@nginx.com } 254142Smax.romanov@nginx.com 255142Smax.romanov@nginx.com sapi_startup(&nxt_php_sapi_module); 256142Smax.romanov@nginx.com nxt_php_startup(&nxt_php_sapi_module); 257142Smax.romanov@nginx.com 2580Sigor@sysoev.ru return NXT_OK; 2590Sigor@sysoev.ru } 2600Sigor@sysoev.ru 2610Sigor@sysoev.ru 26286Smax.romanov@nginx.com static nxt_int_t 26386Smax.romanov@nginx.com nxt_php_read_request(nxt_task_t *task, nxt_app_rmsg_t *rmsg, 26486Smax.romanov@nginx.com nxt_php_run_ctx_t *ctx) 2650Sigor@sysoev.ru { 26686Smax.romanov@nginx.com u_char *p; 26786Smax.romanov@nginx.com size_t s; 268114Smax.romanov@nginx.com nxt_int_t rc; 26994Smax.romanov@nginx.com nxt_str_t script_name; 27086Smax.romanov@nginx.com nxt_app_request_header_t *h; 2710Sigor@sysoev.ru 27286Smax.romanov@nginx.com h = &ctx->r.header; 2730Sigor@sysoev.ru 274114Smax.romanov@nginx.com #define RC(S) \ 275114Smax.romanov@nginx.com do { \ 276114Smax.romanov@nginx.com rc = (S); \ 277114Smax.romanov@nginx.com if (nxt_slow_path(rc != NXT_OK)) { \ 278114Smax.romanov@nginx.com goto fail; \ 279114Smax.romanov@nginx.com } \ 280114Smax.romanov@nginx.com } while(0) 2810Sigor@sysoev.ru 282114Smax.romanov@nginx.com #define NXT_READ(dst) \ 283114Smax.romanov@nginx.com RC(nxt_app_msg_read_str(task, rmsg, (dst))) 284114Smax.romanov@nginx.com 285114Smax.romanov@nginx.com NXT_READ(&h->method); 286114Smax.romanov@nginx.com NXT_READ(&h->target); 287114Smax.romanov@nginx.com NXT_READ(&h->path); 288114Smax.romanov@nginx.com 289114Smax.romanov@nginx.com RC(nxt_app_msg_read_size(task, rmsg, &s)); 29086Smax.romanov@nginx.com if (s > 0) { 29186Smax.romanov@nginx.com s--; 292112Smax.romanov@nginx.com h->query.start = h->target.start + s; 293112Smax.romanov@nginx.com h->query.length = h->target.length - s; 2940Sigor@sysoev.ru 295112Smax.romanov@nginx.com if (h->path.start == NULL) { 296112Smax.romanov@nginx.com h->path.start = h->target.start; 297112Smax.romanov@nginx.com h->path.length = s - 1; 29886Smax.romanov@nginx.com } 2990Sigor@sysoev.ru } 3000Sigor@sysoev.ru 301112Smax.romanov@nginx.com if (h->path.start == NULL) { 302112Smax.romanov@nginx.com h->path = h->target; 303112Smax.romanov@nginx.com } 304112Smax.romanov@nginx.com 30586Smax.romanov@nginx.com if (nxt_php_path.start == NULL) { 306112Smax.romanov@nginx.com if (h->path.start[h->path.length - 1] == '/') { 307142Smax.romanov@nginx.com script_name = nxt_php_index; 30894Smax.romanov@nginx.com } else { 30994Smax.romanov@nginx.com script_name.length = 0; 31094Smax.romanov@nginx.com } 31194Smax.romanov@nginx.com 312112Smax.romanov@nginx.com ctx->script.length = nxt_php_root.length + h->path.length + 31394Smax.romanov@nginx.com script_name.length; 31486Smax.romanov@nginx.com ctx->script.start = nxt_mp_nget(ctx->mem_pool, 31586Smax.romanov@nginx.com ctx->script.length + 1); 31686Smax.romanov@nginx.com 31786Smax.romanov@nginx.com p = ctx->script.start; 31886Smax.romanov@nginx.com 31986Smax.romanov@nginx.com nxt_memcpy(p, nxt_php_root.start, nxt_php_root.length); 32086Smax.romanov@nginx.com p += nxt_php_root.length; 32194Smax.romanov@nginx.com 322112Smax.romanov@nginx.com nxt_memcpy(p, h->path.start, h->path.length); 323112Smax.romanov@nginx.com p += h->path.length; 32494Smax.romanov@nginx.com 32594Smax.romanov@nginx.com if (script_name.length > 0) { 32694Smax.romanov@nginx.com nxt_memcpy(p, script_name.start, script_name.length); 32794Smax.romanov@nginx.com p += script_name.length; 32894Smax.romanov@nginx.com } 32994Smax.romanov@nginx.com 33094Smax.romanov@nginx.com p[0] = '\0'; 33186Smax.romanov@nginx.com } else { 33286Smax.romanov@nginx.com ctx->script = nxt_php_path; 33386Smax.romanov@nginx.com } 33486Smax.romanov@nginx.com 335114Smax.romanov@nginx.com NXT_READ(&h->version); 336114Smax.romanov@nginx.com 337114Smax.romanov@nginx.com NXT_READ(&ctx->r.remote); 33886Smax.romanov@nginx.com 339114Smax.romanov@nginx.com NXT_READ(&h->host); 340114Smax.romanov@nginx.com NXT_READ(&h->cookie); 341114Smax.romanov@nginx.com NXT_READ(&h->content_type); 342114Smax.romanov@nginx.com NXT_READ(&h->content_length); 34386Smax.romanov@nginx.com 344114Smax.romanov@nginx.com RC(nxt_app_msg_read_size(task, rmsg, &s)); 34586Smax.romanov@nginx.com h->parsed_content_length = s; 34686Smax.romanov@nginx.com 347114Smax.romanov@nginx.com #undef NXT_READ 348114Smax.romanov@nginx.com #undef RC 34994Smax.romanov@nginx.com 35086Smax.romanov@nginx.com /* Further headers read moved to nxt_php_register_variables. */ 3510Sigor@sysoev.ru return NXT_OK; 352114Smax.romanov@nginx.com 353114Smax.romanov@nginx.com fail: 354114Smax.romanov@nginx.com 355114Smax.romanov@nginx.com return rc; 3560Sigor@sysoev.ru } 3570Sigor@sysoev.ru 3580Sigor@sysoev.ru 35986Smax.romanov@nginx.com static nxt_int_t 36086Smax.romanov@nginx.com nxt_php_prepare_msg(nxt_task_t *task, nxt_app_request_t *r, 36186Smax.romanov@nginx.com nxt_app_wmsg_t *wmsg) 36286Smax.romanov@nginx.com { 36386Smax.romanov@nginx.com nxt_int_t rc; 364*206Smax.romanov@nginx.com nxt_buf_t *b; 36586Smax.romanov@nginx.com nxt_http_field_t *field; 36686Smax.romanov@nginx.com nxt_app_request_header_t *h; 36786Smax.romanov@nginx.com 36886Smax.romanov@nginx.com static const nxt_str_t prefix = nxt_string("HTTP_"); 36986Smax.romanov@nginx.com static const nxt_str_t eof = nxt_null_string; 37086Smax.romanov@nginx.com 37186Smax.romanov@nginx.com h = &r->header; 3720Sigor@sysoev.ru 37386Smax.romanov@nginx.com #define RC(S) \ 37486Smax.romanov@nginx.com do { \ 37586Smax.romanov@nginx.com rc = (S); \ 37686Smax.romanov@nginx.com if (nxt_slow_path(rc != NXT_OK)) { \ 37786Smax.romanov@nginx.com goto fail; \ 37886Smax.romanov@nginx.com } \ 37986Smax.romanov@nginx.com } while(0) 38086Smax.romanov@nginx.com 38186Smax.romanov@nginx.com #define NXT_WRITE(N) \ 38286Smax.romanov@nginx.com RC(nxt_app_msg_write_str(task, wmsg, N)) 38386Smax.romanov@nginx.com 38486Smax.romanov@nginx.com /* TODO error handle, async mmap buffer assignment */ 38586Smax.romanov@nginx.com 38686Smax.romanov@nginx.com NXT_WRITE(&h->method); 387112Smax.romanov@nginx.com NXT_WRITE(&h->target); 388112Smax.romanov@nginx.com if (h->path.start == h->target.start) { 389112Smax.romanov@nginx.com NXT_WRITE(&eof); 390112Smax.romanov@nginx.com } else { 391112Smax.romanov@nginx.com NXT_WRITE(&h->path); 392112Smax.romanov@nginx.com } 3930Sigor@sysoev.ru 39486Smax.romanov@nginx.com if (h->query.start != NULL) { 39586Smax.romanov@nginx.com RC(nxt_app_msg_write_size(task, wmsg, 396112Smax.romanov@nginx.com h->query.start - h->target.start + 1)); 39786Smax.romanov@nginx.com } else { 39886Smax.romanov@nginx.com RC(nxt_app_msg_write_size(task, wmsg, 0)); 39986Smax.romanov@nginx.com } 40086Smax.romanov@nginx.com 40186Smax.romanov@nginx.com NXT_WRITE(&h->version); 40286Smax.romanov@nginx.com 40386Smax.romanov@nginx.com // PHP_SELF 40486Smax.romanov@nginx.com // SCRIPT_NAME 40586Smax.romanov@nginx.com // SCRIPT_FILENAME 40686Smax.romanov@nginx.com // DOCUMENT_ROOT 40786Smax.romanov@nginx.com 408114Smax.romanov@nginx.com NXT_WRITE(&r->remote); 409114Smax.romanov@nginx.com 410114Smax.romanov@nginx.com NXT_WRITE(&h->host); 41186Smax.romanov@nginx.com NXT_WRITE(&h->cookie); 41286Smax.romanov@nginx.com NXT_WRITE(&h->content_type); 41386Smax.romanov@nginx.com NXT_WRITE(&h->content_length); 41486Smax.romanov@nginx.com 41586Smax.romanov@nginx.com RC(nxt_app_msg_write_size(task, wmsg, h->parsed_content_length)); 41686Smax.romanov@nginx.com 41786Smax.romanov@nginx.com nxt_list_each(field, h->fields) { 41886Smax.romanov@nginx.com RC(nxt_app_msg_write_prefixed_upcase(task, wmsg, 41986Smax.romanov@nginx.com &prefix, &field->name)); 42086Smax.romanov@nginx.com NXT_WRITE(&field->value); 42186Smax.romanov@nginx.com 42286Smax.romanov@nginx.com } nxt_list_loop; 42386Smax.romanov@nginx.com 42486Smax.romanov@nginx.com /* end-of-headers mark */ 42586Smax.romanov@nginx.com NXT_WRITE(&eof); 42686Smax.romanov@nginx.com 427*206Smax.romanov@nginx.com RC(nxt_app_msg_write_size(task, wmsg, r->body.preread_size)); 428*206Smax.romanov@nginx.com 429*206Smax.romanov@nginx.com for(b = r->body.buf; b != NULL; b = b->next) { 430*206Smax.romanov@nginx.com RC(nxt_app_msg_write_raw(task, wmsg, b->mem.pos, 431*206Smax.romanov@nginx.com nxt_buf_mem_used_size(&b->mem))); 432*206Smax.romanov@nginx.com } 433*206Smax.romanov@nginx.com 43486Smax.romanov@nginx.com #undef NXT_WRITE 43586Smax.romanov@nginx.com #undef RC 43686Smax.romanov@nginx.com 43786Smax.romanov@nginx.com return NXT_OK; 43886Smax.romanov@nginx.com 43986Smax.romanov@nginx.com fail: 44086Smax.romanov@nginx.com 44186Smax.romanov@nginx.com return NXT_ERROR; 44286Smax.romanov@nginx.com } 4430Sigor@sysoev.ru 4440Sigor@sysoev.ru 44586Smax.romanov@nginx.com static nxt_int_t 44686Smax.romanov@nginx.com nxt_php_run(nxt_task_t *task, 44786Smax.romanov@nginx.com nxt_app_rmsg_t *rmsg, nxt_app_wmsg_t *wmsg) 4480Sigor@sysoev.ru { 449114Smax.romanov@nginx.com nxt_int_t rc; 45086Smax.romanov@nginx.com zend_file_handle file_handle; 45186Smax.romanov@nginx.com nxt_php_run_ctx_t run_ctx; 45286Smax.romanov@nginx.com nxt_app_request_header_t *h; 4530Sigor@sysoev.ru 45486Smax.romanov@nginx.com if (nxt_php_root.length == 0) { 4550Sigor@sysoev.ru return NXT_ERROR; 4560Sigor@sysoev.ru } 4570Sigor@sysoev.ru 45886Smax.romanov@nginx.com nxt_memzero(&run_ctx, sizeof(run_ctx)); 45986Smax.romanov@nginx.com 46086Smax.romanov@nginx.com run_ctx.task = task; 46186Smax.romanov@nginx.com run_ctx.rmsg = rmsg; 46286Smax.romanov@nginx.com run_ctx.wmsg = wmsg; 46386Smax.romanov@nginx.com 46486Smax.romanov@nginx.com run_ctx.mem_pool = nxt_mp_create(1024, 128, 256, 32); 4650Sigor@sysoev.ru 46686Smax.romanov@nginx.com h = &run_ctx.r.header; 46786Smax.romanov@nginx.com 468114Smax.romanov@nginx.com rc = nxt_php_read_request(task, rmsg, &run_ctx); 469114Smax.romanov@nginx.com 470114Smax.romanov@nginx.com if (nxt_slow_path(rc != NXT_OK)) { 471114Smax.romanov@nginx.com goto fail; 472114Smax.romanov@nginx.com } 47386Smax.romanov@nginx.com 47486Smax.romanov@nginx.com SG(server_context) = &run_ctx; 475112Smax.romanov@nginx.com SG(request_info).request_uri = (char *) h->target.start; 47686Smax.romanov@nginx.com SG(request_info).request_method = (char *) h->method.start; 4770Sigor@sysoev.ru 4780Sigor@sysoev.ru SG(request_info).proto_num = 1001; 4790Sigor@sysoev.ru 48086Smax.romanov@nginx.com SG(request_info).query_string = (char *) h->query.start; 48186Smax.romanov@nginx.com SG(request_info).content_length = h->parsed_content_length; 4820Sigor@sysoev.ru 48386Smax.romanov@nginx.com if (h->content_type.start != NULL) { 48486Smax.romanov@nginx.com SG(request_info).content_type = (char *) h->content_type.start; 4850Sigor@sysoev.ru } 4860Sigor@sysoev.ru 4870Sigor@sysoev.ru SG(sapi_headers).http_response_code = 200; 4880Sigor@sysoev.ru 4890Sigor@sysoev.ru SG(request_info).path_translated = NULL; 4900Sigor@sysoev.ru 4910Sigor@sysoev.ru file_handle.type = ZEND_HANDLE_FILENAME; 49286Smax.romanov@nginx.com file_handle.filename = (char *) run_ctx.script.start; 4930Sigor@sysoev.ru file_handle.free_filename = 0; 4940Sigor@sysoev.ru file_handle.opened_path = NULL; 4950Sigor@sysoev.ru 496142Smax.romanov@nginx.com nxt_debug(task, "handle.filename = '%s'", run_ctx.script.start); 497142Smax.romanov@nginx.com 49886Smax.romanov@nginx.com if (nxt_php_path.start != NULL) { 49986Smax.romanov@nginx.com nxt_debug(task, "run script %V in absolute mode", &nxt_php_path); 50086Smax.romanov@nginx.com } else { 50186Smax.romanov@nginx.com nxt_debug(task, "run script %V", &run_ctx.script); 50286Smax.romanov@nginx.com } 5030Sigor@sysoev.ru 5040Sigor@sysoev.ru if (nxt_slow_path(php_request_startup() == FAILURE)) { 505142Smax.romanov@nginx.com nxt_debug(task, "php_request_startup() failed"); 50686Smax.romanov@nginx.com goto fail; 5070Sigor@sysoev.ru } 5080Sigor@sysoev.ru 5090Sigor@sysoev.ru php_execute_script(&file_handle TSRMLS_CC); 5100Sigor@sysoev.ru php_request_shutdown(NULL); 5110Sigor@sysoev.ru 51286Smax.romanov@nginx.com nxt_app_msg_flush(task, wmsg, 1); 51386Smax.romanov@nginx.com 51486Smax.romanov@nginx.com nxt_mp_destroy(run_ctx.mem_pool); 51586Smax.romanov@nginx.com 5160Sigor@sysoev.ru return NXT_OK; 51786Smax.romanov@nginx.com 51886Smax.romanov@nginx.com fail: 51986Smax.romanov@nginx.com 52086Smax.romanov@nginx.com nxt_mp_destroy(run_ctx.mem_pool); 52186Smax.romanov@nginx.com 52286Smax.romanov@nginx.com return NXT_ERROR; 52386Smax.romanov@nginx.com } 52486Smax.romanov@nginx.com 52586Smax.romanov@nginx.com 52686Smax.romanov@nginx.com nxt_inline nxt_int_t 52786Smax.romanov@nginx.com nxt_php_write(nxt_php_run_ctx_t *ctx, const u_char *data, size_t len, 52886Smax.romanov@nginx.com nxt_bool_t flush, nxt_bool_t last) 52986Smax.romanov@nginx.com { 53086Smax.romanov@nginx.com nxt_int_t rc; 53186Smax.romanov@nginx.com 532114Smax.romanov@nginx.com if (len > 0) { 533114Smax.romanov@nginx.com rc = nxt_app_msg_write_raw(ctx->task, ctx->wmsg, data, len); 534114Smax.romanov@nginx.com } else { 535114Smax.romanov@nginx.com rc = NXT_OK; 536114Smax.romanov@nginx.com } 53786Smax.romanov@nginx.com 53886Smax.romanov@nginx.com if (flush || last) { 53986Smax.romanov@nginx.com rc = nxt_app_msg_flush(ctx->task, ctx->wmsg, last); 54086Smax.romanov@nginx.com } 54186Smax.romanov@nginx.com 54286Smax.romanov@nginx.com return rc; 5430Sigor@sysoev.ru } 5440Sigor@sysoev.ru 5450Sigor@sysoev.ru 5460Sigor@sysoev.ru static int 5470Sigor@sysoev.ru nxt_php_startup(sapi_module_struct *sapi_module) 5480Sigor@sysoev.ru { 5490Sigor@sysoev.ru return php_module_startup(sapi_module, NULL, 0); 5500Sigor@sysoev.ru } 5510Sigor@sysoev.ru 5520Sigor@sysoev.ru 5530Sigor@sysoev.ru #ifdef NXT_PHP7 5540Sigor@sysoev.ru static size_t 5550Sigor@sysoev.ru nxt_php_unbuffered_write(const char *str, size_t str_length TSRMLS_DC) 5560Sigor@sysoev.ru #else 5570Sigor@sysoev.ru static int 5580Sigor@sysoev.ru nxt_php_unbuffered_write(const char *str, uint str_length TSRMLS_DC) 5590Sigor@sysoev.ru #endif 5600Sigor@sysoev.ru { 561114Smax.romanov@nginx.com nxt_int_t rc; 56286Smax.romanov@nginx.com nxt_php_run_ctx_t *ctx; 5630Sigor@sysoev.ru 56486Smax.romanov@nginx.com ctx = SG(server_context); 5650Sigor@sysoev.ru 566114Smax.romanov@nginx.com rc = nxt_php_write(ctx, (u_char *) str, str_length, 1, 0); 567114Smax.romanov@nginx.com 568114Smax.romanov@nginx.com if (nxt_fast_path(rc == NXT_OK)) { 569114Smax.romanov@nginx.com return str_length; 570114Smax.romanov@nginx.com } 5710Sigor@sysoev.ru 572114Smax.romanov@nginx.com // TODO handle NXT_AGAIN 573114Smax.romanov@nginx.com php_handle_aborted_connection(); 574114Smax.romanov@nginx.com return 0; 575114Smax.romanov@nginx.com } 576114Smax.romanov@nginx.com 577114Smax.romanov@nginx.com 578114Smax.romanov@nginx.com static void 579114Smax.romanov@nginx.com nxt_php_flush(void *server_context) 580114Smax.romanov@nginx.com { 581114Smax.romanov@nginx.com nxt_php_run_ctx_t *ctx; 582114Smax.romanov@nginx.com 583114Smax.romanov@nginx.com ctx = server_context; 584114Smax.romanov@nginx.com 585114Smax.romanov@nginx.com (void) nxt_app_msg_flush(ctx->task, ctx->wmsg, 0); 5860Sigor@sysoev.ru } 5870Sigor@sysoev.ru 5880Sigor@sysoev.ru 5890Sigor@sysoev.ru static int 5900Sigor@sysoev.ru nxt_php_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) 5910Sigor@sysoev.ru { 5920Sigor@sysoev.ru size_t len; 593114Smax.romanov@nginx.com u_char *status, buf[64]; 594114Smax.romanov@nginx.com nxt_int_t rc; 595114Smax.romanov@nginx.com nxt_php_run_ctx_t *ctx; 5960Sigor@sysoev.ru sapi_header_struct *h; 5970Sigor@sysoev.ru zend_llist_position zpos; 5980Sigor@sysoev.ru 5990Sigor@sysoev.ru static const u_char default_repsonse[] 6000Sigor@sysoev.ru = "HTTP/1.1 200 OK\r\n" 6019Sigor@sysoev.ru "Server: nginext/0.1\r\n" 6020Sigor@sysoev.ru "Content-Type: text/html; charset=UTF-8\r\n" 6030Sigor@sysoev.ru "Connection: close\r\n" 6040Sigor@sysoev.ru "\r\n"; 6050Sigor@sysoev.ru 6060Sigor@sysoev.ru static const u_char default_headers[] 6079Sigor@sysoev.ru = "Server: nginext/0.1\r\n" 6080Sigor@sysoev.ru "Connection: close\r\n"; 6090Sigor@sysoev.ru 61086Smax.romanov@nginx.com static const u_char http_11[] = "HTTP/1.1 "; 61186Smax.romanov@nginx.com static const u_char cr_lf[] = "\r\n"; 61286Smax.romanov@nginx.com static const u_char _200_ok[] = "200 OK"; 61386Smax.romanov@nginx.com 61486Smax.romanov@nginx.com ctx = SG(server_context); 6150Sigor@sysoev.ru 616114Smax.romanov@nginx.com #define RC(S) \ 617114Smax.romanov@nginx.com do { \ 618114Smax.romanov@nginx.com rc = (S); \ 619114Smax.romanov@nginx.com if (nxt_slow_path(rc != NXT_OK)) { \ 620114Smax.romanov@nginx.com goto fail; \ 621114Smax.romanov@nginx.com } \ 622114Smax.romanov@nginx.com } while(0) 623114Smax.romanov@nginx.com 6240Sigor@sysoev.ru if (SG(request_info).no_headers == 1) { 625114Smax.romanov@nginx.com RC(nxt_php_write(ctx, default_repsonse, sizeof(default_repsonse) - 1, 626114Smax.romanov@nginx.com 1, 0)); 6270Sigor@sysoev.ru return SAPI_HEADER_SENT_SUCCESSFULLY; 6280Sigor@sysoev.ru } 6290Sigor@sysoev.ru 6300Sigor@sysoev.ru if (SG(sapi_headers).http_status_line) { 631114Smax.romanov@nginx.com status = (u_char *) SG(sapi_headers).http_status_line; 6320Sigor@sysoev.ru len = nxt_strlen(status); 6330Sigor@sysoev.ru 634114Smax.romanov@nginx.com RC(nxt_php_write(ctx, status, len, 0, 0)); 6350Sigor@sysoev.ru 6360Sigor@sysoev.ru } else if (SG(sapi_headers).http_response_code) { 63786Smax.romanov@nginx.com status = nxt_sprintf(buf, buf + sizeof(buf), "%03d", 6380Sigor@sysoev.ru SG(sapi_headers).http_response_code); 63986Smax.romanov@nginx.com len = status - buf; 64086Smax.romanov@nginx.com 641114Smax.romanov@nginx.com RC(nxt_php_write(ctx, http_11, sizeof(http_11) - 1, 0, 0)); 642114Smax.romanov@nginx.com RC(nxt_php_write(ctx, buf, len, 0, 0)); 6430Sigor@sysoev.ru 6440Sigor@sysoev.ru } else { 645114Smax.romanov@nginx.com RC(nxt_php_write(ctx, http_11, sizeof(http_11) - 1, 0, 0)); 646114Smax.romanov@nginx.com RC(nxt_php_write(ctx, _200_ok, sizeof(_200_ok) - 1, 0, 0)); 6470Sigor@sysoev.ru } 6480Sigor@sysoev.ru 649114Smax.romanov@nginx.com RC(nxt_php_write(ctx, cr_lf, sizeof(cr_lf) - 1, 0, 0)); 650114Smax.romanov@nginx.com RC(nxt_php_write(ctx, default_headers, sizeof(default_headers) - 1, 0, 0)); 6510Sigor@sysoev.ru 6520Sigor@sysoev.ru h = zend_llist_get_first_ex(&sapi_headers->headers, &zpos); 6530Sigor@sysoev.ru 6540Sigor@sysoev.ru while (h) { 655114Smax.romanov@nginx.com RC(nxt_php_write(ctx, (u_char *) h->header, h->header_len, 0, 0)); 656114Smax.romanov@nginx.com RC(nxt_php_write(ctx, cr_lf, sizeof(cr_lf) - 1, 0, 0)); 6570Sigor@sysoev.ru 6580Sigor@sysoev.ru h = zend_llist_get_next_ex(&sapi_headers->headers, &zpos); 6590Sigor@sysoev.ru } 6600Sigor@sysoev.ru 661114Smax.romanov@nginx.com RC(nxt_php_write(ctx, cr_lf, sizeof(cr_lf) - 1, 1, 0)); 662114Smax.romanov@nginx.com 663114Smax.romanov@nginx.com #undef RC 6640Sigor@sysoev.ru 6650Sigor@sysoev.ru return SAPI_HEADER_SENT_SUCCESSFULLY; 666114Smax.romanov@nginx.com 667114Smax.romanov@nginx.com fail: 668114Smax.romanov@nginx.com 669114Smax.romanov@nginx.com // TODO handle NXT_AGAIN 670114Smax.romanov@nginx.com return SAPI_HEADER_SEND_FAILED; 6710Sigor@sysoev.ru } 6720Sigor@sysoev.ru 6730Sigor@sysoev.ru 6740Sigor@sysoev.ru #ifdef NXT_PHP7 6750Sigor@sysoev.ru static size_t 6760Sigor@sysoev.ru nxt_php_read_post(char *buffer, size_t count_bytes TSRMLS_DC) 6770Sigor@sysoev.ru #else 6780Sigor@sysoev.ru static int 6790Sigor@sysoev.ru nxt_php_read_post(char *buffer, uint count_bytes TSRMLS_DC) 6800Sigor@sysoev.ru #endif 6810Sigor@sysoev.ru { 682*206Smax.romanov@nginx.com size_t size, rest; 68386Smax.romanov@nginx.com nxt_php_run_ctx_t *ctx; 68486Smax.romanov@nginx.com nxt_app_request_header_t *h; 6850Sigor@sysoev.ru 68686Smax.romanov@nginx.com ctx = SG(server_context); 68786Smax.romanov@nginx.com h = &ctx->r.header; 6880Sigor@sysoev.ru 689*206Smax.romanov@nginx.com rest = (size_t) h->parsed_content_length - SG(read_post_bytes); 69086Smax.romanov@nginx.com 69186Smax.romanov@nginx.com nxt_debug(ctx->task, "nxt_php_read_post %O", rest); 6920Sigor@sysoev.ru 6930Sigor@sysoev.ru if (rest == 0) { 6940Sigor@sysoev.ru return 0; 6950Sigor@sysoev.ru } 6960Sigor@sysoev.ru 697*206Smax.romanov@nginx.com rest = nxt_min(ctx->body_preread_size, (size_t) count_bytes); 698*206Smax.romanov@nginx.com size = nxt_app_msg_read_raw(ctx->task, ctx->rmsg, buffer, rest); 6990Sigor@sysoev.ru 700*206Smax.romanov@nginx.com ctx->body_preread_size -= size; 7010Sigor@sysoev.ru 70286Smax.romanov@nginx.com return size; 7030Sigor@sysoev.ru } 7040Sigor@sysoev.ru 7050Sigor@sysoev.ru 7060Sigor@sysoev.ru static char * 7070Sigor@sysoev.ru nxt_php_read_cookies(TSRMLS_D) 7080Sigor@sysoev.ru { 70986Smax.romanov@nginx.com nxt_php_run_ctx_t *ctx; 7100Sigor@sysoev.ru 71186Smax.romanov@nginx.com ctx = SG(server_context); 7120Sigor@sysoev.ru 71394Smax.romanov@nginx.com nxt_debug(ctx->task, "nxt_php_read_cookies"); 71494Smax.romanov@nginx.com 71586Smax.romanov@nginx.com return (char *) ctx->r.header.cookie.start; 7160Sigor@sysoev.ru } 7170Sigor@sysoev.ru 7180Sigor@sysoev.ru 7190Sigor@sysoev.ru static void 7200Sigor@sysoev.ru nxt_php_register_variables(zval *track_vars_array TSRMLS_DC) 7210Sigor@sysoev.ru { 722114Smax.romanov@nginx.com u_char *colon; 72386Smax.romanov@nginx.com nxt_str_t n, v; 72486Smax.romanov@nginx.com nxt_int_t rc; 725114Smax.romanov@nginx.com nxt_str_t host, server_name, server_port; 72686Smax.romanov@nginx.com nxt_task_t *task; 72786Smax.romanov@nginx.com nxt_php_run_ctx_t *ctx; 72886Smax.romanov@nginx.com nxt_app_request_header_t *h; 7290Sigor@sysoev.ru 730114Smax.romanov@nginx.com static nxt_str_t def_host = nxt_string("localhost"); 731114Smax.romanov@nginx.com static nxt_str_t def_port = nxt_string("80"); 732114Smax.romanov@nginx.com 73386Smax.romanov@nginx.com ctx = SG(server_context); 7340Sigor@sysoev.ru 73586Smax.romanov@nginx.com h = &ctx->r.header; 73686Smax.romanov@nginx.com task = ctx->task; 7370Sigor@sysoev.ru 73886Smax.romanov@nginx.com nxt_debug(task, "php register variables"); 7390Sigor@sysoev.ru 740114Smax.romanov@nginx.com #define NXT_PHP_SET(n, v) \ 741142Smax.romanov@nginx.com nxt_debug(task, "php: register %s='%V'", n, &v); \ 742114Smax.romanov@nginx.com php_register_variable_safe((char *) (n), (char *) (v).start, \ 743114Smax.romanov@nginx.com (v).length, track_vars_array TSRMLS_CC) \ 744114Smax.romanov@nginx.com 745114Smax.romanov@nginx.com NXT_PHP_SET("SERVER_PROTOCOL", h->version); 74686Smax.romanov@nginx.com 74786Smax.romanov@nginx.com /* 74886Smax.romanov@nginx.com * 'SCRIPT_NAME' 74986Smax.romanov@nginx.com * Contains the current script's path. This is useful for pages which need to 75086Smax.romanov@nginx.com * point to themselves. The __FILE__ constant contains the full path and 75186Smax.romanov@nginx.com * filename of the current (i.e. included) file. 75286Smax.romanov@nginx.com */ 75386Smax.romanov@nginx.com 75486Smax.romanov@nginx.com /* 75586Smax.romanov@nginx.com * 'SCRIPT_FILENAME' 75686Smax.romanov@nginx.com * The absolute pathname of the currently executing script. 75786Smax.romanov@nginx.com */ 75886Smax.romanov@nginx.com 75986Smax.romanov@nginx.com /* 76086Smax.romanov@nginx.com * 'DOCUMENT_ROOT' 76186Smax.romanov@nginx.com * The document root directory under which the current script is executing, 76286Smax.romanov@nginx.com * as defined in the server's configuration file. 76386Smax.romanov@nginx.com */ 7640Sigor@sysoev.ru 76586Smax.romanov@nginx.com if (nxt_php_script.start != NULL) { 76686Smax.romanov@nginx.com // ABS_MODE 76786Smax.romanov@nginx.com /* 76886Smax.romanov@nginx.com * 'PHP_SELF' 76986Smax.romanov@nginx.com * The filename of the currently executing script, relative to the document 77086Smax.romanov@nginx.com * root. For instance, $_SERVER['PHP_SELF'] in a script at the address 77186Smax.romanov@nginx.com * http://example.com/foo/bar.php would be /foo/bar.php. The __FILE__ constant 77286Smax.romanov@nginx.com * contains the full path and filename of the current (i.e. included) file. 77386Smax.romanov@nginx.com * If PHP is running as a command-line processor this variable contains the 77486Smax.romanov@nginx.com * script name since PHP 4.3.0. Previously it was not available. 77586Smax.romanov@nginx.com */ 776114Smax.romanov@nginx.com NXT_PHP_SET("PHP_SELF", nxt_php_script); 777114Smax.romanov@nginx.com NXT_PHP_SET("SCRIPT_NAME", nxt_php_script); 77886Smax.romanov@nginx.com } else { 779114Smax.romanov@nginx.com NXT_PHP_SET("PHP_SELF", h->path); 780114Smax.romanov@nginx.com NXT_PHP_SET("SCRIPT_NAME", h->path); 78186Smax.romanov@nginx.com } 7820Sigor@sysoev.ru 783114Smax.romanov@nginx.com NXT_PHP_SET("SCRIPT_FILENAME", ctx->script); 784114Smax.romanov@nginx.com NXT_PHP_SET("DOCUMENT_ROOT", nxt_php_root); 7850Sigor@sysoev.ru 786114Smax.romanov@nginx.com NXT_PHP_SET("REQUEST_METHOD", h->method); 787114Smax.romanov@nginx.com NXT_PHP_SET("REQUEST_URI", h->target); 7880Sigor@sysoev.ru 78986Smax.romanov@nginx.com if (h->query.start != NULL) { 790114Smax.romanov@nginx.com NXT_PHP_SET("QUERY_STRING", h->query); 7910Sigor@sysoev.ru } 7920Sigor@sysoev.ru 79386Smax.romanov@nginx.com if (h->content_type.start != NULL) { 794114Smax.romanov@nginx.com NXT_PHP_SET("CONTENT_TYPE", h->content_type); 7950Sigor@sysoev.ru } 7960Sigor@sysoev.ru 79786Smax.romanov@nginx.com if (h->content_length.start != NULL) { 798114Smax.romanov@nginx.com NXT_PHP_SET("CONTENT_LENGTH", h->content_length); 799114Smax.romanov@nginx.com } 800114Smax.romanov@nginx.com 801114Smax.romanov@nginx.com host = h->host; 802114Smax.romanov@nginx.com if (host.length == 0) { 803114Smax.romanov@nginx.com host = def_host; 80486Smax.romanov@nginx.com } 8050Sigor@sysoev.ru 806114Smax.romanov@nginx.com server_name = host; 807114Smax.romanov@nginx.com colon = nxt_memchr(host.start, ':', host.length); 808114Smax.romanov@nginx.com 809114Smax.romanov@nginx.com if (colon != NULL) { 810114Smax.romanov@nginx.com server_name.length = colon - host.start; 811114Smax.romanov@nginx.com 812114Smax.romanov@nginx.com server_port.start = colon + 1; 813114Smax.romanov@nginx.com server_port.length = host.length - server_name.length - 1; 814114Smax.romanov@nginx.com } else { 815114Smax.romanov@nginx.com server_port = def_port; 816114Smax.romanov@nginx.com } 817114Smax.romanov@nginx.com 818114Smax.romanov@nginx.com NXT_PHP_SET("SERVER_NAME", server_name); 819114Smax.romanov@nginx.com NXT_PHP_SET("SERVER_PORT", server_port); 820114Smax.romanov@nginx.com 821114Smax.romanov@nginx.com NXT_PHP_SET("REMOTE_ADDR", ctx->r.remote); 822114Smax.romanov@nginx.com 82394Smax.romanov@nginx.com while (nxt_app_msg_read_str(task, ctx->rmsg, &n) == NXT_OK) { 82486Smax.romanov@nginx.com if (nxt_slow_path(n.length == 0)) { 82586Smax.romanov@nginx.com break; 8260Sigor@sysoev.ru } 8270Sigor@sysoev.ru 82894Smax.romanov@nginx.com rc = nxt_app_msg_read_str(task, ctx->rmsg, &v); 82994Smax.romanov@nginx.com if (nxt_slow_path(rc != NXT_OK)) { 83094Smax.romanov@nginx.com break; 83194Smax.romanov@nginx.com } 83294Smax.romanov@nginx.com 833114Smax.romanov@nginx.com NXT_PHP_SET(n.start, v); 8340Sigor@sysoev.ru } 835114Smax.romanov@nginx.com 836*206Smax.romanov@nginx.com nxt_app_msg_read_size(task, ctx->rmsg, &ctx->body_preread_size); 837*206Smax.romanov@nginx.com 838114Smax.romanov@nginx.com #undef NXT_PHP_SET 8390Sigor@sysoev.ru } 8400Sigor@sysoev.ru 8410Sigor@sysoev.ru 8420Sigor@sysoev.ru static void 84386Smax.romanov@nginx.com nxt_php_log_message(char *message 84486Smax.romanov@nginx.com #ifdef NXT_HAVE_PHP_LOG_MESSAGE_WITH_SYSLOG_TYPE 84586Smax.romanov@nginx.com , int syslog_type_int 84686Smax.romanov@nginx.com #endif 84786Smax.romanov@nginx.com ) 8480Sigor@sysoev.ru { 8490Sigor@sysoev.ru return; 8500Sigor@sysoev.ru } 851