1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#include <ngx_config.h>
9e18a033bSKonstantin Ananyev#include <ngx_core.h>
10e18a033bSKonstantin Ananyev#include <ngx_http.h>
11e18a033bSKonstantin Ananyev#include <ngx_http_perl_module.h>
12e18a033bSKonstantin Ananyev
13e18a033bSKonstantin Ananyev
14e18a033bSKonstantin Ananyevtypedef struct {
15e18a033bSKonstantin Ananyev    PerlInterpreter   *perl;
16e18a033bSKonstantin Ananyev    HV                *nginx;
17e18a033bSKonstantin Ananyev    ngx_array_t       *modules;
18e18a033bSKonstantin Ananyev    ngx_array_t       *requires;
19e18a033bSKonstantin Ananyev} ngx_http_perl_main_conf_t;
20e18a033bSKonstantin Ananyev
21e18a033bSKonstantin Ananyev
22e18a033bSKonstantin Ananyevtypedef struct {
23e18a033bSKonstantin Ananyev    SV                *sub;
24e18a033bSKonstantin Ananyev    ngx_str_t          handler;
25e18a033bSKonstantin Ananyev} ngx_http_perl_loc_conf_t;
26e18a033bSKonstantin Ananyev
27e18a033bSKonstantin Ananyev
28e18a033bSKonstantin Ananyevtypedef struct {
29e18a033bSKonstantin Ananyev    SV                *sub;
30e18a033bSKonstantin Ananyev    ngx_str_t          handler;
31e18a033bSKonstantin Ananyev} ngx_http_perl_variable_t;
32e18a033bSKonstantin Ananyev
33e18a033bSKonstantin Ananyev
34e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSI)
35e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_perl_ssi(ngx_http_request_t *r,
36e18a033bSKonstantin Ananyev    ngx_http_ssi_ctx_t *ssi_ctx, ngx_str_t **params);
37e18a033bSKonstantin Ananyev#endif
38e18a033bSKonstantin Ananyev
39e18a033bSKonstantin Ananyevstatic char *ngx_http_perl_init_interpreter(ngx_conf_t *cf,
40e18a033bSKonstantin Ananyev    ngx_http_perl_main_conf_t *pmcf);
41e18a033bSKonstantin Ananyevstatic PerlInterpreter *ngx_http_perl_create_interpreter(ngx_conf_t *cf,
42e18a033bSKonstantin Ananyev    ngx_http_perl_main_conf_t *pmcf);
43e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_perl_run_requires(pTHX_ ngx_array_t *requires,
44e18a033bSKonstantin Ananyev    ngx_log_t *log);
45e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r,
46e18a033bSKonstantin Ananyev    HV *nginx, SV *sub, SV **args, ngx_str_t *handler, ngx_str_t *rv);
47e18a033bSKonstantin Ananyevstatic void ngx_http_perl_eval_anon_sub(pTHX_ ngx_str_t *handler, SV **sv);
48e18a033bSKonstantin Ananyev
49e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_perl_preconfiguration(ngx_conf_t *cf);
50e18a033bSKonstantin Ananyevstatic void *ngx_http_perl_create_main_conf(ngx_conf_t *cf);
51e18a033bSKonstantin Ananyevstatic char *ngx_http_perl_init_main_conf(ngx_conf_t *cf, void *conf);
52e18a033bSKonstantin Ananyevstatic void *ngx_http_perl_create_loc_conf(ngx_conf_t *cf);
53e18a033bSKonstantin Ananyevstatic char *ngx_http_perl_merge_loc_conf(ngx_conf_t *cf, void *parent,
54e18a033bSKonstantin Ananyev    void *child);
55e18a033bSKonstantin Ananyevstatic char *ngx_http_perl(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
56e18a033bSKonstantin Ananyevstatic char *ngx_http_perl_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
57e18a033bSKonstantin Ananyev
58e18a033bSKonstantin Ananyev#if (NGX_HAVE_PERL_MULTIPLICITY)
59e18a033bSKonstantin Ananyevstatic void ngx_http_perl_cleanup_perl(void *data);
60e18a033bSKonstantin Ananyev#endif
61e18a033bSKonstantin Ananyev
62e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_perl_init_worker(ngx_cycle_t *cycle);
63e18a033bSKonstantin Ananyevstatic void ngx_http_perl_exit(ngx_cycle_t *cycle);
64e18a033bSKonstantin Ananyev
65e18a033bSKonstantin Ananyev
66e18a033bSKonstantin Ananyevstatic ngx_command_t  ngx_http_perl_commands[] = {
67e18a033bSKonstantin Ananyev
68e18a033bSKonstantin Ananyev    { ngx_string("perl_modules"),
69e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
70e18a033bSKonstantin Ananyev      ngx_conf_set_str_array_slot,
71e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF_OFFSET,
72e18a033bSKonstantin Ananyev      offsetof(ngx_http_perl_main_conf_t, modules),
73e18a033bSKonstantin Ananyev      NULL },
74e18a033bSKonstantin Ananyev
75e18a033bSKonstantin Ananyev    { ngx_string("perl_require"),
76e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
77e18a033bSKonstantin Ananyev      ngx_conf_set_str_array_slot,
78e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF_OFFSET,
79e18a033bSKonstantin Ananyev      offsetof(ngx_http_perl_main_conf_t, requires),
80e18a033bSKonstantin Ananyev      NULL },
81e18a033bSKonstantin Ananyev
82e18a033bSKonstantin Ananyev    { ngx_string("perl"),
83e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,
84e18a033bSKonstantin Ananyev      ngx_http_perl,
85e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
86e18a033bSKonstantin Ananyev      0,
87e18a033bSKonstantin Ananyev      NULL },
88e18a033bSKonstantin Ananyev
89e18a033bSKonstantin Ananyev    { ngx_string("perl_set"),
90e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2,
91e18a033bSKonstantin Ananyev      ngx_http_perl_set,
92e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
93e18a033bSKonstantin Ananyev      0,
94e18a033bSKonstantin Ananyev      NULL },
95e18a033bSKonstantin Ananyev
96e18a033bSKonstantin Ananyev      ngx_null_command
97e18a033bSKonstantin Ananyev};
98e18a033bSKonstantin Ananyev
99e18a033bSKonstantin Ananyev
100e18a033bSKonstantin Ananyevstatic ngx_http_module_t  ngx_http_perl_module_ctx = {
101e18a033bSKonstantin Ananyev    ngx_http_perl_preconfiguration,        /* preconfiguration */
102e18a033bSKonstantin Ananyev    NULL,                                  /* postconfiguration */
103e18a033bSKonstantin Ananyev
104e18a033bSKonstantin Ananyev    ngx_http_perl_create_main_conf,        /* create main configuration */
105e18a033bSKonstantin Ananyev    ngx_http_perl_init_main_conf,          /* init main configuration */
106e18a033bSKonstantin Ananyev
107e18a033bSKonstantin Ananyev    NULL,                                  /* create server configuration */
108e18a033bSKonstantin Ananyev    NULL,                                  /* merge server configuration */
109e18a033bSKonstantin Ananyev
110e18a033bSKonstantin Ananyev    ngx_http_perl_create_loc_conf,         /* create location configuration */
111e18a033bSKonstantin Ananyev    ngx_http_perl_merge_loc_conf           /* merge location configuration */
112e18a033bSKonstantin Ananyev};
113e18a033bSKonstantin Ananyev
114e18a033bSKonstantin Ananyev
115e18a033bSKonstantin Ananyevngx_module_t  ngx_http_perl_module = {
116e18a033bSKonstantin Ananyev    NGX_MODULE_V1,
117e18a033bSKonstantin Ananyev    &ngx_http_perl_module_ctx,             /* module context */
118e18a033bSKonstantin Ananyev    ngx_http_perl_commands,                /* module directives */
119e18a033bSKonstantin Ananyev    NGX_HTTP_MODULE,                       /* module type */
120e18a033bSKonstantin Ananyev    NULL,                                  /* init master */
121e18a033bSKonstantin Ananyev    NULL,                                  /* init module */
122e18a033bSKonstantin Ananyev    ngx_http_perl_init_worker,             /* init process */
123e18a033bSKonstantin Ananyev    NULL,                                  /* init thread */
124e18a033bSKonstantin Ananyev    NULL,                                  /* exit thread */
125e18a033bSKonstantin Ananyev    NULL,                                  /* exit process */
126e18a033bSKonstantin Ananyev    ngx_http_perl_exit,                    /* exit master */
127e18a033bSKonstantin Ananyev    NGX_MODULE_V1_PADDING
128e18a033bSKonstantin Ananyev};
129e18a033bSKonstantin Ananyev
130e18a033bSKonstantin Ananyev
131e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSI)
132e18a033bSKonstantin Ananyev
133e18a033bSKonstantin Ananyev#define NGX_HTTP_PERL_SSI_SUB  0
134e18a033bSKonstantin Ananyev#define NGX_HTTP_PERL_SSI_ARG  1
135e18a033bSKonstantin Ananyev
136e18a033bSKonstantin Ananyev
137e18a033bSKonstantin Ananyevstatic ngx_http_ssi_param_t  ngx_http_perl_ssi_params[] = {
138e18a033bSKonstantin Ananyev    { ngx_string("sub"), NGX_HTTP_PERL_SSI_SUB, 1, 0 },
139e18a033bSKonstantin Ananyev    { ngx_string("arg"), NGX_HTTP_PERL_SSI_ARG, 0, 1 },
140e18a033bSKonstantin Ananyev    { ngx_null_string, 0, 0, 0 }
141e18a033bSKonstantin Ananyev};
142e18a033bSKonstantin Ananyev
143e18a033bSKonstantin Ananyevstatic ngx_http_ssi_command_t  ngx_http_perl_ssi_command = {
144e18a033bSKonstantin Ananyev    ngx_string("perl"), ngx_http_perl_ssi, ngx_http_perl_ssi_params, 0, 0, 1
145e18a033bSKonstantin Ananyev};
146e18a033bSKonstantin Ananyev
147e18a033bSKonstantin Ananyev#endif
148e18a033bSKonstantin Ananyev
149e18a033bSKonstantin Ananyev
150e18a033bSKonstantin Ananyevstatic ngx_str_t         ngx_null_name = ngx_null_string;
151e18a033bSKonstantin Ananyevstatic HV               *nginx_stash;
152e18a033bSKonstantin Ananyev
153e18a033bSKonstantin Ananyev#if (NGX_HAVE_PERL_MULTIPLICITY)
154e18a033bSKonstantin Ananyevstatic ngx_uint_t        ngx_perl_term;
155e18a033bSKonstantin Ananyev#else
156e18a033bSKonstantin Ananyevstatic PerlInterpreter  *perl;
157e18a033bSKonstantin Ananyev#endif
158e18a033bSKonstantin Ananyev
159e18a033bSKonstantin Ananyev
160e18a033bSKonstantin Ananyevstatic void
161e18a033bSKonstantin Ananyevngx_http_perl_xs_init(pTHX)
162e18a033bSKonstantin Ananyev{
163e18a033bSKonstantin Ananyev    newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, __FILE__);
164e18a033bSKonstantin Ananyev
165e18a033bSKonstantin Ananyev    nginx_stash = gv_stashpv("nginx", TRUE);
166e18a033bSKonstantin Ananyev}
167e18a033bSKonstantin Ananyev
168e18a033bSKonstantin Ananyev
169e18a033bSKonstantin Ananyevstatic ngx_int_t
170e18a033bSKonstantin Ananyevngx_http_perl_handler(ngx_http_request_t *r)
171e18a033bSKonstantin Ananyev{
172e18a033bSKonstantin Ananyev    r->main->count++;
173e18a033bSKonstantin Ananyev
174e18a033bSKonstantin Ananyev    ngx_http_perl_handle_request(r);
175e18a033bSKonstantin Ananyev
176e18a033bSKonstantin Ananyev    return NGX_DONE;
177e18a033bSKonstantin Ananyev}
178e18a033bSKonstantin Ananyev
179e18a033bSKonstantin Ananyev
180e18a033bSKonstantin Ananyevvoid
181e18a033bSKonstantin Ananyevngx_http_perl_handle_request(ngx_http_request_t *r)
182e18a033bSKonstantin Ananyev{
183e18a033bSKonstantin Ananyev    SV                         *sub;
184e18a033bSKonstantin Ananyev    ngx_int_t                   rc;
185e18a033bSKonstantin Ananyev    ngx_str_t                   uri, args, *handler;
186e18a033bSKonstantin Ananyev    ngx_http_perl_ctx_t        *ctx;
187e18a033bSKonstantin Ananyev    ngx_http_perl_loc_conf_t   *plcf;
188e18a033bSKonstantin Ananyev    ngx_http_perl_main_conf_t  *pmcf;
189e18a033bSKonstantin Ananyev
190e18a033bSKonstantin Ananyev    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "perl handler");
191e18a033bSKonstantin Ananyev
192e18a033bSKonstantin Ananyev    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);
193e18a033bSKonstantin Ananyev
194e18a033bSKonstantin Ananyev    if (ctx == NULL) {
195e18a033bSKonstantin Ananyev        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_perl_ctx_t));
196e18a033bSKonstantin Ananyev        if (ctx == NULL) {
197e18a033bSKonstantin Ananyev            ngx_http_finalize_request(r, NGX_ERROR);
198e18a033bSKonstantin Ananyev            return;
199e18a033bSKonstantin Ananyev        }
200e18a033bSKonstantin Ananyev
201e18a033bSKonstantin Ananyev        ngx_http_set_ctx(r, ctx, ngx_http_perl_module);
202e18a033bSKonstantin Ananyev    }
203e18a033bSKonstantin Ananyev
204e18a033bSKonstantin Ananyev    pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);
205e18a033bSKonstantin Ananyev
206e18a033bSKonstantin Ananyev    {
207e18a033bSKonstantin Ananyev
208e18a033bSKonstantin Ananyev    dTHXa(pmcf->perl);
209e18a033bSKonstantin Ananyev    PERL_SET_CONTEXT(pmcf->perl);
210e18a033bSKonstantin Ananyev    PERL_SET_INTERP(pmcf->perl);
211e18a033bSKonstantin Ananyev
212e18a033bSKonstantin Ananyev    if (ctx->next == NULL) {
213e18a033bSKonstantin Ananyev        plcf = ngx_http_get_module_loc_conf(r, ngx_http_perl_module);
214e18a033bSKonstantin Ananyev        sub = plcf->sub;
215e18a033bSKonstantin Ananyev        handler = &plcf->handler;
216e18a033bSKonstantin Ananyev
217e18a033bSKonstantin Ananyev    } else {
218e18a033bSKonstantin Ananyev        sub = ctx->next;
219e18a033bSKonstantin Ananyev        handler = &ngx_null_name;
220e18a033bSKonstantin Ananyev        ctx->next = NULL;
221e18a033bSKonstantin Ananyev    }
222e18a033bSKonstantin Ananyev
223e18a033bSKonstantin Ananyev    rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->nginx, sub, NULL, handler,
224e18a033bSKonstantin Ananyev                                    NULL);
225e18a033bSKonstantin Ananyev
226e18a033bSKonstantin Ananyev    }
227e18a033bSKonstantin Ananyev
228e18a033bSKonstantin Ananyev    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
229e18a033bSKonstantin Ananyev                   "perl handler done: %i", rc);
230e18a033bSKonstantin Ananyev
231e18a033bSKonstantin Ananyev    if (rc == NGX_DONE) {
232e18a033bSKonstantin Ananyev        ngx_http_finalize_request(r, rc);
233e18a033bSKonstantin Ananyev        return;
234e18a033bSKonstantin Ananyev    }
235e18a033bSKonstantin Ananyev
236e18a033bSKonstantin Ananyev    if (rc > 600) {
237e18a033bSKonstantin Ananyev        rc = NGX_OK;
238e18a033bSKonstantin Ananyev    }
239e18a033bSKonstantin Ananyev
240e18a033bSKonstantin Ananyev    if (ctx->redirect_uri.len) {
241e18a033bSKonstantin Ananyev        uri = ctx->redirect_uri;
242e18a033bSKonstantin Ananyev        args = ctx->redirect_args;
243e18a033bSKonstantin Ananyev
244e18a033bSKonstantin Ananyev    } else {
245e18a033bSKonstantin Ananyev        uri.len = 0;
246e18a033bSKonstantin Ananyev    }
247e18a033bSKonstantin Ananyev
248e18a033bSKonstantin Ananyev    ctx->filename.data = NULL;
249e18a033bSKonstantin Ananyev    ctx->redirect_uri.len = 0;
250e18a033bSKonstantin Ananyev
251e18a033bSKonstantin Ananyev    if (ctx->done || ctx->next) {
252e18a033bSKonstantin Ananyev        ngx_http_finalize_request(r, NGX_DONE);
253e18a033bSKonstantin Ananyev        return;
254e18a033bSKonstantin Ananyev    }
255e18a033bSKonstantin Ananyev
256e18a033bSKonstantin Ananyev    if (uri.len) {
257e18a033bSKonstantin Ananyev        ngx_http_internal_redirect(r, &uri, &args);
258e18a033bSKonstantin Ananyev        ngx_http_finalize_request(r, NGX_DONE);
259e18a033bSKonstantin Ananyev        return;
260e18a033bSKonstantin Ananyev    }
261e18a033bSKonstantin Ananyev
262e18a033bSKonstantin Ananyev    if (rc == NGX_OK || rc == NGX_HTTP_OK) {
263e18a033bSKonstantin Ananyev        ngx_http_send_special(r, NGX_HTTP_LAST);
264e18a033bSKonstantin Ananyev        ctx->done = 1;
265e18a033bSKonstantin Ananyev    }
266e18a033bSKonstantin Ananyev
267e18a033bSKonstantin Ananyev    ngx_http_finalize_request(r, rc);
268e18a033bSKonstantin Ananyev}
269e18a033bSKonstantin Ananyev
270e18a033bSKonstantin Ananyev
271e18a033bSKonstantin Ananyevvoid
272e18a033bSKonstantin Ananyevngx_http_perl_sleep_handler(ngx_http_request_t *r)
273e18a033bSKonstantin Ananyev{
274e18a033bSKonstantin Ananyev    ngx_event_t  *wev;
275e18a033bSKonstantin Ananyev
276e18a033bSKonstantin Ananyev    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
277e18a033bSKonstantin Ananyev                   "perl sleep handler");
278e18a033bSKonstantin Ananyev
279e18a033bSKonstantin Ananyev    wev = r->connection->write;
280e18a033bSKonstantin Ananyev
281e18a033bSKonstantin Ananyev    if (wev->delayed) {
282e18a033bSKonstantin Ananyev
283e18a033bSKonstantin Ananyev        if (ngx_handle_write_event(wev, 0) != NGX_OK) {
284e18a033bSKonstantin Ananyev            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
285e18a033bSKonstantin Ananyev        }
286e18a033bSKonstantin Ananyev
287e18a033bSKonstantin Ananyev        return;
288e18a033bSKonstantin Ananyev    }
289e18a033bSKonstantin Ananyev
290e18a033bSKonstantin Ananyev    ngx_http_perl_handle_request(r);
291e18a033bSKonstantin Ananyev}
292e18a033bSKonstantin Ananyev
293e18a033bSKonstantin Ananyev
294e18a033bSKonstantin Ananyevstatic ngx_int_t
295e18a033bSKonstantin Ananyevngx_http_perl_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
296e18a033bSKonstantin Ananyev    uintptr_t data)
297e18a033bSKonstantin Ananyev{
298e18a033bSKonstantin Ananyev    ngx_http_perl_variable_t *pv = (ngx_http_perl_variable_t *) data;
299e18a033bSKonstantin Ananyev
300e18a033bSKonstantin Ananyev    ngx_int_t                   rc;
301e18a033bSKonstantin Ananyev    ngx_str_t                   value;
302e18a033bSKonstantin Ananyev    ngx_http_perl_ctx_t        *ctx;
303e18a033bSKonstantin Ananyev    ngx_http_perl_main_conf_t  *pmcf;
304e18a033bSKonstantin Ananyev
305e18a033bSKonstantin Ananyev    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
306e18a033bSKonstantin Ananyev                   "perl variable handler");
307e18a033bSKonstantin Ananyev
308e18a033bSKonstantin Ananyev    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);
309e18a033bSKonstantin Ananyev
310e18a033bSKonstantin Ananyev    if (ctx == NULL) {
311e18a033bSKonstantin Ananyev        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_perl_ctx_t));
312e18a033bSKonstantin Ananyev        if (ctx == NULL) {
313e18a033bSKonstantin Ananyev            return NGX_ERROR;
314e18a033bSKonstantin Ananyev        }
315e18a033bSKonstantin Ananyev
316e18a033bSKonstantin Ananyev        ngx_http_set_ctx(r, ctx, ngx_http_perl_module);
317e18a033bSKonstantin Ananyev    }
318e18a033bSKonstantin Ananyev
319e18a033bSKonstantin Ananyev    pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);
320e18a033bSKonstantin Ananyev
321e18a033bSKonstantin Ananyev    value.data = NULL;
322e18a033bSKonstantin Ananyev
323e18a033bSKonstantin Ananyev    {
324e18a033bSKonstantin Ananyev
325e18a033bSKonstantin Ananyev    dTHXa(pmcf->perl);
326e18a033bSKonstantin Ananyev    PERL_SET_CONTEXT(pmcf->perl);
327e18a033bSKonstantin Ananyev    PERL_SET_INTERP(pmcf->perl);
328e18a033bSKonstantin Ananyev
329e18a033bSKonstantin Ananyev    rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->nginx, pv->sub, NULL,
330e18a033bSKonstantin Ananyev                                    &pv->handler, &value);
331e18a033bSKonstantin Ananyev
332e18a033bSKonstantin Ananyev    }
333e18a033bSKonstantin Ananyev
334e18a033bSKonstantin Ananyev    if (value.data) {
335e18a033bSKonstantin Ananyev        v->len = value.len;
336e18a033bSKonstantin Ananyev        v->valid = 1;
337e18a033bSKonstantin Ananyev        v->no_cacheable = 0;
338e18a033bSKonstantin Ananyev        v->not_found = 0;
339e18a033bSKonstantin Ananyev        v->data = value.data;
340e18a033bSKonstantin Ananyev
341e18a033bSKonstantin Ananyev    } else {
342e18a033bSKonstantin Ananyev        v->not_found = 1;
343e18a033bSKonstantin Ananyev    }
344e18a033bSKonstantin Ananyev
345e18a033bSKonstantin Ananyev    ctx->filename.data = NULL;
346e18a033bSKonstantin Ananyev    ctx->redirect_uri.len = 0;
347e18a033bSKonstantin Ananyev
348e18a033bSKonstantin Ananyev    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
349e18a033bSKonstantin Ananyev                   "perl variable done");
350e18a033bSKonstantin Ananyev
351e18a033bSKonstantin Ananyev    return rc;
352e18a033bSKonstantin Ananyev}
353e18a033bSKonstantin Ananyev
354e18a033bSKonstantin Ananyev
355e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSI)
356e18a033bSKonstantin Ananyev
357e18a033bSKonstantin Ananyevstatic ngx_int_t
358e18a033bSKonstantin Ananyevngx_http_perl_ssi(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ssi_ctx,
359e18a033bSKonstantin Ananyev    ngx_str_t **params)
360e18a033bSKonstantin Ananyev{
361e18a033bSKonstantin Ananyev    SV                         *sv, **asv;
362e18a033bSKonstantin Ananyev    ngx_int_t                   rc;
363e18a033bSKonstantin Ananyev    ngx_str_t                  *handler, **args;
364e18a033bSKonstantin Ananyev    ngx_uint_t                  i;
365e18a033bSKonstantin Ananyev    ngx_http_perl_ctx_t        *ctx;
366e18a033bSKonstantin Ananyev    ngx_http_perl_main_conf_t  *pmcf;
367e18a033bSKonstantin Ananyev
368e18a033bSKonstantin Ananyev    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
369e18a033bSKonstantin Ananyev                   "perl ssi handler");
370e18a033bSKonstantin Ananyev
371e18a033bSKonstantin Ananyev    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);
372e18a033bSKonstantin Ananyev
373e18a033bSKonstantin Ananyev    if (ctx == NULL) {
374e18a033bSKonstantin Ananyev        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_perl_ctx_t));
375e18a033bSKonstantin Ananyev        if (ctx == NULL) {
376e18a033bSKonstantin Ananyev            return NGX_ERROR;
377e18a033bSKonstantin Ananyev        }
378e18a033bSKonstantin Ananyev
379e18a033bSKonstantin Ananyev        ngx_http_set_ctx(r, ctx, ngx_http_perl_module);
380e18a033bSKonstantin Ananyev    }
381e18a033bSKonstantin Ananyev
382e18a033bSKonstantin Ananyev    pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);
383e18a033bSKonstantin Ananyev
384e18a033bSKonstantin Ananyev    ctx->ssi = ssi_ctx;
385e18a033bSKonstantin Ananyev
386e18a033bSKonstantin Ananyev    handler = params[NGX_HTTP_PERL_SSI_SUB];
387e18a033bSKonstantin Ananyev    handler->data[handler->len] = '\0';
388e18a033bSKonstantin Ananyev
389e18a033bSKonstantin Ananyev    {
390e18a033bSKonstantin Ananyev
391e18a033bSKonstantin Ananyev    dTHXa(pmcf->perl);
392e18a033bSKonstantin Ananyev    PERL_SET_CONTEXT(pmcf->perl);
393e18a033bSKonstantin Ananyev    PERL_SET_INTERP(pmcf->perl);
394e18a033bSKonstantin Ananyev
395e18a033bSKonstantin Ananyev#if 0
396e18a033bSKonstantin Ananyev
397e18a033bSKonstantin Ananyev    /* the code is disabled to force the precompiled perl code using only */
398e18a033bSKonstantin Ananyev
399e18a033bSKonstantin Ananyev    ngx_http_perl_eval_anon_sub(aTHX_ handler, &sv);
400e18a033bSKonstantin Ananyev
401e18a033bSKonstantin Ananyev    if (sv == &PL_sv_undef) {
402e18a033bSKonstantin Ananyev        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
403e18a033bSKonstantin Ananyev                      "eval_pv(\"%V\") failed", handler);
404e18a033bSKonstantin Ananyev        return NGX_ERROR;
405e18a033bSKonstantin Ananyev    }
406e18a033bSKonstantin Ananyev
407e18a033bSKonstantin Ananyev    if (sv == NULL) {
408e18a033bSKonstantin Ananyev        sv = newSVpvn((char *) handler->data, handler->len);
409e18a033bSKonstantin Ananyev    }
410e18a033bSKonstantin Ananyev
411e18a033bSKonstantin Ananyev#endif
412e18a033bSKonstantin Ananyev
413e18a033bSKonstantin Ananyev    sv = newSVpvn((char *) handler->data, handler->len);
414e18a033bSKonstantin Ananyev
415e18a033bSKonstantin Ananyev    args = &params[NGX_HTTP_PERL_SSI_ARG];
416e18a033bSKonstantin Ananyev
417e18a033bSKonstantin Ananyev    if (args[0]) {
418