39 static char *ngx_http_perl_init_interpreter(
ngx_conf_t *cf,
41 static PerlInterpreter *ngx_http_perl_create_interpreter(
ngx_conf_t *cf,
47 static void ngx_http_perl_eval_anon_sub(pTHX_
ngx_str_t *handler, SV **sv);
50 static void *ngx_http_perl_create_main_conf(
ngx_conf_t *cf);
51 static char *ngx_http_perl_init_main_conf(
ngx_conf_t *cf,
void *conf);
52 static void *ngx_http_perl_create_loc_conf(
ngx_conf_t *cf);
53 static char *ngx_http_perl_merge_loc_conf(
ngx_conf_t *cf,
void *parent,
58 #if (NGX_HAVE_PERL_MULTIPLICITY)
59 static void ngx_http_perl_cleanup_perl(
void *data);
101 ngx_http_perl_preconfiguration,
104 ngx_http_perl_create_main_conf,
105 ngx_http_perl_init_main_conf,
110 ngx_http_perl_create_loc_conf,
111 ngx_http_perl_merge_loc_conf
117 &ngx_http_perl_module_ctx,
118 ngx_http_perl_commands,
122 ngx_http_perl_init_worker,
133 #define NGX_HTTP_PERL_SSI_SUB 0
134 #define NGX_HTTP_PERL_SSI_ARG 1
138 {
ngx_string(
"sub"), NGX_HTTP_PERL_SSI_SUB, 1, 0 },
139 {
ngx_string(
"arg"), NGX_HTTP_PERL_SSI_ARG, 0, 1 },
144 ngx_string(
"perl"), ngx_http_perl_ssi, ngx_http_perl_ssi_params, 0, 0, 1
151 static HV *nginx_stash;
153 #if (NGX_HAVE_PERL_MULTIPLICITY)
156 static PerlInterpreter *perl;
161 ngx_http_perl_xs_init(pTHX)
165 nginx_stash = gv_stashpv(
"nginx",
TRUE);
209 PERL_SET_CONTEXT(pmcf->
perl);
211 if (ctx->
next == NULL) {
218 handler = &ngx_null_name;
222 rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->
nginx, sub, NULL, handler,
228 "perl handler done: %i", rc);
276 "perl sleep handler");
304 "perl variable handler");
324 PERL_SET_CONTEXT(pmcf->
perl);
326 rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->
nginx, pv->
sub, NULL,
346 "perl variable done");
383 handler = params[NGX_HTTP_PERL_SSI_SUB];
384 handler->
data[handler->
len] =
'\0';
389 PERL_SET_CONTEXT(pmcf->
perl);
395 ngx_http_perl_eval_anon_sub(aTHX_ handler, &sv);
397 if (sv == &PL_sv_undef) {
399 "eval_pv(\"%V\") failed", handler);
404 sv = newSVpvn((
char *) handler->
data, handler->
len);
409 sv = newSVpvn((
char *) handler->
data, handler->
len);
411 args = ¶ms[NGX_HTTP_PERL_SSI_ARG];
415 for (i = 0; args[
i]; i++) { }
426 for (i = 0; args[
i]; i++) {
427 asv[i + 1] = newSVpvn((
char *) args[i]->data, args[i]->len);
434 rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->
nginx, sv, asv, handler,
458 #if (NGX_HAVE_PERL_MULTIPLICITY)
468 #ifdef NGX_PERL_MODULES
494 #if !(NGX_HAVE_PERL_MULTIPLICITY)
502 if (ngx_http_perl_run_requires(aTHX_ pmcf->
requires, cf->
log)
509 pmcf->
nginx = nginx_stash;
516 if (nginx_stash == NULL) {
520 pmcf->
perl = ngx_http_perl_create_interpreter(cf, pmcf);
522 if (pmcf->
perl == NULL) {
526 pmcf->
nginx = nginx_stash;
528 #if (NGX_HAVE_PERL_MULTIPLICITY)
530 cln->
handler = ngx_http_perl_cleanup_perl;
543 static PerlInterpreter *
544 ngx_http_perl_create_interpreter(
ngx_conf_t *cf,
550 char *ver, **embedding;
553 PerlInterpreter *perl;
570 PERL_SET_CONTEXT(perl);
572 perl_construct(perl);
574 #ifdef PERL_EXIT_DESTRUCT_END
575 PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
581 if (embedding == NULL) {
590 embedding[2 * i + 1] =
"-I";
591 embedding[2 * i + 2] = (
char *) m[i].data;
595 embedding[n++] =
"-Mnginx";
596 embedding[n++] =
"-e";
597 embedding[n++] =
"0";
599 n = perl_parse(perl, ngx_http_perl_xs_init, n, embedding, NULL);
606 sv = get_sv(
"nginx::VERSION",
FALSE);
612 "but %s was found", ver);
626 (void) perl_destruct(perl);
646 script = requires->elts;
647 for (i = 0; i < requires->nelts; i++) {
649 require_pv((
char *) script[i].data);
653 err = (u_char *) SvPV(ERRSV, len);
654 while (--len && (err[len] ==
CR || err[len] ==
LF)) { }
657 "require_pv(\"%s\") failed: \"%*s\"",
658 script[i].data, len + 1, err);
689 sv = sv_2mortal(sv_bless(newRV_noinc(newSViv(PTR2IV(r))), nginx));
693 EXTEND(sp, (intptr_t) args[0]);
696 PUSHs(sv_2mortal(args[i]));
704 n = call_sv(sub, G_EVAL);
713 "call_sv: %d", status);
716 line = SvPVx(POPs, n_a);
720 if (rv->
data == NULL) {
737 err = (u_char *) SvPV(ERRSV, len);
738 while (--len && (err[len] ==
CR || err[len] ==
LF)) { }
741 "call_sv(\"%V\") failed: \"%*s\"", handler, len + 1, err);
752 "call_sv(\"%V\") returned %d results", handler, n);
765 ngx_http_perl_eval_anon_sub(pTHX_
ngx_str_t *handler, SV **sv)
769 for (p = handler->data; *p; p++) {
770 if (*p !=
' ' && *p !=
'\t' && *p !=
CR && *p !=
LF) {
779 *sv = eval_pv((
char *) p,
FALSE);
791 ngx_http_perl_create_main_conf(
ngx_conf_t *cf)
808 ngx_http_perl_init_main_conf(
ngx_conf_t *cf,
void *conf)
812 if (pmcf->
perl == NULL) {
813 if (ngx_http_perl_init_interpreter(cf, pmcf) !=
NGX_CONF_OK) {
822 #if (NGX_HAVE_PERL_MULTIPLICITY)
825 ngx_http_perl_cleanup_perl(
void *data)
827 PerlInterpreter *perl = data;
829 PERL_SET_CONTEXT(perl);
831 (void) perl_destruct(perl);
846 ngx_http_perl_preconfiguration(
ngx_conf_t *cf)
860 "conflicting SSI command \"%V\"",
861 &ngx_http_perl_ssi_command.
name);
893 ngx_http_perl_merge_loc_conf(
ngx_conf_t *cf,
void *parent,
void *child)
898 if (conf->
sub == NULL) {
920 "duplicate perl handler \"%V\"", &value[1]);
926 if (pmcf->
perl == NULL) {
927 if (ngx_http_perl_init_interpreter(cf, pmcf) !=
NGX_CONF_OK) {
937 PERL_SET_CONTEXT(pmcf->
perl);
939 ngx_http_perl_eval_anon_sub(aTHX_ &value[1], &plcf->
sub);
941 if (plcf->
sub == &PL_sv_undef) {
943 "eval_pv(\"%V\") failed", &value[1]);
947 if (plcf->
sub == NULL) {
948 plcf->
sub = newSVpvn((
char *) value[1].data, value[1].len);
954 clcf->
handler = ngx_http_perl_handler;
971 if (value[1].data[0] !=
'$') {
973 "invalid variable name \"%V\"", &value[1]);
997 if (pmcf->
perl == NULL) {
998 if (ngx_http_perl_init_interpreter(cf, pmcf) !=
NGX_CONF_OK) {
1008 PERL_SET_CONTEXT(pmcf->
perl);
1010 ngx_http_perl_eval_anon_sub(aTHX_ &value[2], &pv->
sub);
1012 if (pv->
sub == &PL_sv_undef) {
1014 "eval_pv(\"%V\") failed", &value[2]);
1018 if (pv->
sub == NULL) {
1019 pv->
sub = newSVpvn((
char *) value[2].data, value[2].len);
1025 v->
data = (uintptr_t) pv;
1040 PERL_SET_CONTEXT(pmcf->
perl);
1044 sv_setiv(GvSV(gv_fetchpv(
"$",
TRUE, SVt_PV)), (I32)
ngx_pid);
1054 #if (NGX_HAVE_PERL_MULTIPLICITY)
1068 (void) perl_destruct(perl);