Mercurial > hg > nginx
annotate src/http/modules/perl/nginx.xs @ 7525:575480d3fd01
Perl: propagate errors.
When an error happens, the ctx->error bit is now set, and croak()
is called to terminate further processing. The ctx->error bit is
checked in ngx_http_perl_call_handler() to cancel further processing,
and is also checked in various output functions - to make sure these won't
be called if croak() was handled by an eval{} in perl code.
In particular, this ensures that output chain won't be called after
errors, as filters might not expect this to happen. This fixes some
segmentation faults under low memory conditions. Also this stops
request processing after filter finalization or request body reading
errors.
For cases where an HTTP error status can be additionally returned (for
example, 416 (Requested Range Not Satisfiable) from the range filter),
the ctx->status field is also added.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Fri, 12 Jul 2019 13:56:21 +0300 |
parents | deebe988cbd7 |
children | 8125552a10ca |
rev | line source |
---|---|
599 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4412 | 4 * Copyright (C) Nginx, Inc. |
599 | 5 */ |
6 | |
7 | |
882
26c3e48b9996
the PERL_NO_GET_CONTEXT is actually required, see perlguts
Igor Sysoev <igor@sysoev.ru>
parents:
869
diff
changeset
|
8 #define PERL_NO_GET_CONTEXT |
26c3e48b9996
the PERL_NO_GET_CONTEXT is actually required, see perlguts
Igor Sysoev <igor@sysoev.ru>
parents:
869
diff
changeset
|
9 |
599 | 10 #include <ngx_config.h> |
11 #include <ngx_core.h> | |
12 #include <ngx_http.h> | |
13 #include <ngx_http_perl_module.h> | |
14 | |
603 | 15 #include "XSUB.h" |
16 | |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
17 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
18 #define ngx_http_perl_set_request(r, ctx) \ |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
19 \ |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
20 ctx = INT2PTR(ngx_http_perl_ctx_t *, SvIV((SV *) SvRV(ST(0)))); \ |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
21 r = ctx->request |
633 | 22 |
23 | |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
24 #define ngx_http_perl_set_targ(p, len) \ |
633 | 25 \ |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
26 SvUPGRADE(TARG, SVt_PV); \ |
633 | 27 SvPOK_on(TARG); \ |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
28 sv_setpvn(TARG, (char *) p, len) |
633 | 29 |
599 | 30 |
31 static ngx_int_t | |
32 ngx_http_perl_sv2str(pTHX_ ngx_http_request_t *r, ngx_str_t *s, SV *sv) | |
33 { | |
34 u_char *p; | |
35 STRLEN len; | |
36 | |
37 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) { | |
38 sv = SvRV(sv); | |
39 } | |
40 | |
41 p = (u_char *) SvPV(sv, len); | |
42 | |
43 s->len = len; | |
44 | |
1703
43747661804d
*) copy regex captures $1, $2, etc.
Igor Sysoev <igor@sysoev.ru>
parents:
1565
diff
changeset
|
45 if (SvREADONLY(sv) && SvPOK(sv)) { |
599 | 46 s->data = p; |
1703
43747661804d
*) copy regex captures $1, $2, etc.
Igor Sysoev <igor@sysoev.ru>
parents:
1565
diff
changeset
|
47 |
43747661804d
*) copy regex captures $1, $2, etc.
Igor Sysoev <igor@sysoev.ru>
parents:
1565
diff
changeset
|
48 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
43747661804d
*) copy regex captures $1, $2, etc.
Igor Sysoev <igor@sysoev.ru>
parents:
1565
diff
changeset
|
49 "perl sv2str: %08XD \"%V\"", sv->sv_flags, s); |
43747661804d
*) copy regex captures $1, $2, etc.
Igor Sysoev <igor@sysoev.ru>
parents:
1565
diff
changeset
|
50 |
599 | 51 return NGX_OK; |
52 } | |
53 | |
2049 | 54 s->data = ngx_pnalloc(r->pool, len); |
599 | 55 if (s->data == NULL) { |
56 return NGX_ERROR; | |
57 } | |
58 | |
59 ngx_memcpy(s->data, p, len); | |
60 | |
1703
43747661804d
*) copy regex captures $1, $2, etc.
Igor Sysoev <igor@sysoev.ru>
parents:
1565
diff
changeset
|
61 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
43747661804d
*) copy regex captures $1, $2, etc.
Igor Sysoev <igor@sysoev.ru>
parents:
1565
diff
changeset
|
62 "perl sv2str: %08XD \"%V\"", sv->sv_flags, s); |
43747661804d
*) copy regex captures $1, $2, etc.
Igor Sysoev <igor@sysoev.ru>
parents:
1565
diff
changeset
|
63 |
599 | 64 return NGX_OK; |
65 } | |
66 | |
67 | |
68 static ngx_int_t | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
69 ngx_http_perl_output(ngx_http_request_t *r, ngx_http_perl_ctx_t *ctx, |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
70 ngx_buf_t *b) |
599 | 71 { |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
72 ngx_chain_t out; |
617 | 73 #if (NGX_HTTP_SSI) |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
74 ngx_chain_t *cl; |
599 | 75 |
76 if (ctx->ssi) { | |
77 cl = ngx_alloc_chain_link(r->pool); | |
78 if (cl == NULL) { | |
79 return NGX_ERROR; | |
80 } | |
81 | |
82 cl->buf = b; | |
83 cl->next = NULL; | |
84 *ctx->ssi->last_out = cl; | |
85 ctx->ssi->last_out = &cl->next; | |
86 | |
87 return NGX_OK; | |
88 } | |
617 | 89 #endif |
599 | 90 |
91 out.buf = b; | |
92 out.next = NULL; | |
93 | |
94 return ngx_http_output_filter(r, &out); | |
95 } | |
96 | |
97 | |
98 MODULE = nginx PACKAGE = nginx | |
99 | |
100 | |
6233
c6cc0b79a43d
Perl: prototyping behavior explicitly specified.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6232
diff
changeset
|
101 PROTOTYPES: DISABLE |
c6cc0b79a43d
Perl: prototyping behavior explicitly specified.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6232
diff
changeset
|
102 |
c6cc0b79a43d
Perl: prototyping behavior explicitly specified.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6232
diff
changeset
|
103 |
633 | 104 void |
915 | 105 status(r, code) |
106 CODE: | |
107 | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
108 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
109 ngx_http_perl_ctx_t *ctx; |
915 | 110 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
111 ngx_http_perl_set_request(r, ctx); |
915 | 112 |
113 r->headers_out.status = SvIV(ST(1)); | |
114 | |
115 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
116 "perl status: %d", r->headers_out.status); | |
117 | |
118 XSRETURN_UNDEF; | |
119 | |
120 | |
121 void | |
599 | 122 send_http_header(r, ...) |
633 | 123 CODE: |
599 | 124 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
125 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
126 ngx_http_perl_ctx_t *ctx; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
127 SV *sv; |
7525 | 128 ngx_int_t rc; |
599 | 129 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
130 ngx_http_perl_set_request(r, ctx); |
599 | 131 |
7525 | 132 if (ctx->error) { |
133 croak("send_http_header(): called after error"); | |
134 } | |
135 | |
599 | 136 if (r->headers_out.status == 0) { |
137 r->headers_out.status = NGX_HTTP_OK; | |
138 } | |
139 | |
140 if (items != 1) { | |
141 sv = ST(1); | |
142 | |
143 if (ngx_http_perl_sv2str(aTHX_ r, &r->headers_out.content_type, sv) | |
144 != NGX_OK) | |
145 { | |
633 | 146 XSRETURN_EMPTY; |
599 | 147 } |
148 | |
1444
37938e68910b
allow to append charset to the "Content-Type" header
Igor Sysoev <igor@sysoev.ru>
parents:
1372
diff
changeset
|
149 r->headers_out.content_type_len = r->headers_out.content_type.len; |
37938e68910b
allow to append charset to the "Content-Type" header
Igor Sysoev <igor@sysoev.ru>
parents:
1372
diff
changeset
|
150 |
599 | 151 } else { |
673 | 152 if (ngx_http_set_content_type(r) != NGX_OK) { |
153 XSRETURN_EMPTY; | |
599 | 154 } |
155 } | |
156 | |
7516
36c52a0f6ded
Perl: disabled not_modified filter (ticket #1786).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6986
diff
changeset
|
157 r->disable_not_modified = 1; |
36c52a0f6ded
Perl: disabled not_modified filter (ticket #1786).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6986
diff
changeset
|
158 |
7525 | 159 rc = ngx_http_send_header(r); |
160 | |
161 if (rc == NGX_ERROR || rc > NGX_OK) { | |
162 ctx->error = 1; | |
163 ctx->status = rc; | |
164 croak("ngx_http_send_header() failed"); | |
165 } | |
599 | 166 |
167 | |
633 | 168 void |
169 header_only(r) | |
599 | 170 CODE: |
171 | |
633 | 172 dXSTARG; |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
173 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
174 ngx_http_perl_ctx_t *ctx; |
633 | 175 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
176 ngx_http_perl_set_request(r, ctx); |
599 | 177 |
633 | 178 sv_upgrade(TARG, SVt_IV); |
179 sv_setiv(TARG, r->header_only); | |
599 | 180 |
633 | 181 ST(0) = TARG; |
599 | 182 |
183 | |
633 | 184 void |
185 uri(r) | |
186 CODE: | |
187 | |
188 dXSTARG; | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
189 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
190 ngx_http_perl_ctx_t *ctx; |
599 | 191 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
192 ngx_http_perl_set_request(r, ctx); |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
193 ngx_http_perl_set_targ(r->uri.data, r->uri.len); |
633 | 194 |
195 ST(0) = TARG; | |
196 | |
197 | |
198 void | |
199 args(r) | |
599 | 200 CODE: |
201 | |
633 | 202 dXSTARG; |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
203 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
204 ngx_http_perl_ctx_t *ctx; |
599 | 205 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
206 ngx_http_perl_set_request(r, ctx); |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
207 ngx_http_perl_set_targ(r->args.data, r->args.len); |
599 | 208 |
633 | 209 ST(0) = TARG; |
599 | 210 |
211 | |
633 | 212 void |
629 | 213 request_method(r) |
633 | 214 CODE: |
215 | |
216 dXSTARG; | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
217 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
218 ngx_http_perl_ctx_t *ctx; |
629 | 219 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
220 ngx_http_perl_set_request(r, ctx); |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
221 ngx_http_perl_set_targ(r->method_name.data, r->method_name.len); |
633 | 222 |
223 ST(0) = TARG; | |
224 | |
225 | |
226 void | |
227 remote_addr(r) | |
629 | 228 CODE: |
229 | |
633 | 230 dXSTARG; |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
231 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
232 ngx_http_perl_ctx_t *ctx; |
629 | 233 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
234 ngx_http_perl_set_request(r, ctx); |
633 | 235 ngx_http_perl_set_targ(r->connection->addr_text.data, |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
236 r->connection->addr_text.len); |
629 | 237 |
633 | 238 ST(0) = TARG; |
629 | 239 |
240 | |
633 | 241 void |
242 header_in(r, key) | |
629 | 243 CODE: |
244 | |
633 | 245 dXSTARG; |
667 | 246 ngx_http_request_t *r; |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
247 ngx_http_perl_ctx_t *ctx; |
667 | 248 SV *key; |
5248
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
249 u_char *p, *lowcase_key, *value, sep; |
667 | 250 STRLEN len; |
251 ssize_t size; | |
252 ngx_uint_t i, n, hash; | |
5248
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
253 ngx_array_t *a; |
667 | 254 ngx_list_part_t *part; |
255 ngx_table_elt_t *h, **ph; | |
256 ngx_http_header_t *hh; | |
257 ngx_http_core_main_conf_t *cmcf; | |
629 | 258 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
259 ngx_http_perl_set_request(r, ctx); |
599 | 260 |
633 | 261 key = ST(1); |
599 | 262 |
263 if (SvROK(key) && SvTYPE(SvRV(key)) == SVt_PV) { | |
264 key = SvRV(key); | |
265 } | |
266 | |
267 p = (u_char *) SvPV(key, len); | |
268 | |
667 | 269 /* look up hashed headers */ |
270 | |
2049 | 271 lowcase_key = ngx_pnalloc(r->pool, len); |
667 | 272 if (lowcase_key == NULL) { |
273 XSRETURN_UNDEF; | |
274 } | |
275 | |
2136 | 276 hash = ngx_hash_strlow(lowcase_key, p, len); |
667 | 277 |
278 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); | |
279 | |
280 hh = ngx_hash_find(&cmcf->headers_in_hash, hash, lowcase_key, len); | |
281 | |
282 if (hh) { | |
5248
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
283 |
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
284 if (hh->offset == offsetof(ngx_http_headers_in_t, cookies)) { |
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
285 sep = ';'; |
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
286 goto multi; |
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
287 } |
5306
43900b822890
Perl: fixed syntax usage for C preprocessor directives.
Sergey Kandaurov <pluknet@nginx.com>
parents:
5248
diff
changeset
|
288 #if (NGX_HTTP_X_FORWARDED_FOR) |
5248
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
289 if (hh->offset == offsetof(ngx_http_headers_in_t, x_forwarded_for)) { |
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
290 sep = ','; |
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
291 goto multi; |
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
292 } |
5306
43900b822890
Perl: fixed syntax usage for C preprocessor directives.
Sergey Kandaurov <pluknet@nginx.com>
parents:
5248
diff
changeset
|
293 #endif |
5248
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
294 |
6232
5f2a0739da19
Perl: fixed warning about "sep" may be used uninitialized.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5306
diff
changeset
|
295 ph = (ngx_table_elt_t **) ((char *) &r->headers_in + hh->offset); |
667 | 296 |
6232
5f2a0739da19
Perl: fixed warning about "sep" may be used uninitialized.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5306
diff
changeset
|
297 if (*ph) { |
5f2a0739da19
Perl: fixed warning about "sep" may be used uninitialized.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5306
diff
changeset
|
298 ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len); |
667 | 299 |
6232
5f2a0739da19
Perl: fixed warning about "sep" may be used uninitialized.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5306
diff
changeset
|
300 goto done; |
5f2a0739da19
Perl: fixed warning about "sep" may be used uninitialized.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5306
diff
changeset
|
301 } |
667 | 302 |
6232
5f2a0739da19
Perl: fixed warning about "sep" may be used uninitialized.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5306
diff
changeset
|
303 XSRETURN_UNDEF; |
667 | 304 |
5248
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
305 multi: |
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
306 |
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
307 /* Cookie, X-Forwarded-For */ |
667 | 308 |
5248
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
309 a = (ngx_array_t *) ((char *) &r->headers_in + hh->offset); |
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
310 |
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
311 n = a->nelts; |
667 | 312 |
313 if (n == 0) { | |
314 XSRETURN_UNDEF; | |
315 } | |
316 | |
5248
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
317 ph = a->elts; |
667 | 318 |
319 if (n == 1) { | |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
320 ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len); |
667 | 321 |
322 goto done; | |
323 } | |
324 | |
325 size = - (ssize_t) (sizeof("; ") - 1); | |
326 | |
327 for (i = 0; i < n; i++) { | |
328 size += ph[i]->value.len + sizeof("; ") - 1; | |
329 } | |
330 | |
5248
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
331 value = ngx_pnalloc(r->pool, size); |
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
332 if (value == NULL) { |
667 | 333 XSRETURN_UNDEF; |
334 } | |
335 | |
5248
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
336 p = value; |
667 | 337 |
338 for (i = 0; /* void */ ; i++) { | |
339 p = ngx_copy(p, ph[i]->value.data, ph[i]->value.len); | |
340 | |
341 if (i == n - 1) { | |
342 break; | |
343 } | |
344 | |
5248
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
345 *p++ = sep; *p++ = ' '; |
667 | 346 } |
347 | |
5248
f5626ab8cb87
Perl: fixed r->header_in("Cookie") (ticket #351).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5198
diff
changeset
|
348 ngx_http_perl_set_targ(value, size); |
667 | 349 |
350 goto done; | |
351 } | |
352 | |
353 /* iterate over all headers */ | |
354 | |
599 | 355 part = &r->headers_in.headers.part; |
667 | 356 h = part->elts; |
599 | 357 |
358 for (i = 0; /* void */ ; i++) { | |
359 | |
360 if (i >= part->nelts) { | |
361 if (part->next == NULL) { | |
362 break; | |
363 } | |
364 | |
365 part = part->next; | |
667 | 366 h = part->elts; |
599 | 367 i = 0; |
368 } | |
369 | |
667 | 370 if (len != h[i].key.len |
371 || ngx_strcasecmp(p, h[i].key.data) != 0) | |
599 | 372 { |
373 continue; | |
374 } | |
375 | |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
376 ngx_http_perl_set_targ(h[i].value.data, h[i].value.len); |
599 | 377 |
378 goto done; | |
379 } | |
380 | |
381 XSRETURN_UNDEF; | |
382 | |
383 done: | |
384 | |
633 | 385 ST(0) = TARG; |
599 | 386 |
387 | |
633 | 388 void |
681 | 389 has_request_body(r, next) |
390 CODE: | |
391 | |
392 dXSTARG; | |
393 ngx_http_request_t *r; | |
394 ngx_http_perl_ctx_t *ctx; | |
7525 | 395 ngx_int_t rc; |
681 | 396 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
397 ngx_http_perl_set_request(r, ctx); |
681 | 398 |
5181
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
399 if (r->headers_in.content_length_n <= 0 && !r->headers_in.chunked) { |
681 | 400 XSRETURN_UNDEF; |
401 } | |
402 | |
909 | 403 ctx->next = SvRV(ST(1)); |
681 | 404 |
405 r->request_body_in_single_buf = 1; | |
406 r->request_body_in_persistent_file = 1; | |
1075
4d203f76b757
undo "client_body_in_file_only any"
Igor Sysoev <igor@sysoev.ru>
parents:
1056
diff
changeset
|
407 r->request_body_in_clean_file = 1; |
681 | 408 |
409 if (r->request_body_in_file_only) { | |
410 r->request_body_file_log_level = 0; | |
411 } | |
412 | |
7525 | 413 rc = ngx_http_read_client_request_body(r, ngx_http_perl_handle_request); |
414 | |
415 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { | |
416 ctx->error = 1; | |
417 ctx->status = rc; | |
418 ctx->next = NULL; | |
419 croak("ngx_http_read_client_request_body() failed"); | |
420 } | |
681 | 421 |
422 sv_upgrade(TARG, SVt_IV); | |
423 sv_setiv(TARG, 1); | |
424 | |
425 ST(0) = TARG; | |
426 | |
427 | |
428 void | |
631 | 429 request_body(r) |
430 CODE: | |
431 | |
633 | 432 dXSTARG; |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
433 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
434 ngx_http_perl_ctx_t *ctx; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
435 u_char *p, *data; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
436 size_t len; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
437 ngx_buf_t *buf; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
438 ngx_chain_t *cl; |
633 | 439 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
440 ngx_http_perl_set_request(r, ctx); |
631 | 441 |
941 | 442 if (r->request_body == NULL |
443 || r->request_body->temp_file | |
444 || r->request_body->bufs == NULL) | |
445 { | |
633 | 446 XSRETURN_UNDEF; |
447 } | |
631 | 448 |
5181
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
449 cl = r->request_body->bufs; |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
450 buf = cl->buf; |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
451 |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
452 if (cl->next == NULL) { |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
453 len = buf->last - buf->pos; |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
454 data = buf->pos; |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
455 goto done; |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
456 } |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
457 |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
458 len = buf->last - buf->pos; |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
459 cl = cl->next; |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
460 |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
461 for ( /* void */ ; cl; cl = cl->next) { |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
462 buf = cl->buf; |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
463 len += buf->last - buf->pos; |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
464 } |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
465 |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
466 p = ngx_pnalloc(r->pool, len); |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
467 if (p == NULL) { |
5198
e530b88b088b
Perl: extra "return" removed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5181
diff
changeset
|
468 XSRETURN_UNDEF; |
5181
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
469 } |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
470 |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
471 data = p; |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
472 cl = r->request_body->bufs; |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
473 |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
474 for ( /* void */ ; cl; cl = cl->next) { |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
475 buf = cl->buf; |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
476 p = ngx_cpymem(p, buf->pos, buf->last - buf->pos); |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
477 } |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
478 |
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
479 done: |
631 | 480 |
481 if (len == 0) { | |
482 XSRETURN_UNDEF; | |
483 } | |
484 | |
5181
4d0ac175f6e4
Perl: request body handling fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4644
diff
changeset
|
485 ngx_http_perl_set_targ(data, len); |
631 | 486 |
633 | 487 ST(0) = TARG; |
631 | 488 |
489 | |
633 | 490 void |
491 request_body_file(r) | |
492 CODE: | |
493 | |
494 dXSTARG; | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
495 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
496 ngx_http_perl_ctx_t *ctx; |
633 | 497 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
498 ngx_http_perl_set_request(r, ctx); |
633 | 499 |
941 | 500 if (r->request_body == NULL || r->request_body->temp_file == NULL) { |
633 | 501 XSRETURN_UNDEF; |
502 } | |
503 | |
504 ngx_http_perl_set_targ(r->request_body->temp_file->file.name.data, | |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
505 r->request_body->temp_file->file.name.len); |
599 | 506 |
633 | 507 ST(0) = TARG; |
508 | |
509 | |
510 void | |
1371 | 511 discard_request_body(r) |
512 CODE: | |
513 | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
514 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
515 ngx_http_perl_ctx_t *ctx; |
7525 | 516 ngx_int_t rc; |
1371 | 517 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
518 ngx_http_perl_set_request(r, ctx); |
1371 | 519 |
7525 | 520 rc = ngx_http_discard_request_body(r); |
521 | |
522 if (rc != NGX_OK) { | |
523 ctx->error = 1; | |
524 ctx->status = rc; | |
525 croak("ngx_http_discard_request_body() failed"); | |
526 } | |
1371 | 527 |
528 | |
529 void | |
633 | 530 header_out(r, key, value) |
531 CODE: | |
599 | 532 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
533 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
534 ngx_http_perl_ctx_t *ctx; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
535 SV *key; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
536 SV *value; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
537 ngx_table_elt_t *header; |
599 | 538 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
539 ngx_http_perl_set_request(r, ctx); |
633 | 540 |
7525 | 541 if (ctx->error) { |
542 croak("header_out(): called after error"); | |
543 } | |
544 | |
633 | 545 key = ST(1); |
546 value = ST(2); | |
599 | 547 |
548 header = ngx_list_push(&r->headers_out.headers); | |
549 if (header == NULL) { | |
633 | 550 XSRETURN_EMPTY; |
599 | 551 } |
552 | |
553 header->hash = 1; | |
554 | |
555 if (ngx_http_perl_sv2str(aTHX_ r, &header->key, key) != NGX_OK) { | |
6986
0cdee26605f3
Cleaned up r->headers_out.headers allocation error handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
6960
diff
changeset
|
556 header->hash = 0; |
633 | 557 XSRETURN_EMPTY; |
599 | 558 } |
559 | |
560 if (ngx_http_perl_sv2str(aTHX_ r, &header->value, value) != NGX_OK) { | |
6986
0cdee26605f3
Cleaned up r->headers_out.headers allocation error handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
6960
diff
changeset
|
561 header->hash = 0; |
633 | 562 XSRETURN_EMPTY; |
599 | 563 } |
564 | |
565 if (header->key.len == sizeof("Content-Length") - 1 | |
3870 | 566 && ngx_strncasecmp(header->key.data, (u_char *) "Content-Length", |
741
63a08390a8a2
$r->headers_out("Content-Length", "NNN") did not work
Igor Sysoev <igor@sysoev.ru>
parents:
681
diff
changeset
|
567 sizeof("Content-Length") - 1) == 0) |
599 | 568 { |
741
63a08390a8a2
$r->headers_out("Content-Length", "NNN") did not work
Igor Sysoev <igor@sysoev.ru>
parents:
681
diff
changeset
|
569 r->headers_out.content_length_n = (off_t) SvIV(value); |
599 | 570 r->headers_out.content_length = header; |
571 } | |
572 | |
4196
190ae1a7f917
Handling of Content-Encoding set from perl.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4188
diff
changeset
|
573 if (header->key.len == sizeof("Content-Encoding") - 1 |
4644
95763fce86a8
Fixed warning during nginx.xs compilation.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4494
diff
changeset
|
574 && ngx_strncasecmp(header->key.data, (u_char *) "Content-Encoding", |
4196
190ae1a7f917
Handling of Content-Encoding set from perl.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4188
diff
changeset
|
575 sizeof("Content-Encoding") - 1) == 0) |
190ae1a7f917
Handling of Content-Encoding set from perl.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4188
diff
changeset
|
576 { |
190ae1a7f917
Handling of Content-Encoding set from perl.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4188
diff
changeset
|
577 r->headers_out.content_encoding = header; |
190ae1a7f917
Handling of Content-Encoding set from perl.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4188
diff
changeset
|
578 } |
190ae1a7f917
Handling of Content-Encoding set from perl.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4188
diff
changeset
|
579 |
599 | 580 |
633 | 581 void |
599 | 582 filename(r) |
633 | 583 CODE: |
599 | 584 |
633 | 585 dXSTARG; |
586 ngx_http_request_t *r; | |
599 | 587 ngx_http_perl_ctx_t *ctx; |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
588 size_t root; |
599 | 589 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
590 ngx_http_perl_set_request(r, ctx); |
599 | 591 |
633 | 592 if (ctx->filename.data) { |
599 | 593 goto done; |
594 } | |
595 | |
774
589841f06b87
previous commit broke two modules
Igor Sysoev <igor@sysoev.ru>
parents:
741
diff
changeset
|
596 if (ngx_http_map_uri_to_path(r, &ctx->filename, &root, 0) == NULL) { |
599 | 597 XSRETURN_UNDEF; |
598 } | |
599 | |
633 | 600 ctx->filename.len--; |
601 sv_setpv(PL_statname, (char *) ctx->filename.data); | |
599 | 602 |
603 done: | |
604 | |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
605 ngx_http_perl_set_targ(ctx->filename.data, ctx->filename.len); |
599 | 606 |
633 | 607 ST(0) = TARG; |
599 | 608 |
609 | |
633 | 610 void |
599 | 611 print(r, ...) |
612 CODE: | |
613 | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
614 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
615 ngx_http_perl_ctx_t *ctx; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
616 SV *sv; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
617 int i; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
618 u_char *p; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
619 size_t size; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
620 STRLEN len; |
7525 | 621 ngx_int_t rc; |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
622 ngx_buf_t *b; |
633 | 623 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
624 ngx_http_perl_set_request(r, ctx); |
599 | 625 |
7525 | 626 if (ctx->error) { |
627 croak("print(): called after error"); | |
628 } | |
629 | |
599 | 630 if (items == 2) { |
631 | |
632 /* | |
633 * do zero copy for prolate single read-only SV: | |
634 * $r->print("some text\n"); | |
635 */ | |
636 | |
637 sv = ST(1); | |
638 | |
639 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) { | |
640 sv = SvRV(sv); | |
641 } | |
642 | |
1703
43747661804d
*) copy regex captures $1, $2, etc.
Igor Sysoev <igor@sysoev.ru>
parents:
1565
diff
changeset
|
643 if (SvREADONLY(sv) && SvPOK(sv)) { |
599 | 644 |
645 p = (u_char *) SvPV(sv, len); | |
646 | |
647 if (len == 0) { | |
633 | 648 XSRETURN_EMPTY; |
599 | 649 } |
650 | |
651 b = ngx_calloc_buf(r->pool); | |
652 if (b == NULL) { | |
633 | 653 XSRETURN_EMPTY; |
599 | 654 } |
655 | |
656 b->memory = 1; | |
657 b->pos = p; | |
658 b->last = p + len; | |
659 b->start = p; | |
660 b->end = b->last; | |
661 | |
601 | 662 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
663 "$r->print: read-only SV: %z", len); | |
664 | |
599 | 665 goto out; |
666 } | |
667 } | |
668 | |
669 size = 0; | |
670 | |
671 for (i = 1; i < items; i++) { | |
672 | |
673 sv = ST(i); | |
674 | |
675 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) { | |
676 sv = SvRV(sv); | |
677 } | |
678 | |
601 | 679 (void) SvPV(sv, len); |
599 | 680 |
601 | 681 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
682 "$r->print: copy SV: %z", len); | |
599 | 683 |
684 size += len; | |
685 } | |
686 | |
687 if (size == 0) { | |
633 | 688 XSRETURN_EMPTY; |
599 | 689 } |
690 | |
691 b = ngx_create_temp_buf(r->pool, size); | |
692 if (b == NULL) { | |
633 | 693 XSRETURN_EMPTY; |
599 | 694 } |
695 | |
696 for (i = 1; i < items; i++) { | |
697 sv = ST(i); | |
698 | |
699 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) { | |
700 sv = SvRV(sv); | |
701 } | |
702 | |
703 p = (u_char *) SvPV(sv, len); | |
704 b->last = ngx_cpymem(b->last, p, len); | |
705 } | |
706 | |
707 out: | |
708 | |
7525 | 709 rc = ngx_http_perl_output(r, ctx, b); |
710 | |
711 if (rc == NGX_ERROR) { | |
712 ctx->error = 1; | |
713 croak("ngx_http_perl_output() failed"); | |
714 } | |
599 | 715 |
716 | |
633 | 717 void |
613 | 718 sendfile(r, filename, offset = -1, bytes = 0) |
633 | 719 CODE: |
720 | |
1454 | 721 ngx_http_request_t *r; |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
722 ngx_http_perl_ctx_t *ctx; |
1454 | 723 char *filename; |
2794
92bd6afe8d9c
use off_t in $r->sendfile(), this allows to use 64-bit off_t on platforms
Igor Sysoev <igor@sysoev.ru>
parents:
2756
diff
changeset
|
724 off_t offset; |
1454 | 725 size_t bytes; |
7525 | 726 ngx_int_t rc; |
1454 | 727 ngx_str_t path; |
728 ngx_buf_t *b; | |
729 ngx_open_file_info_t of; | |
730 ngx_http_core_loc_conf_t *clcf; | |
599 | 731 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
732 ngx_http_perl_set_request(r, ctx); |
633 | 733 |
7525 | 734 if (ctx->error) { |
735 croak("sendfile(): called after error"); | |
736 } | |
737 | |
633 | 738 filename = SvPV_nolen(ST(1)); |
599 | 739 |
740 if (filename == NULL) { | |
741 croak("sendfile(): NULL filename"); | |
742 } | |
743 | |
633 | 744 offset = items < 3 ? -1 : SvIV(ST(2)); |
745 bytes = items < 4 ? 0 : SvIV(ST(3)); | |
746 | |
599 | 747 b = ngx_calloc_buf(r->pool); |
748 if (b == NULL) { | |
633 | 749 XSRETURN_EMPTY; |
599 | 750 } |
751 | |
752 b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t)); | |
753 if (b->file == NULL) { | |
633 | 754 XSRETURN_EMPTY; |
599 | 755 } |
756 | |
1454 | 757 path.len = ngx_strlen(filename); |
758 | |
2061
b0a1c84725cf
change useless ngx_pcalloc() to ngx_pnalloc()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
759 path.data = ngx_pnalloc(r->pool, path.len + 1); |
1454 | 760 if (path.data == NULL) { |
633 | 761 XSRETURN_EMPTY; |
599 | 762 } |
763 | |
3870 | 764 (void) ngx_cpystrn(path.data, (u_char *) filename, path.len + 1); |
1560
25ee6eee7573
style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents:
1457
diff
changeset
|
765 |
2063
67a29af877ed
initialize of.uniq in ngx_open_cached_file()
Igor Sysoev <igor@sysoev.ru>
parents:
2061
diff
changeset
|
766 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
67a29af877ed
initialize of.uniq in ngx_open_cached_file()
Igor Sysoev <igor@sysoev.ru>
parents:
2061
diff
changeset
|
767 |
2068
75a8d34459c5
ngx_memzero() ngx_open_file_info_t
Igor Sysoev <igor@sysoev.ru>
parents:
2063
diff
changeset
|
768 ngx_memzero(&of, sizeof(ngx_open_file_info_t)); |
75a8d34459c5
ngx_memzero() ngx_open_file_info_t
Igor Sysoev <igor@sysoev.ru>
parents:
2063
diff
changeset
|
769 |
3178 | 770 of.read_ahead = clcf->read_ahead; |
2129 | 771 of.directio = clcf->directio; |
2063
67a29af877ed
initialize of.uniq in ngx_open_cached_file()
Igor Sysoev <igor@sysoev.ru>
parents:
2061
diff
changeset
|
772 of.valid = clcf->open_file_cache_valid; |
67a29af877ed
initialize of.uniq in ngx_open_cached_file()
Igor Sysoev <igor@sysoev.ru>
parents:
2061
diff
changeset
|
773 of.min_uses = clcf->open_file_cache_min_uses; |
67a29af877ed
initialize of.uniq in ngx_open_cached_file()
Igor Sysoev <igor@sysoev.ru>
parents:
2061
diff
changeset
|
774 of.errors = clcf->open_file_cache_errors; |
67a29af877ed
initialize of.uniq in ngx_open_cached_file()
Igor Sysoev <igor@sysoev.ru>
parents:
2061
diff
changeset
|
775 of.events = clcf->open_file_cache_events; |
4494
13e09cf11d4e
Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents:
4478
diff
changeset
|
776 |
13e09cf11d4e
Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents:
4478
diff
changeset
|
777 if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) { |
13e09cf11d4e
Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents:
4478
diff
changeset
|
778 XSRETURN_EMPTY; |
13e09cf11d4e
Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents:
4478
diff
changeset
|
779 } |
2063
67a29af877ed
initialize of.uniq in ngx_open_cached_file()
Igor Sysoev <igor@sysoev.ru>
parents:
2061
diff
changeset
|
780 |
1799 | 781 if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool) |
782 != NGX_OK) | |
783 { | |
1454 | 784 if (of.err == 0) { |
785 XSRETURN_EMPTY; | |
786 } | |
787 | |
599 | 788 ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, |
2756
09cab3f8d92e
*) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents:
2231
diff
changeset
|
789 "%s \"%s\" failed", of.failed, filename); |
633 | 790 XSRETURN_EMPTY; |
599 | 791 } |
792 | |
613 | 793 if (offset == -1) { |
794 offset = 0; | |
795 } | |
796 | |
797 if (bytes == 0) { | |
1454 | 798 bytes = of.size - offset; |
599 | 799 } |
800 | |
801 b->in_file = 1; | |
613 | 802 |
803 b->file_pos = offset; | |
804 b->file_last = offset + bytes; | |
599 | 805 |
1454 | 806 b->file->fd = of.fd; |
599 | 807 b->file->log = r->connection->log; |
2231
8564129d49b6
*) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents:
2136
diff
changeset
|
808 b->file->directio = of.is_directio; |
599 | 809 |
7525 | 810 rc = ngx_http_perl_output(r, ctx, b); |
811 | |
812 if (rc == NGX_ERROR) { | |
813 ctx->error = 1; | |
814 croak("ngx_http_perl_output() failed"); | |
815 } | |
599 | 816 |
817 | |
633 | 818 void |
1178
a77f6980de50
rename $r->rflush to $r->flush
Igor Sysoev <igor@sysoev.ru>
parents:
1075
diff
changeset
|
819 flush(r) |
633 | 820 CODE: |
599 | 821 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
822 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
823 ngx_http_perl_ctx_t *ctx; |
7525 | 824 ngx_int_t rc; |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
825 ngx_buf_t *b; |
599 | 826 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
827 ngx_http_perl_set_request(r, ctx); |
599 | 828 |
7525 | 829 if (ctx->error) { |
830 croak("flush(): called after error"); | |
831 } | |
832 | |
599 | 833 b = ngx_calloc_buf(r->pool); |
834 if (b == NULL) { | |
633 | 835 XSRETURN_EMPTY; |
599 | 836 } |
837 | |
838 b->flush = 1; | |
839 | |
1178
a77f6980de50
rename $r->rflush to $r->flush
Igor Sysoev <igor@sysoev.ru>
parents:
1075
diff
changeset
|
840 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "$r->flush"); |
601 | 841 |
7525 | 842 rc = ngx_http_perl_output(r, ctx, b); |
843 | |
844 if (rc == NGX_ERROR) { | |
845 ctx->error = 1; | |
846 croak("ngx_http_perl_output() failed"); | |
847 } | |
599 | 848 |
633 | 849 XSRETURN_EMPTY; |
599 | 850 |
851 | |
852 void | |
853 internal_redirect(r, uri) | |
633 | 854 CODE: |
599 | 855 |
633 | 856 ngx_http_request_t *r; |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
857 ngx_http_perl_ctx_t *ctx; |
633 | 858 SV *uri; |
599 | 859 ngx_uint_t i; |
860 | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
861 ngx_http_perl_set_request(r, ctx); |
633 | 862 |
863 uri = ST(1); | |
599 | 864 |
865 if (ngx_http_perl_sv2str(aTHX_ r, &ctx->redirect_uri, uri) != NGX_OK) { | |
866 XSRETURN_EMPTY; | |
867 } | |
868 | |
869 for (i = 0; i < ctx->redirect_uri.len; i++) { | |
870 if (ctx->redirect_uri.data[i] == '?') { | |
871 | |
872 ctx->redirect_args.len = ctx->redirect_uri.len - (i + 1); | |
873 ctx->redirect_args.data = &ctx->redirect_uri.data[i + 1]; | |
874 ctx->redirect_uri.len = i; | |
875 | |
876 XSRETURN_EMPTY; | |
877 } | |
878 } | |
601 | 879 |
880 | |
633 | 881 void |
811 | 882 allow_ranges(r) |
883 CODE: | |
884 | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
885 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
886 ngx_http_perl_ctx_t *ctx; |
811 | 887 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
888 ngx_http_perl_set_request(r, ctx); |
811 | 889 |
890 r->allow_ranges = 1; | |
891 | |
892 | |
893 void | |
601 | 894 unescape(r, text, type = 0) |
895 CODE: | |
896 | |
633 | 897 dXSTARG; |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
898 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
899 ngx_http_perl_ctx_t *ctx; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
900 SV *text; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
901 int type; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
902 u_char *p, *dst, *src; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
903 STRLEN len; |
601 | 904 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
905 ngx_http_perl_set_request(r, ctx); |
633 | 906 |
907 text = ST(1); | |
908 | |
909 src = (u_char *) SvPV(text, len); | |
910 | |
2049 | 911 p = ngx_pnalloc(r->pool, len + 1); |
601 | 912 if (p == NULL) { |
913 XSRETURN_UNDEF; | |
914 } | |
915 | |
916 dst = p; | |
917 | |
633 | 918 type = items < 3 ? 0 : SvIV(ST(2)); |
919 | |
920 ngx_unescape_uri(&dst, &src, len, (ngx_uint_t) type); | |
601 | 921 *dst = '\0'; |
922 | |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
923 ngx_http_perl_set_targ(p, dst - p); |
601 | 924 |
633 | 925 ST(0) = TARG; |
833 | 926 |
927 | |
928 void | |
929 variable(r, name, value = NULL) | |
930 CODE: | |
931 | |
932 dXSTARG; | |
933 ngx_http_request_t *r; | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
934 ngx_http_perl_ctx_t *ctx; |
833 | 935 SV *name, *value; |
936 u_char *p, *lowcase; | |
937 STRLEN len; | |
938 ngx_str_t var, val; | |
939 ngx_uint_t i, hash; | |
912
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
940 ngx_http_perl_var_t *v; |
833 | 941 ngx_http_variable_value_t *vv; |
942 | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
943 ngx_http_perl_set_request(r, ctx); |
833 | 944 |
945 name = ST(1); | |
946 | |
947 if (SvROK(name) && SvTYPE(SvRV(name)) == SVt_PV) { | |
948 name = SvRV(name); | |
949 } | |
950 | |
951 if (items == 2) { | |
952 value = NULL; | |
953 | |
954 } else { | |
955 value = ST(2); | |
956 | |
957 if (SvROK(value) && SvTYPE(SvRV(value)) == SVt_PV) { | |
958 value = SvRV(value); | |
959 } | |
960 | |
961 if (ngx_http_perl_sv2str(aTHX_ r, &val, value) != NGX_OK) { | |
962 XSRETURN_UNDEF; | |
963 } | |
964 } | |
965 | |
966 p = (u_char *) SvPV(name, len); | |
967 | |
2049 | 968 lowcase = ngx_pnalloc(r->pool, len); |
833 | 969 if (lowcase == NULL) { |
970 XSRETURN_UNDEF; | |
971 } | |
972 | |
2136 | 973 hash = ngx_hash_strlow(lowcase, p, len); |
833 | 974 |
975 var.len = len; | |
976 var.data = lowcase; | |
5306
43900b822890
Perl: fixed syntax usage for C preprocessor directives.
Sergey Kandaurov <pluknet@nginx.com>
parents:
5248
diff
changeset
|
977 #if (NGX_DEBUG) |
912
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
978 |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
979 if (value) { |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
980 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
981 "perl variable: \"%V\"=\"%V\"", &var, &val); |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
982 } else { |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
983 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
984 "perl variable: \"%V\"", &var); |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
985 } |
5306
43900b822890
Perl: fixed syntax usage for C preprocessor directives.
Sergey Kandaurov <pluknet@nginx.com>
parents:
5248
diff
changeset
|
986 #endif |
912
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
987 |
3500
0eb46e3c5c02
change processing variables accessed by SSI and perl module:
Igor Sysoev <igor@sysoev.ru>
parents:
3447
diff
changeset
|
988 vv = ngx_http_get_variable(r, &var, hash); |
833 | 989 if (vv == NULL) { |
990 XSRETURN_UNDEF; | |
991 } | |
992 | |
993 if (vv->not_found) { | |
912
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
994 |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
995 if (ctx->variables) { |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
996 |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
997 v = ctx->variables->elts; |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
998 for (i = 0; i < ctx->variables->nelts; i++) { |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
999 |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1000 if (hash != v[i].hash |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1001 || len != v[i].name.len |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1002 || ngx_strncmp(lowcase, v[i].name.data, len) != 0) |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1003 { |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1004 continue; |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1005 } |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1006 |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1007 if (value) { |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1008 v[i].value = val; |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1009 XSRETURN_UNDEF; |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1010 } |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1011 |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
1012 ngx_http_perl_set_targ(v[i].value.data, v[i].value.len); |
912
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1013 |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1014 goto done; |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1015 } |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1016 } |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1017 |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1018 if (value) { |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1019 if (ctx->variables == NULL) { |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1020 ctx->variables = ngx_array_create(r->pool, 1, |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1021 sizeof(ngx_http_perl_var_t)); |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1022 if (ctx->variables == NULL) { |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1023 XSRETURN_UNDEF; |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1024 } |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1025 } |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1026 |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1027 v = ngx_array_push(ctx->variables); |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1028 if (v == NULL) { |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1029 XSRETURN_UNDEF; |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1030 } |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1031 |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1032 v->hash = hash; |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1033 v->name.len = len; |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1034 v->name.data = lowcase; |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1035 v->value = val; |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1036 |
833 | 1037 XSRETURN_UNDEF; |
1038 } | |
1039 | |
1040 XSRETURN_UNDEF; | |
1041 } | |
1042 | |
1043 if (value) { | |
1044 vv->len = val.len; | |
1045 vv->valid = 1; | |
1565 | 1046 vv->no_cacheable = 0; |
833 | 1047 vv->not_found = 0; |
1048 vv->data = val.data; | |
1049 | |
1050 XSRETURN_UNDEF; | |
1051 } | |
1052 | |
1739
5b7baef2e11e
copy return values to perl's allocated memory
Igor Sysoev <igor@sysoev.ru>
parents:
1703
diff
changeset
|
1053 ngx_http_perl_set_targ(vv->data, vv->len); |
833 | 1054 |
912
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1055 done: |
7fa926a7926d
$r->variable() supports perl only variables
Igor Sysoev <igor@sysoev.ru>
parents:
911
diff
changeset
|
1056 |
833 | 1057 ST(0) = TARG; |
907 | 1058 |
1059 | |
1060 void | |
911 | 1061 sleep(r, sleep, next) |
1062 CODE: | |
1063 | |
1064 ngx_http_request_t *r; | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
1065 ngx_http_perl_ctx_t *ctx; |
1897 | 1066 ngx_msec_t sleep; |
911 | 1067 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
1068 ngx_http_perl_set_request(r, ctx); |
911 | 1069 |
1898 | 1070 sleep = (ngx_msec_t) SvIV(ST(1)); |
1897 | 1071 |
1072 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1073 "perl sleep: %M", sleep); | |
1074 | |
911 | 1075 ctx->next = SvRV(ST(2)); |
1076 | |
6960
1c5e5e5b008d
Perl: fixed delaying subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6233
diff
changeset
|
1077 r->connection->write->delayed = 1; |
1897 | 1078 ngx_add_timer(r->connection->write, sleep); |
1079 | |
1080 r->write_event_handler = ngx_http_perl_sleep_handler; | |
3447
de70f912ad58
fix request counter for $r->sleep(), the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents:
3317
diff
changeset
|
1081 r->main->count++; |
911 | 1082 |
1083 | |
1084 void | |
907 | 1085 log_error(r, err, msg) |
1086 CODE: | |
1087 | |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
1088 ngx_http_request_t *r; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
1089 ngx_http_perl_ctx_t *ctx; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
1090 SV *err, *msg; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
1091 u_char *p; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
1092 STRLEN len; |
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
1093 ngx_err_t e; |
907 | 1094 |
7524
deebe988cbd7
Perl: reworked perl module to pass ctx instead of request.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7516
diff
changeset
|
1095 ngx_http_perl_set_request(r, ctx); |
907 | 1096 |
1097 err = ST(1); | |
1098 | |
1099 if (SvROK(err) && SvTYPE(SvRV(err)) == SVt_PV) { | |
1100 err = SvRV(err); | |
1101 } | |
1102 | |
1103 e = SvIV(err); | |
1104 | |
1105 msg = ST(2); | |
1106 | |
1107 if (SvROK(msg) && SvTYPE(SvRV(msg)) == SVt_PV) { | |
1108 msg = SvRV(msg); | |
1109 } | |
1110 | |
1111 p = (u_char *) SvPV(msg, len); | |
1112 | |
910 | 1113 ngx_log_error(NGX_LOG_ERR, r->connection->log, e, "perl: %s", p); |