annotate src/http/modules/perl/ngx_http_perl_module.c @ 7653:8409f9df6219

SSL: client certificate validation with OCSP (ticket #1534). OCSP validation for client certificates is enabled by the "ssl_ocsp" directive. OCSP responder can be optionally specified by "ssl_ocsp_responder". When session is reused, peer chain is not available for validation. If the verified chain contains certificates from the peer chain not available at the server, validation will fail.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 22 May 2020 17:30:12 +0300
parents 5f642712e7ad
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3527
diff changeset
4 * Copyright (C) Nginx, Inc.
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11 #include <ngx_http_perl_module.h>
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 typedef struct {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 PerlInterpreter *perl;
873
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
16 HV *nginx;
3175
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
17 ngx_array_t *modules;
3174
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
18 ngx_array_t *requires;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 } ngx_http_perl_main_conf_t;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 typedef struct {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23 SV *sub;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 ngx_str_t handler;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 } ngx_http_perl_loc_conf_t;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 typedef struct {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 SV *sub;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 ngx_str_t handler;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 } ngx_http_perl_variable_t;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33
617
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
34 #if (NGX_HTTP_SSI)
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 static ngx_int_t ngx_http_perl_ssi(ngx_http_request_t *r,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 ngx_http_ssi_ctx_t *ssi_ctx, ngx_str_t **params);
617
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
37 #endif
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
38
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 static char *ngx_http_perl_init_interpreter(ngx_conf_t *cf,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 ngx_http_perl_main_conf_t *pmcf);
1069
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
41 static PerlInterpreter *ngx_http_perl_create_interpreter(ngx_conf_t *cf,
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
42 ngx_http_perl_main_conf_t *pmcf);
653
7cbef16c71a1 nginx-0.3.48-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 651
diff changeset
43 static ngx_int_t ngx_http_perl_run_requires(pTHX_ ngx_array_t *requires,
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
44 ngx_log_t *log);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 static ngx_int_t ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r,
7524
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
46 ngx_http_perl_ctx_t *ctx, HV *nginx, SV *sub, SV **args,
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
47 ngx_str_t *handler, ngx_str_t *rv);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 static void ngx_http_perl_eval_anon_sub(pTHX_ ngx_str_t *handler, SV **sv);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 static ngx_int_t ngx_http_perl_preconfiguration(ngx_conf_t *cf);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 static void *ngx_http_perl_create_main_conf(ngx_conf_t *cf);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 static char *ngx_http_perl_init_main_conf(ngx_conf_t *cf, void *conf);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 static void *ngx_http_perl_create_loc_conf(ngx_conf_t *cf);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 static char *ngx_http_perl_merge_loc_conf(ngx_conf_t *cf, void *parent,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 void *child);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 static char *ngx_http_perl(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 static char *ngx_http_perl_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
872
1c4a5b3f9110 Axe several perl interpreter instances: they may be useful in currently
Igor Sysoev <igor@sysoev.ru>
parents: 871
diff changeset
58
1c4a5b3f9110 Axe several perl interpreter instances: they may be useful in currently
Igor Sysoev <igor@sysoev.ru>
parents: 871
diff changeset
59 #if (NGX_HAVE_PERL_MULTIPLICITY)
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 static void ngx_http_perl_cleanup_perl(void *data);
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
61 #endif
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62
1257
927b06411194 set worker's perl $$
Igor Sysoev <igor@sysoev.ru>
parents: 1221
diff changeset
63 static ngx_int_t ngx_http_perl_init_worker(ngx_cycle_t *cycle);
1221
aa653367028e PERL_SYS_TERM() should be called once on exit only, this fixes the message
Igor Sysoev <igor@sysoev.ru>
parents: 1165
diff changeset
64 static void ngx_http_perl_exit(ngx_cycle_t *cycle);
aa653367028e PERL_SYS_TERM() should be called once on exit only, this fixes the message
Igor Sysoev <igor@sysoev.ru>
parents: 1165
diff changeset
65
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 static ngx_command_t ngx_http_perl_commands[] = {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 { ngx_string("perl_modules"),
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
3175
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
71 ngx_conf_set_str_array_slot,
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 NGX_HTTP_MAIN_CONF_OFFSET,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 offsetof(ngx_http_perl_main_conf_t, modules),
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 NULL },
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 { ngx_string("perl_require"),
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
3174
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
78 ngx_conf_set_str_array_slot,
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 NGX_HTTP_MAIN_CONF_OFFSET,
3174
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
80 offsetof(ngx_http_perl_main_conf_t, requires),
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 NULL },
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 { ngx_string("perl"),
922
a5b9cdfe3e19 allow "perl" inside "limit_except"
Igor Sysoev <igor@sysoev.ru>
parents: 913
diff changeset
84 NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 ngx_http_perl,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 NGX_HTTP_LOC_CONF_OFFSET,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 0,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 NULL },
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 { ngx_string("perl_set"),
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 ngx_http_perl_set,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 NGX_HTTP_LOC_CONF_OFFSET,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 0,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 NULL },
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 ngx_null_command
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 };
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 static ngx_http_module_t ngx_http_perl_module_ctx = {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 ngx_http_perl_preconfiguration, /* preconfiguration */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 NULL, /* postconfiguration */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 ngx_http_perl_create_main_conf, /* create main configuration */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 ngx_http_perl_init_main_conf, /* init main configuration */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 NULL, /* create server configuration */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 NULL, /* merge server configuration */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 ngx_http_perl_create_loc_conf, /* create location configuration */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 ngx_http_perl_merge_loc_conf /* merge location configuration */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 };
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 ngx_module_t ngx_http_perl_module = {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 NGX_MODULE_V1,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 &ngx_http_perl_module_ctx, /* module context */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 ngx_http_perl_commands, /* module directives */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 NGX_HTTP_MODULE, /* module type */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 NULL, /* init master */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 NULL, /* init module */
1257
927b06411194 set worker's perl $$
Igor Sysoev <igor@sysoev.ru>
parents: 1221
diff changeset
123 ngx_http_perl_init_worker, /* init process */
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 NULL, /* init thread */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 NULL, /* exit thread */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 NULL, /* exit process */
1221
aa653367028e PERL_SYS_TERM() should be called once on exit only, this fixes the message
Igor Sysoev <igor@sysoev.ru>
parents: 1165
diff changeset
127 ngx_http_perl_exit, /* exit master */
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 NGX_MODULE_V1_PADDING
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 };
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131
617
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
132 #if (NGX_HTTP_SSI)
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
133
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 #define NGX_HTTP_PERL_SSI_SUB 0
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 #define NGX_HTTP_PERL_SSI_ARG 1
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 static ngx_http_ssi_param_t ngx_http_perl_ssi_params[] = {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 { ngx_string("sub"), NGX_HTTP_PERL_SSI_SUB, 1, 0 },
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 { ngx_string("arg"), NGX_HTTP_PERL_SSI_ARG, 0, 1 },
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 { ngx_null_string, 0, 0, 0 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 };
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 static ngx_http_ssi_command_t ngx_http_perl_ssi_command = {
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
145 ngx_string("perl"), ngx_http_perl_ssi, ngx_http_perl_ssi_params, 0, 0, 1
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 };
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147
617
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
148 #endif
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
149
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150
3350
67da53a19e02 use global perl variable in perl_destruct()/perl_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3175
diff changeset
151 static ngx_str_t ngx_null_name = ngx_null_string;
67da53a19e02 use global perl variable in perl_destruct()/perl_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3175
diff changeset
152 static HV *nginx_stash;
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
153
2715
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
154 #if (NGX_HAVE_PERL_MULTIPLICITY)
3350
67da53a19e02 use global perl variable in perl_destruct()/perl_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3175
diff changeset
155 static ngx_uint_t ngx_perl_term;
67da53a19e02 use global perl variable in perl_destruct()/perl_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3175
diff changeset
156 #else
67da53a19e02 use global perl variable in perl_destruct()/perl_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3175
diff changeset
157 static PerlInterpreter *perl;
2715
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
158 #endif
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
159
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
160
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 static void
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 ngx_http_perl_xs_init(pTHX)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, __FILE__);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
165
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
166 nginx_stash = gv_stashpv("nginx", TRUE);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 static ngx_int_t
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 ngx_http_perl_handler(ngx_http_request_t *r)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 {
3082
5e8bf3e983d2 fix request counter handling for perl handler, introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
173 r->main->count++;
5e8bf3e983d2 fix request counter handling for perl handler, introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
174
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
175 ngx_http_perl_handle_request(r);
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
176
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
177 return NGX_DONE;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
178 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
179
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
180
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
181 void
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
182 ngx_http_perl_handle_request(ngx_http_request_t *r)
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
183 {
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
184 SV *sub;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 ngx_int_t rc;
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
186 ngx_str_t uri, args, *handler;
7532
975d7ab37b39 Perl: expect escaped URIs in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7531
diff changeset
187 ngx_uint_t flags;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 ngx_http_perl_ctx_t *ctx;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 ngx_http_perl_loc_conf_t *plcf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 ngx_http_perl_main_conf_t *pmcf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "perl handler");
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 if (ctx == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_perl_ctx_t));
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 if (ctx == NULL) {
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
199 ngx_http_finalize_request(r, NGX_ERROR);
1025
f88651afad40 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 922
diff changeset
200 return;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 ngx_http_set_ctx(r, ctx, ngx_http_perl_module);
7524
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
204
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
205 ctx->request = r;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208 pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
210 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211
872
1c4a5b3f9110 Axe several perl interpreter instances: they may be useful in currently
Igor Sysoev <igor@sysoev.ru>
parents: 871
diff changeset
212 dTHXa(pmcf->perl);
873
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
213 PERL_SET_CONTEXT(pmcf->perl);
6820
eada22643e8b Perl: added PERL_SET_INTERP().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6791
diff changeset
214 PERL_SET_INTERP(pmcf->perl);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
216 if (ctx->next == NULL) {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
217 plcf = ngx_http_get_module_loc_conf(r, ngx_http_perl_module);
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
218 sub = plcf->sub;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
219 handler = &plcf->handler;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
221 } else {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
222 sub = ctx->next;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
223 handler = &ngx_null_name;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
224 ctx->next = NULL;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
225 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
226
7524
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
227 rc = ngx_http_perl_call_handler(aTHX_ r, ctx, pmcf->nginx, sub, NULL,
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
228 handler, NULL);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231
3082
5e8bf3e983d2 fix request counter handling for perl handler, introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
232 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
5e8bf3e983d2 fix request counter handling for perl handler, introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
233 "perl handler done: %i", rc);
5e8bf3e983d2 fix request counter handling for perl handler, introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
234
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235 if (rc > 600) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 rc = NGX_OK;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 if (ctx->redirect_uri.len) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 uri = ctx->redirect_uri;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
241
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
242 } else {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
243 uri.len = 0;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
246 ctx->filename.data = NULL;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 ctx->redirect_uri.len = 0;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248
7525
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
249 if (rc == NGX_ERROR) {
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
250 ngx_http_finalize_request(r, rc);
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
251 return;
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
252 }
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
253
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
254 if (ctx->done || ctx->next) {
3111
4a2d3f571de6 fix request counter handling in perl module for $r->internal_redirect()
Igor Sysoev <igor@sysoev.ru>
parents: 3082
diff changeset
255 ngx_http_finalize_request(r, NGX_DONE);
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
256 return;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
257 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
258
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259 if (uri.len) {
7533
5f642712e7ad Perl: named locations in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7532
diff changeset
260 if (uri.data[0] == '@') {
5f642712e7ad Perl: named locations in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7532
diff changeset
261 ngx_http_named_location(r, &uri);
5f642712e7ad Perl: named locations in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7532
diff changeset
262
5f642712e7ad Perl: named locations in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7532
diff changeset
263 } else {
5f642712e7ad Perl: named locations in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7532
diff changeset
264 ngx_str_null(&args);
5f642712e7ad Perl: named locations in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7532
diff changeset
265 flags = NGX_HTTP_LOG_UNSAFE;
7532
975d7ab37b39 Perl: expect escaped URIs in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7531
diff changeset
266
7533
5f642712e7ad Perl: named locations in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7532
diff changeset
267 if (ngx_http_parse_unsafe_uri(r, &uri, &args, &flags) != NGX_OK) {
5f642712e7ad Perl: named locations in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7532
diff changeset
268 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
5f642712e7ad Perl: named locations in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7532
diff changeset
269 return;
5f642712e7ad Perl: named locations in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7532
diff changeset
270 }
5f642712e7ad Perl: named locations in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7532
diff changeset
271
5f642712e7ad Perl: named locations in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7532
diff changeset
272 ngx_http_internal_redirect(r, &uri, &args);
7532
975d7ab37b39 Perl: expect escaped URIs in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7531
diff changeset
273 }
975d7ab37b39 Perl: expect escaped URIs in $r->internal_redirect().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7531
diff changeset
274
3111
4a2d3f571de6 fix request counter handling in perl module for $r->internal_redirect()
Igor Sysoev <igor@sysoev.ru>
parents: 3082
diff changeset
275 ngx_http_finalize_request(r, NGX_DONE);
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
276 return;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279 if (rc == NGX_OK || rc == NGX_HTTP_OK) {
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
280 ngx_http_send_special(r, NGX_HTTP_LAST);
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 673
diff changeset
281 ctx->done = 1;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
284 ngx_http_finalize_request(r, rc);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287
1897
b43f244d0430 optimize $r->sleep
Igor Sysoev <igor@sysoev.ru>
parents: 1702
diff changeset
288 void
911
73c66ed9a9cd $r->sleep()
Igor Sysoev <igor@sysoev.ru>
parents: 908
diff changeset
289 ngx_http_perl_sleep_handler(ngx_http_request_t *r)
73c66ed9a9cd $r->sleep()
Igor Sysoev <igor@sysoev.ru>
parents: 908
diff changeset
290 {
913
90ce4d0e3241 fix ngx_http_perl_sleep_handler()
Igor Sysoev <igor@sysoev.ru>
parents: 911
diff changeset
291 ngx_event_t *wev;
90ce4d0e3241 fix ngx_http_perl_sleep_handler()
Igor Sysoev <igor@sysoev.ru>
parents: 911
diff changeset
292
911
73c66ed9a9cd $r->sleep()
Igor Sysoev <igor@sysoev.ru>
parents: 908
diff changeset
293 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
73c66ed9a9cd $r->sleep()
Igor Sysoev <igor@sysoev.ru>
parents: 908
diff changeset
294 "perl sleep handler");
73c66ed9a9cd $r->sleep()
Igor Sysoev <igor@sysoev.ru>
parents: 908
diff changeset
295
913
90ce4d0e3241 fix ngx_http_perl_sleep_handler()
Igor Sysoev <igor@sysoev.ru>
parents: 911
diff changeset
296 wev = r->connection->write;
90ce4d0e3241 fix ngx_http_perl_sleep_handler()
Igor Sysoev <igor@sysoev.ru>
parents: 911
diff changeset
297
6961
903fb1ddc07f Moved handling of wev->delayed to the connection event handler.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6960
diff changeset
298 if (wev->delayed) {
6960
1c5e5e5b008d Perl: fixed delaying subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6820
diff changeset
299
1c5e5e5b008d Perl: fixed delaying subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6820
diff changeset
300 if (ngx_handle_write_event(wev, 0) != NGX_OK) {
1c5e5e5b008d Perl: fixed delaying subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6820
diff changeset
301 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
1c5e5e5b008d Perl: fixed delaying subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6820
diff changeset
302 }
1c5e5e5b008d Perl: fixed delaying subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6820
diff changeset
303
913
90ce4d0e3241 fix ngx_http_perl_sleep_handler()
Igor Sysoev <igor@sysoev.ru>
parents: 911
diff changeset
304 return;
90ce4d0e3241 fix ngx_http_perl_sleep_handler()
Igor Sysoev <igor@sysoev.ru>
parents: 911
diff changeset
305 }
90ce4d0e3241 fix ngx_http_perl_sleep_handler()
Igor Sysoev <igor@sysoev.ru>
parents: 911
diff changeset
306
6960
1c5e5e5b008d Perl: fixed delaying subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6820
diff changeset
307 ngx_http_perl_handle_request(r);
911
73c66ed9a9cd $r->sleep()
Igor Sysoev <igor@sysoev.ru>
parents: 908
diff changeset
308 }
73c66ed9a9cd $r->sleep()
Igor Sysoev <igor@sysoev.ru>
parents: 908
diff changeset
309
73c66ed9a9cd $r->sleep()
Igor Sysoev <igor@sysoev.ru>
parents: 908
diff changeset
310
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311 static ngx_int_t
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 ngx_http_perl_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313 uintptr_t data)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315 ngx_http_perl_variable_t *pv = (ngx_http_perl_variable_t *) data;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317 ngx_int_t rc;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318 ngx_str_t value;
7528
0cb693b4cbbb Perl: disabled unrelated calls from variable handlers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7525
diff changeset
319 ngx_uint_t saved;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 ngx_http_perl_ctx_t *ctx;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321 ngx_http_perl_main_conf_t *pmcf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324 "perl variable handler");
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
325
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
326 ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
327
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
328 if (ctx == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
329 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_perl_ctx_t));
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
330 if (ctx == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
331 return NGX_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 ngx_http_set_ctx(r, ctx, ngx_http_perl_module);
7524
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
335
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
336 ctx->request = r;
872
1c4a5b3f9110 Axe several perl interpreter instances: they may be useful in currently
Igor Sysoev <igor@sysoev.ru>
parents: 871
diff changeset
337 }
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338
7528
0cb693b4cbbb Perl: disabled unrelated calls from variable handlers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7525
diff changeset
339 saved = ctx->variable;
0cb693b4cbbb Perl: disabled unrelated calls from variable handlers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7525
diff changeset
340 ctx->variable = 1;
0cb693b4cbbb Perl: disabled unrelated calls from variable handlers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7525
diff changeset
341
872
1c4a5b3f9110 Axe several perl interpreter instances: they may be useful in currently
Igor Sysoev <igor@sysoev.ru>
parents: 871
diff changeset
342 pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
343
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
344 value.data = NULL;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
345
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
346 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
347
872
1c4a5b3f9110 Axe several perl interpreter instances: they may be useful in currently
Igor Sysoev <igor@sysoev.ru>
parents: 871
diff changeset
348 dTHXa(pmcf->perl);
873
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
349 PERL_SET_CONTEXT(pmcf->perl);
6820
eada22643e8b Perl: added PERL_SET_INTERP().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6791
diff changeset
350 PERL_SET_INTERP(pmcf->perl);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351
7524
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
352 rc = ngx_http_perl_call_handler(aTHX_ r, ctx, pmcf->nginx, pv->sub, NULL,
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
353 &pv->handler, &value);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
354
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357 if (value.data) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358 v->len = value.len;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
359 v->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1352
diff changeset
360 v->no_cacheable = 0;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
361 v->not_found = 0;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
362 v->data = value.data;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
363
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
364 } else {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
365 v->not_found = 1;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
367
7528
0cb693b4cbbb Perl: disabled unrelated calls from variable handlers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7525
diff changeset
368 ctx->variable = saved;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
369 ctx->filename.data = NULL;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370 ctx->redirect_uri.len = 0;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371
871
a980f66c04fb add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 870
diff changeset
372 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
a980f66c04fb add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 870
diff changeset
373 "perl variable done");
a980f66c04fb add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 870
diff changeset
374
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 return rc;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
378
617
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
379 #if (NGX_HTTP_SSI)
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
380
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381 static ngx_int_t
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382 ngx_http_perl_ssi(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ssi_ctx,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383 ngx_str_t **params)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384 {
1899
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
385 SV *sv, **asv;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 ngx_int_t rc;
1899
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
387 ngx_str_t *handler, **args;
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
388 ngx_uint_t i;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389 ngx_http_perl_ctx_t *ctx;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390 ngx_http_perl_main_conf_t *pmcf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 "perl ssi handler");
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395 ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397 if (ctx == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_perl_ctx_t));
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399 if (ctx == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 return NGX_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403 ngx_http_set_ctx(r, ctx, ngx_http_perl_module);
7524
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
404
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
405 ctx->request = r;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
406 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407
872
1c4a5b3f9110 Axe several perl interpreter instances: they may be useful in currently
Igor Sysoev <igor@sysoev.ru>
parents: 871
diff changeset
408 pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
409
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
410 ctx->ssi = ssi_ctx;
7531
ede052c67512 Perl: additional ctx->header_sent checks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7530
diff changeset
411 ctx->header_sent = 1;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 handler = params[NGX_HTTP_PERL_SSI_SUB];
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414 handler->data[handler->len] = '\0';
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417
872
1c4a5b3f9110 Axe several perl interpreter instances: they may be useful in currently
Igor Sysoev <igor@sysoev.ru>
parents: 871
diff changeset
418 dTHXa(pmcf->perl);
873
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
419 PERL_SET_CONTEXT(pmcf->perl);
6820
eada22643e8b Perl: added PERL_SET_INTERP().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6791
diff changeset
420 PERL_SET_INTERP(pmcf->perl);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
422 #if 0
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
423
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
424 /* the code is disabled to force the precompiled perl code using only */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
425
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
426 ngx_http_perl_eval_anon_sub(aTHX_ handler, &sv);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
427
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
428 if (sv == &PL_sv_undef) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
429 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
430 "eval_pv(\"%V\") failed", handler);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
431 return NGX_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
432 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
433
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
434 if (sv == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
435 sv = newSVpvn((char *) handler->data, handler->len);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
436 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
437
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
438 #endif
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
439
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
440 sv = newSVpvn((char *) handler->data, handler->len);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441
1899
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
442 args = &params[NGX_HTTP_PERL_SSI_ARG];
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
443
6791
cb4a4e9bba8e Perl: fixed optimization in SSI command handler.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5800
diff changeset
444 if (args[0]) {
1899
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
445
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
446 for (i = 0; args[i]; i++) { /* void */ }
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
447
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
448 asv = ngx_pcalloc(r->pool, (i + 1) * sizeof(SV *));
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
449
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
450 if (asv == NULL) {
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
451 SvREFCNT_dec(sv);
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
452 return NGX_ERROR;
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
453 }
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
454
5362
79b9101cecf4 Handling of ngx_int_t != intptr_t case.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5330
diff changeset
455 asv[0] = (SV *) (uintptr_t) i;
1899
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
456
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
457 for (i = 0; args[i]; i++) {
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
458 asv[i + 1] = newSVpvn((char *) args[i]->data, args[i]->len);
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
459 }
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
460
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
461 } else {
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
462 asv = NULL;
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
463 }
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
464
7524
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
465 rc = ngx_http_perl_call_handler(aTHX_ r, ctx, pmcf->nginx, sv, asv,
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
466 handler, NULL);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468 SvREFCNT_dec(sv);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
472 ctx->filename.data = NULL;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473 ctx->redirect_uri.len = 0;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474 ctx->ssi = NULL;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475
871
a980f66c04fb add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 870
diff changeset
476 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "perl ssi done");
a980f66c04fb add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 870
diff changeset
477
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 return rc;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480
617
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
481 #endif
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
482
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484 static char *
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 ngx_http_perl_init_interpreter(ngx_conf_t *cf, ngx_http_perl_main_conf_t *pmcf)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486 {
3350
67da53a19e02 use global perl variable in perl_destruct()/perl_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3175
diff changeset
487 ngx_str_t *m;
67da53a19e02 use global perl variable in perl_destruct()/perl_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3175
diff changeset
488 ngx_uint_t i;
872
1c4a5b3f9110 Axe several perl interpreter instances: they may be useful in currently
Igor Sysoev <igor@sysoev.ru>
parents: 871
diff changeset
489 #if (NGX_HAVE_PERL_MULTIPLICITY)
3350
67da53a19e02 use global perl variable in perl_destruct()/perl_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3175
diff changeset
490 ngx_pool_cleanup_t *cln;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 cln = ngx_pool_cleanup_add(cf->pool, 0);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 if (cln == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494 return NGX_CONF_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
497 #endif
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
498
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499 #ifdef NGX_PERL_MODULES
3175
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
500 if (pmcf->modules == NGX_CONF_UNSET_PTR) {
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
501
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
502 pmcf->modules = ngx_array_create(cf->pool, 1, sizeof(ngx_str_t));
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
503 if (pmcf->modules == NULL) {
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
504 return NGX_CONF_ERROR;
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
505 }
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
506
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
507 m = ngx_array_push(pmcf->modules);
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
508 if (m == NULL) {
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
509 return NGX_CONF_ERROR;
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
510 }
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
511
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 3448
diff changeset
512 ngx_str_set(m, NGX_PERL_MODULES);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514 #endif
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515
3175
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
516 if (pmcf->modules != NGX_CONF_UNSET_PTR) {
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
517 m = pmcf->modules->elts;
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
518 for (i = 0; i < pmcf->modules->nelts; i++) {
5330
314c3d7cc3a5 Backed out f1a91825730a and 7094bd12c1ff.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5317
diff changeset
519 if (ngx_conf_full_name(cf->cycle, &m[i], 0) != NGX_OK) {
3175
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
520 return NGX_CONF_ERROR;
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
521 }
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
522 }
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
523 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 623
diff changeset
524
872
1c4a5b3f9110 Axe several perl interpreter instances: they may be useful in currently
Igor Sysoev <igor@sysoev.ru>
parents: 871
diff changeset
525 #if !(NGX_HAVE_PERL_MULTIPLICITY)
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
526
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
527 if (perl) {
1165
efb7d84db340 fix segfault when
Igor Sysoev <igor@sysoev.ru>
parents: 1163
diff changeset
528
efb7d84db340 fix segfault when
Igor Sysoev <igor@sysoev.ru>
parents: 1163
diff changeset
529 if (ngx_set_environment(cf->cycle, NULL) == NULL) {
efb7d84db340 fix segfault when
Igor Sysoev <igor@sysoev.ru>
parents: 1163
diff changeset
530 return NGX_CONF_ERROR;
efb7d84db340 fix segfault when
Igor Sysoev <igor@sysoev.ru>
parents: 1163
diff changeset
531 }
efb7d84db340 fix segfault when
Igor Sysoev <igor@sysoev.ru>
parents: 1163
diff changeset
532
3174
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
533 if (ngx_http_perl_run_requires(aTHX_ pmcf->requires, cf->log)
653
7cbef16c71a1 nginx-0.3.48-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 651
diff changeset
534 != NGX_OK)
7cbef16c71a1 nginx-0.3.48-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 651
diff changeset
535 {
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
536 return NGX_CONF_ERROR;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
537 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
538
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
539 pmcf->perl = perl;
1163
8288459f15c9 set nginx_stash after reconfiguration in single interpreter perl
Igor Sysoev <igor@sysoev.ru>
parents: 1069
diff changeset
540 pmcf->nginx = nginx_stash;
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
541
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
542 return NGX_CONF_OK;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
543 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
544
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
545 #endif
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
546
1221
aa653367028e PERL_SYS_TERM() should be called once on exit only, this fixes the message
Igor Sysoev <igor@sysoev.ru>
parents: 1165
diff changeset
547 if (nginx_stash == NULL) {
aa653367028e PERL_SYS_TERM() should be called once on exit only, this fixes the message
Igor Sysoev <igor@sysoev.ru>
parents: 1165
diff changeset
548 PERL_SYS_INIT(&ngx_argc, &ngx_argv);
aa653367028e PERL_SYS_TERM() should be called once on exit only, this fixes the message
Igor Sysoev <igor@sysoev.ru>
parents: 1165
diff changeset
549 }
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
550
1069
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
551 pmcf->perl = ngx_http_perl_create_interpreter(cf, pmcf);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
552
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
553 if (pmcf->perl == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
554 return NGX_CONF_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
555 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
556
873
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
557 pmcf->nginx = nginx_stash;
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
558
872
1c4a5b3f9110 Axe several perl interpreter instances: they may be useful in currently
Igor Sysoev <igor@sysoev.ru>
parents: 871
diff changeset
559 #if (NGX_HAVE_PERL_MULTIPLICITY)
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
560
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 cln->handler = ngx_http_perl_cleanup_perl;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562 cln->data = pmcf->perl;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
563
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
564 #else
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
565
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
566 perl = pmcf->perl;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
567
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
568 #endif
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
569
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
570 return NGX_CONF_OK;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
571 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
572
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
573
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
574 static PerlInterpreter *
1069
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
575 ngx_http_perl_create_interpreter(ngx_conf_t *cf,
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
576 ngx_http_perl_main_conf_t *pmcf)
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
577 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
578 int n;
775
a452a0e13539 check nginx.pm version
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
579 STRLEN len;
a452a0e13539 check nginx.pm version
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
580 SV *sv;
3175
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
581 char *ver, **embedding;
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
582 ngx_str_t *m;
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
583 ngx_uint_t i;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
584 PerlInterpreter *perl;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
585
1069
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
586 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0, "create perl interpreter");
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
587
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
588 if (ngx_set_environment(cf->cycle, NULL) == NULL) {
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
589 return NULL;
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
590 }
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
591
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
592 perl = perl_alloc();
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
593 if (perl == NULL) {
1069
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
594 ngx_log_error(NGX_LOG_ALERT, cf->log, 0, "perl_alloc() failed");
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
595 return NULL;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
596 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
597
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
598 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
600 dTHXa(perl);
873
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
601 PERL_SET_CONTEXT(perl);
6820
eada22643e8b Perl: added PERL_SET_INTERP().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6791
diff changeset
602 PERL_SET_INTERP(perl);
873
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
603
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
604 perl_construct(perl);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
605
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 #ifdef PERL_EXIT_DESTRUCT_END
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607 PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
608 #endif
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609
3175
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
610 n = (pmcf->modules != NGX_CONF_UNSET_PTR) ? pmcf->modules->nelts * 2 : 0;
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
611
5800
0570e42ffeed Perl: NULL-terminate argument list.
Piotr Sikora <piotr@cloudflare.com>
parents: 5362
diff changeset
612 embedding = ngx_palloc(cf->pool, (5 + n) * sizeof(char *));
3175
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
613 if (embedding == NULL) {
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
614 goto fail;
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
615 }
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
616
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
617 embedding[0] = "";
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
618
3175
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
619 if (n++) {
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
620 m = pmcf->modules->elts;
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
621 for (i = 0; i < pmcf->modules->nelts; i++) {
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
622 embedding[2 * i + 1] = "-I";
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
623 embedding[2 * i + 2] = (char *) m[i].data;
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
624 }
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
627 embedding[n++] = "-Mnginx";
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
628 embedding[n++] = "-e";
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
629 embedding[n++] = "0";
5800
0570e42ffeed Perl: NULL-terminate argument list.
Piotr Sikora <piotr@cloudflare.com>
parents: 5362
diff changeset
630 embedding[n] = NULL;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
631
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
632 n = perl_parse(perl, ngx_http_perl_xs_init, n, embedding, NULL);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
633
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
634 if (n != 0) {
1069
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
635 ngx_log_error(NGX_LOG_ALERT, cf->log, 0, "perl_parse() failed: %d", n);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
636 goto fail;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
637 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
638
775
a452a0e13539 check nginx.pm version
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
639 sv = get_sv("nginx::VERSION", FALSE);
a452a0e13539 check nginx.pm version
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
640 ver = SvPV(sv, len);
a452a0e13539 check nginx.pm version
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
641
a452a0e13539 check nginx.pm version
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
642 if (ngx_strcmp(ver, NGINX_VERSION) != 0) {
1069
Igor Sysoev <igor@sysoev.ru>
parents: 1025
diff changeset
643 ngx_log_error(NGX_LOG_ALERT, cf->log, 0,
775
a452a0e13539 check nginx.pm version
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
644 "version " NGINX_VERSION " of nginx.pm is required, "
a452a0e13539 check nginx.pm version
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
645 "but %s was found", ver);
a452a0e13539 check nginx.pm version
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
646 goto fail;
a452a0e13539 check nginx.pm version
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
647 }
a452a0e13539 check nginx.pm version
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
648
3174
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
649 if (ngx_http_perl_run_requires(aTHX_ pmcf->requires, cf->log) != NGX_OK) {
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
650 goto fail;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
651 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
652
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
653 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
654
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
655 return perl;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
656
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657 fail:
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
658
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
659 (void) perl_destruct(perl);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
661 perl_free(perl);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
662
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663 return NULL;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
664 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
665
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
666
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
667 static ngx_int_t
653
7cbef16c71a1 nginx-0.3.48-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 651
diff changeset
668 ngx_http_perl_run_requires(pTHX_ ngx_array_t *requires, ngx_log_t *log)
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
669 {
3173
008a3462e1d0 optimize error handling
Igor Sysoev <igor@sysoev.ru>
parents: 3132
diff changeset
670 u_char *err;
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
671 STRLEN len;
3174
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
672 ngx_str_t *script;
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
673 ngx_uint_t i;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
674
3174
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
675 if (requires == NGX_CONF_UNSET_PTR) {
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
676 return NGX_OK;
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
677 }
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
678
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
679 script = requires->elts;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
680 for (i = 0; i < requires->nelts; i++) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
681
3174
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
682 require_pv((char *) script[i].data);
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
683
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
684 if (SvTRUE(ERRSV)) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
685
3173
008a3462e1d0 optimize error handling
Igor Sysoev <igor@sysoev.ru>
parents: 3132
diff changeset
686 err = (u_char *) SvPV(ERRSV, len);
008a3462e1d0 optimize error handling
Igor Sysoev <igor@sysoev.ru>
parents: 3132
diff changeset
687 while (--len && (err[len] == CR || err[len] == LF)) { /* void */ }
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
688
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
689 ngx_log_error(NGX_LOG_EMERG, log, 0,
3173
008a3462e1d0 optimize error handling
Igor Sysoev <igor@sysoev.ru>
parents: 3132
diff changeset
690 "require_pv(\"%s\") failed: \"%*s\"",
3174
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
691 script[i].data, len + 1, err);
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
692
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
693 return NGX_ERROR;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
694 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
695 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
696
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
697 return NGX_OK;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
698 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
699
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
700
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
701 static ngx_int_t
7524
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
702 ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r,
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
703 ngx_http_perl_ctx_t *ctx, HV *nginx, SV *sub, SV **args,
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
704 ngx_str_t *handler, ngx_str_t *rv)
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
705 {
1702
86bb52e28ce0 fix segfault when $r->has_request_body() is called with ready body
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
706 SV *sv;
86bb52e28ce0 fix segfault when $r->has_request_body() is called with ready body
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
707 int n, status;
86bb52e28ce0 fix segfault when $r->has_request_body() is called with ready body
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
708 char *line;
3173
008a3462e1d0 optimize error handling
Igor Sysoev <igor@sysoev.ru>
parents: 3132
diff changeset
709 u_char *err;
1702
86bb52e28ce0 fix segfault when $r->has_request_body() is called with ready body
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
710 STRLEN len, n_a;
86bb52e28ce0 fix segfault when $r->has_request_body() is called with ready body
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
711 ngx_uint_t i;
86bb52e28ce0 fix segfault when $r->has_request_body() is called with ready body
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
712 ngx_connection_t *c;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
713
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
714 dSP;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
715
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
716 status = 0;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
717
7525
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
718 ctx->error = 0;
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
719 ctx->status = NGX_OK;
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
720
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
721 ENTER;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
722 SAVETMPS;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
723
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
724 PUSHMARK(sp);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
725
7524
deebe988cbd7 Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7523
diff changeset
726 sv = sv_2mortal(sv_bless(newRV_noinc(newSViv(PTR2IV(ctx))), nginx));
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
727 XPUSHs(sv);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
728
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
729 if (args) {
1940
6a4c74bea81c fix building on 64-bit platforms broken in r1900
Igor Sysoev <igor@sysoev.ru>
parents: 1899
diff changeset
730 EXTEND(sp, (intptr_t) args[0]);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
731
5362
79b9101cecf4 Handling of ngx_int_t != intptr_t case.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5330
diff changeset
732 for (i = 1; i <= (uintptr_t) args[0]; i++) {
1899
d24ef26f1205 pass additional arguments in ngx_http_perl_call_handler() as SV
Igor Sysoev <igor@sysoev.ru>
parents: 1897
diff changeset
733 PUSHs(sv_2mortal(args[i]));
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
734 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
735 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
736
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
737 PUTBACK;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
738
1702
86bb52e28ce0 fix segfault when $r->has_request_body() is called with ready body
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
739 c = r->connection;
86bb52e28ce0 fix segfault when $r->has_request_body() is called with ready body
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
740
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
741 n = call_sv(sub, G_EVAL);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
742
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
743 SPAGAIN;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
744
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
745 if (n) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
746 if (rv == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
747 status = POPi;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
748
1702
86bb52e28ce0 fix segfault when $r->has_request_body() is called with ready body
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
749 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
750 "call_sv: %d", status);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
751
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
752 } else {
619
7a16e281c01f nginx-0.3.31-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 617
diff changeset
753 line = SvPVx(POPs, n_a);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
754 rv->len = n_a;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
755
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1946
diff changeset
756 rv->data = ngx_pnalloc(r->pool, n_a);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
757 if (rv->data == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
758 return NGX_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
759 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
760
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
761 ngx_memcpy(rv->data, line, n_a);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
762 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
763 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
764
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
765 PUTBACK;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
766
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
767 FREETMPS;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
768 LEAVE;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
769
7525
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
770 if (ctx->error) {
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
771
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
772 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
773 "call_sv: error, %d", ctx->status);
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
774
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
775 if (ctx->status != NGX_OK) {
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
776 return ctx->status;
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
777 }
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
778
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
779 return NGX_ERROR;
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
780 }
575480d3fd01 Perl: propagate errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7524
diff changeset
781
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
782 /* check $@ */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
783
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
784 if (SvTRUE(ERRSV)) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
785
3173
008a3462e1d0 optimize error handling
Igor Sysoev <igor@sysoev.ru>
parents: 3132
diff changeset
786 err = (u_char *) SvPV(ERRSV, len);
008a3462e1d0 optimize error handling
Igor Sysoev <igor@sysoev.ru>
parents: 3132
diff changeset
787 while (--len && (err[len] == CR || err[len] == LF)) { /* void */ }
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
788
1702
86bb52e28ce0 fix segfault when $r->has_request_body() is called with ready body
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
789 ngx_log_error(NGX_LOG_ERR, c->log, 0,
3173
008a3462e1d0 optimize error handling
Igor Sysoev <igor@sysoev.ru>
parents: 3132
diff changeset
790 "call_sv(\"%V\") failed: \"%*s\"", handler, len + 1, err);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
791
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
792 if (rv) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
793 return NGX_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
794 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
795
7529
d758d04e0790 Perl: avoid redirects on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7528
diff changeset
796 ctx->redirect_uri.len = 0;
d758d04e0790 Perl: avoid redirects on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7528
diff changeset
797
7530
fd9252844ec1 Perl: avoid returning 500 if header was already sent.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7529
diff changeset
798 if (ctx->header_sent) {
fd9252844ec1 Perl: avoid returning 500 if header was already sent.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7529
diff changeset
799 return NGX_ERROR;
fd9252844ec1 Perl: avoid returning 500 if header was already sent.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7529
diff changeset
800 }
fd9252844ec1 Perl: avoid returning 500 if header was already sent.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7529
diff changeset
801
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
802 return NGX_HTTP_INTERNAL_SERVER_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
803 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
804
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
805 if (n != 1) {
1702
86bb52e28ce0 fix segfault when $r->has_request_body() is called with ready body
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
806 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
807 "call_sv(\"%V\") returned %d results", handler, n);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
808 status = NGX_OK;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
809 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
810
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
811 if (rv) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
812 return NGX_OK;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
813 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
814
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
815 return (ngx_int_t) status;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
816 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
817
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
818
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
819 static void
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
820 ngx_http_perl_eval_anon_sub(pTHX_ ngx_str_t *handler, SV **sv)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
821 {
623
0216fd1471f3 nginx-0.3.33-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 619
diff changeset
822 u_char *p;
0216fd1471f3 nginx-0.3.33-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 619
diff changeset
823
0216fd1471f3 nginx-0.3.33-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 619
diff changeset
824 for (p = handler->data; *p; p++) {
0216fd1471f3 nginx-0.3.33-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 619
diff changeset
825 if (*p != ' ' && *p != '\t' && *p != CR && *p != LF) {
0216fd1471f3 nginx-0.3.33-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 619
diff changeset
826 break;
0216fd1471f3 nginx-0.3.33-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 619
diff changeset
827 }
0216fd1471f3 nginx-0.3.33-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 619
diff changeset
828 }
0216fd1471f3 nginx-0.3.33-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 619
diff changeset
829
3132
6cb238e091a9 allow perl "sub{..."
Igor Sysoev <igor@sysoev.ru>
parents: 3111
diff changeset
830 if (ngx_strncmp(p, "sub ", 4) == 0
6cb238e091a9 allow perl "sub{..."
Igor Sysoev <igor@sysoev.ru>
parents: 3111
diff changeset
831 || ngx_strncmp(p, "sub{", 4) == 0
6cb238e091a9 allow perl "sub{..."
Igor Sysoev <igor@sysoev.ru>
parents: 3111
diff changeset
832 || ngx_strncmp(p, "use ", 4) == 0)
6cb238e091a9 allow perl "sub{..."
Igor Sysoev <igor@sysoev.ru>
parents: 3111
diff changeset
833 {
623
0216fd1471f3 nginx-0.3.33-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 619
diff changeset
834 *sv = eval_pv((char *) p, FALSE);
874
98afa13ea7e5 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 873
diff changeset
835
98afa13ea7e5 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 873
diff changeset
836 /* eval_pv() does not set ERRSV on failure */
98afa13ea7e5 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 873
diff changeset
837
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
838 return;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
839 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
840
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
841 *sv = NULL;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
842 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
843
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
844
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
845 static void *
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
846 ngx_http_perl_create_main_conf(ngx_conf_t *cf)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
847 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
848 ngx_http_perl_main_conf_t *pmcf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
849
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
850 pmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_perl_main_conf_t));
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
851 if (pmcf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
852 return NULL;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
853 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
854
3175
cad19e8e0cc8 allow several perl_modules
Igor Sysoev <igor@sysoev.ru>
parents: 3174
diff changeset
855 pmcf->modules = NGX_CONF_UNSET_PTR;
3174
479fd46cd1c4 use ngx_conf_set_str_array_slot() for perl_require
Igor Sysoev <igor@sysoev.ru>
parents: 3173
diff changeset
856 pmcf->requires = NGX_CONF_UNSET_PTR;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
857
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
858 return pmcf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
859 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
860
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
861
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
862 static char *
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
863 ngx_http_perl_init_main_conf(ngx_conf_t *cf, void *conf)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
864 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
865 ngx_http_perl_main_conf_t *pmcf = conf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
866
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
867 if (pmcf->perl == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
868 if (ngx_http_perl_init_interpreter(cf, pmcf) != NGX_CONF_OK) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
869 return NGX_CONF_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
870 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
871 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
872
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
873 return NGX_CONF_OK;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
874 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
875
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
876
872
1c4a5b3f9110 Axe several perl interpreter instances: they may be useful in currently
Igor Sysoev <igor@sysoev.ru>
parents: 871
diff changeset
877 #if (NGX_HAVE_PERL_MULTIPLICITY)
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
878
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
879 static void
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
880 ngx_http_perl_cleanup_perl(void *data)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
881 {
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
882 PerlInterpreter *perl = data;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
883
873
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
884 PERL_SET_CONTEXT(perl);
6820
eada22643e8b Perl: added PERL_SET_INTERP().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6791
diff changeset
885 PERL_SET_INTERP(perl);
873
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
886
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
887 (void) perl_destruct(perl);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
888
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
889 perl_free(perl);
2715
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
890
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
891 if (ngx_perl_term) {
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
892 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, "perl term");
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
893
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
894 PERL_SYS_TERM();
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
895 }
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
896 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
897
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
898 #endif
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
899
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
900
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
901 static ngx_int_t
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
902 ngx_http_perl_preconfiguration(ngx_conf_t *cf)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
903 {
617
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
904 #if (NGX_HTTP_SSI)
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
905 ngx_int_t rc;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
906 ngx_http_ssi_main_conf_t *smcf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
907
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
908 smcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_ssi_filter_module);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
909
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
910 rc = ngx_hash_add_key(&smcf->commands, &ngx_http_perl_ssi_command.name,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
911 &ngx_http_perl_ssi_command, NGX_HASH_READONLY_KEY);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
912
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
913 if (rc != NGX_OK) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
914 if (rc == NGX_BUSY) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
915 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
916 "conflicting SSI command \"%V\"",
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
917 &ngx_http_perl_ssi_command.name);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
918 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
919
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
920 return NGX_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
921 }
617
51b27717f140 nginx-0.3.30-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 599
diff changeset
922 #endif
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
923
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
924 return NGX_OK;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
925 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
926
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
927
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
928 static void *
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
929 ngx_http_perl_create_loc_conf(ngx_conf_t *cf)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
930 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
931 ngx_http_perl_loc_conf_t *plcf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
932
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
933 plcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_perl_loc_conf_t));
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
934 if (plcf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
935 return NULL;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
936 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
937
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
938 /*
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
939 * set by ngx_pcalloc():
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
940 *
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
941 * plcf->handler = { 0, NULL };
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
942 */
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
943
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
944 return plcf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
945 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
946
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
947
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
948 static char *
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
949 ngx_http_perl_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
950 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
951 ngx_http_perl_loc_conf_t *prev = parent;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
952 ngx_http_perl_loc_conf_t *conf = child;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
953
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
954 if (conf->sub == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
955 conf->sub = prev->sub;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
956 conf->handler = prev->handler;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
957 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
958
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
959 return NGX_CONF_OK;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
960 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
961
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
962
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
963 static char *
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
964 ngx_http_perl(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
965 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
966 ngx_http_perl_loc_conf_t *plcf = conf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
967
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
968 ngx_str_t *value;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
969 ngx_http_core_loc_conf_t *clcf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
970 ngx_http_perl_main_conf_t *pmcf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
971
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
972 value = cf->args->elts;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
973
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
974 if (plcf->handler.data) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
975 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
976 "duplicate perl handler \"%V\"", &value[1]);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
977 return NGX_CONF_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
978 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
979
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
980 pmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_perl_module);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
981
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
982 if (pmcf->perl == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
983 if (ngx_http_perl_init_interpreter(cf, pmcf) != NGX_CONF_OK) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
984 return NGX_CONF_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
985 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
986 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
987
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
988 plcf->handler = value[1];
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
989
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
990 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
991
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
992 dTHXa(pmcf->perl);
873
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
993 PERL_SET_CONTEXT(pmcf->perl);
6820
eada22643e8b Perl: added PERL_SET_INTERP().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6791
diff changeset
994 PERL_SET_INTERP(pmcf->perl);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
995
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
996 ngx_http_perl_eval_anon_sub(aTHX_ &value[1], &plcf->sub);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
997
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
998 if (plcf->sub == &PL_sv_undef) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
999 ngx_conf_log_error(NGX_LOG_ERR, cf, 0,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1000 "eval_pv(\"%V\") failed", &value[1]);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1001 return NGX_CONF_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1002 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1003
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1004 if (plcf->sub == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1005 plcf->sub = newSVpvn((char *) value[1].data, value[1].len);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1006 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1007
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1008 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1009
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1010 clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1011 clcf->handler = ngx_http_perl_handler;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1012
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1013 return NGX_CONF_OK;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1014 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1015
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1016
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1017 static char *
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1018 ngx_http_perl_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1019 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1020 ngx_int_t index;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1021 ngx_str_t *value;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1022 ngx_http_variable_t *v;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1023 ngx_http_perl_variable_t *pv;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1024 ngx_http_perl_main_conf_t *pmcf;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1025
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1026 value = cf->args->elts;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1027
4972
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4963
diff changeset
1028 if (value[1].data[0] != '$') {
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1029 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1030 "invalid variable name \"%V\"", &value[1]);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1031 return NGX_CONF_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1032 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1033
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1034 value[1].len--;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1035 value[1].data++;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1036
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1352
diff changeset
1037 v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1038 if (v == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1039 return NGX_CONF_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1040 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1041
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1042 pv = ngx_palloc(cf->pool, sizeof(ngx_http_perl_variable_t));
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1043 if (pv == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1044 return NGX_CONF_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1045 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1046
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1047 index = ngx_http_get_variable_index(cf, &value[1]);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1048 if (index == NGX_ERROR) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1049 return NGX_CONF_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1050 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1051
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1052 pmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_perl_module);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1053
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1054 if (pmcf->perl == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1055 if (ngx_http_perl_init_interpreter(cf, pmcf) != NGX_CONF_OK) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1056 return NGX_CONF_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1057 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1058 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1059
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1060 pv->handler = value[2];
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1061
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1062 {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1063
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1064 dTHXa(pmcf->perl);
873
f92ad15c2db1 fix segfaults in future workers those will use old configuration,
Igor Sysoev <igor@sysoev.ru>
parents: 872
diff changeset
1065 PERL_SET_CONTEXT(pmcf->perl);
6820
eada22643e8b Perl: added PERL_SET_INTERP().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6791
diff changeset
1066 PERL_SET_INTERP(pmcf->perl);
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1067
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1068 ngx_http_perl_eval_anon_sub(aTHX_ &value[2], &pv->sub);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1069
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1070 if (pv->sub == &PL_sv_undef) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1071 ngx_conf_log_error(NGX_LOG_ERR, cf, 0,
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1072 "eval_pv(\"%V\") failed", &value[2]);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1073 return NGX_CONF_ERROR;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1074 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1075
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1076 if (pv->sub == NULL) {
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1077 pv->sub = newSVpvn((char *) value[2].data, value[2].len);
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1078 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1079
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1080 }
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1081
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 635
diff changeset
1082 v->get_handler = ngx_http_perl_variable;
599
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1083 v->data = (uintptr_t) pv;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1084
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1085 return NGX_CONF_OK;
869b6444d234 nginx-0.3.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1086 }
1221
aa653367028e PERL_SYS_TERM() should be called once on exit only, this fixes the message
Igor Sysoev <igor@sysoev.ru>
parents: 1165
diff changeset
1087
aa653367028e PERL_SYS_TERM() should be called once on exit only, this fixes the message
Igor Sysoev <igor@sysoev.ru>
parents: 1165
diff changeset
1088
1257
927b06411194 set worker's perl $$
Igor Sysoev <igor@sysoev.ru>
parents: 1221
diff changeset
1089 static ngx_int_t
927b06411194 set worker's perl $$
Igor Sysoev <igor@sysoev.ru>
parents: 1221
diff changeset
1090 ngx_http_perl_init_worker(ngx_cycle_t *cycle)
927b06411194 set worker's perl $$
Igor Sysoev <igor@sysoev.ru>
parents: 1221
diff changeset
1091 {
1258
5076d97b9cf0 fix building on threaded or multiplicity interpreter perl,
Igor Sysoev <igor@sysoev.ru>
parents: 1257
diff changeset
1092 ngx_http_perl_main_conf_t *pmcf;
5076d97b9cf0 fix building on threaded or multiplicity interpreter perl,
Igor Sysoev <igor@sysoev.ru>
parents: 1257
diff changeset
1093
5076d97b9cf0 fix building on threaded or multiplicity interpreter perl,
Igor Sysoev <igor@sysoev.ru>
parents: 1257
diff changeset
1094 pmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_perl_module);
5076d97b9cf0 fix building on threaded or multiplicity interpreter perl,
Igor Sysoev <igor@sysoev.ru>
parents: 1257
diff changeset
1095
2713
b4d8aef4a1ad fix segfault if no http section is defined in confguraiton,
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
1096 if (pmcf) {
b4d8aef4a1ad fix segfault if no http section is defined in confguraiton,
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
1097 dTHXa(pmcf->perl);
b4d8aef4a1ad fix segfault if no http section is defined in confguraiton,
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
1098 PERL_SET_CONTEXT(pmcf->perl);
6820
eada22643e8b Perl: added PERL_SET_INTERP().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6791
diff changeset
1099 PERL_SET_INTERP(pmcf->perl);
1258
5076d97b9cf0 fix building on threaded or multiplicity interpreter perl,
Igor Sysoev <igor@sysoev.ru>
parents: 1257
diff changeset
1100
2713
b4d8aef4a1ad fix segfault if no http section is defined in confguraiton,
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
1101 /* set worker's $$ */
1257
927b06411194 set worker's perl $$
Igor Sysoev <igor@sysoev.ru>
parents: 1221
diff changeset
1102
2713
b4d8aef4a1ad fix segfault if no http section is defined in confguraiton,
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
1103 sv_setiv(GvSV(gv_fetchpv("$", TRUE, SVt_PV)), (I32) ngx_pid);
1258
5076d97b9cf0 fix building on threaded or multiplicity interpreter perl,
Igor Sysoev <igor@sysoev.ru>
parents: 1257
diff changeset
1104 }
5076d97b9cf0 fix building on threaded or multiplicity interpreter perl,
Igor Sysoev <igor@sysoev.ru>
parents: 1257
diff changeset
1105
1257
927b06411194 set worker's perl $$
Igor Sysoev <igor@sysoev.ru>
parents: 1221
diff changeset
1106 return NGX_OK;
927b06411194 set worker's perl $$
Igor Sysoev <igor@sysoev.ru>
parents: 1221
diff changeset
1107 }
927b06411194 set worker's perl $$
Igor Sysoev <igor@sysoev.ru>
parents: 1221
diff changeset
1108
1941
0e7deac300f1 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1940
diff changeset
1109
1221
aa653367028e PERL_SYS_TERM() should be called once on exit only, this fixes the message
Igor Sysoev <igor@sysoev.ru>
parents: 1165
diff changeset
1110 static void
aa653367028e PERL_SYS_TERM() should be called once on exit only, this fixes the message
Igor Sysoev <igor@sysoev.ru>
parents: 1165
diff changeset
1111 ngx_http_perl_exit(ngx_cycle_t *cycle)
aa653367028e PERL_SYS_TERM() should be called once on exit only, this fixes the message
Igor Sysoev <igor@sysoev.ru>
parents: 1165
diff changeset
1112 {
2715
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
1113 #if (NGX_HAVE_PERL_MULTIPLICITY)
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
1114
3351
b759cf8f6000 add comment from r2716 commit message
Igor Sysoev <igor@sysoev.ru>
parents: 3350
diff changeset
1115 /*
b759cf8f6000 add comment from r2716 commit message
Igor Sysoev <igor@sysoev.ru>
parents: 3350
diff changeset
1116 * the master exit hook is run before global pool cleanup,
b759cf8f6000 add comment from r2716 commit message
Igor Sysoev <igor@sysoev.ru>
parents: 3350
diff changeset
1117 * therefore just set flag here
b759cf8f6000 add comment from r2716 commit message
Igor Sysoev <igor@sysoev.ru>
parents: 3350
diff changeset
1118 */
b759cf8f6000 add comment from r2716 commit message
Igor Sysoev <igor@sysoev.ru>
parents: 3350
diff changeset
1119
2715
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
1120 ngx_perl_term = 1;
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
1121
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
1122 #else
3351
b759cf8f6000 add comment from r2716 commit message
Igor Sysoev <igor@sysoev.ru>
parents: 3350
diff changeset
1123
3350
67da53a19e02 use global perl variable in perl_destruct()/perl_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3175
diff changeset
1124 if (nginx_stash) {
2715
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
1125 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cycle->log, 0, "perl term");
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
1126
3350
67da53a19e02 use global perl variable in perl_destruct()/perl_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3175
diff changeset
1127 (void) perl_destruct(perl);
2715
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
1128
3350
67da53a19e02 use global perl variable in perl_destruct()/perl_free()
Igor Sysoev <igor@sysoev.ru>
parents: 3175
diff changeset
1129 perl_free(perl);
1946
171a283af56b some perl builds require my_perl for PERL_SYS_TERM()
Igor Sysoev <igor@sysoev.ru>
parents: 1941
diff changeset
1130
2714
4dd1773990db fix segfault on exit if no http section is defined in confguraiton,
Igor Sysoev <igor@sysoev.ru>
parents: 2713
diff changeset
1131 PERL_SYS_TERM();
1946
171a283af56b some perl builds require my_perl for PERL_SYS_TERM()
Igor Sysoev <igor@sysoev.ru>
parents: 1941
diff changeset
1132 }
2715
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
1133
a5845475a903 perl termination fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 2714
diff changeset
1134 #endif
1221
aa653367028e PERL_SYS_TERM() should be called once on exit only, this fixes the message
Igor Sysoev <igor@sysoev.ru>
parents: 1165
diff changeset
1135 }