comparison src/http/modules/perl/nginx.xs @ 1739:5b7baef2e11e

copy return values to perl's allocated memory
author Igor Sysoev <igor@sysoev.ru>
date Sun, 16 Dec 2007 11:57:27 +0000
parents 43747661804d
children 0b8dc0e7616d
comparison
equal deleted inserted replaced
1738:e8cef87413a0 1739:5b7baef2e11e
11 #include <ngx_http.h> 11 #include <ngx_http.h>
12 #include <ngx_http_perl_module.h> 12 #include <ngx_http_perl_module.h>
13 13
14 #include "XSUB.h" 14 #include "XSUB.h"
15 15
16
16 #define ngx_http_perl_set_request(r) \ 17 #define ngx_http_perl_set_request(r) \
17 r = INT2PTR(ngx_http_request_t *, SvIV((SV *) SvRV(ST(0)))) 18 r = INT2PTR(ngx_http_request_t *, SvIV((SV *) SvRV(ST(0))))
18 19
19 20
20 #define ngx_http_perl_set_targ(p, len, z) \ 21 #define ngx_http_perl_set_targ(p, len) \
21 \ 22 \
22 sv_upgrade(TARG, SVt_PV); \ 23 SvUPGRADE(TARG, SVt_PV); \
23 SvPOK_on(TARG); \ 24 SvPOK_on(TARG); \
24 SvPV_set(TARG, (char *) p); \ 25 sv_setpvn(TARG, (char *) p, len)
25 SvLEN_set(TARG, len + z); \
26 SvCUR_set(TARG, len); \
27 SvFAKE_on(TARG); \
28 SvREADONLY_on(TARG); \
29 26
30 27
31 static ngx_int_t 28 static ngx_int_t
32 ngx_http_perl_sv2str(pTHX_ ngx_http_request_t *r, ngx_str_t *s, SV *sv) 29 ngx_http_perl_sv2str(pTHX_ ngx_http_request_t *r, ngx_str_t *s, SV *sv)
33 { 30 {
170 167
171 dXSTARG; 168 dXSTARG;
172 ngx_http_request_t *r; 169 ngx_http_request_t *r;
173 170
174 ngx_http_perl_set_request(r); 171 ngx_http_perl_set_request(r);
175 ngx_http_perl_set_targ(r->uri.data, r->uri.len, 0); 172 ngx_http_perl_set_targ(r->uri.data, r->uri.len);
176 173
177 ST(0) = TARG; 174 ST(0) = TARG;
178 175
179 176
180 void 177 void
183 180
184 dXSTARG; 181 dXSTARG;
185 ngx_http_request_t *r; 182 ngx_http_request_t *r;
186 183
187 ngx_http_perl_set_request(r); 184 ngx_http_perl_set_request(r);
188 ngx_http_perl_set_targ(r->args.data, r->args.len, 0); 185 ngx_http_perl_set_targ(r->args.data, r->args.len);
189 186
190 ST(0) = TARG; 187 ST(0) = TARG;
191 188
192 189
193 void 190 void
196 193
197 dXSTARG; 194 dXSTARG;
198 ngx_http_request_t *r; 195 ngx_http_request_t *r;
199 196
200 ngx_http_perl_set_request(r); 197 ngx_http_perl_set_request(r);
201 ngx_http_perl_set_targ(r->method_name.data, r->method_name.len, 0); 198 ngx_http_perl_set_targ(r->method_name.data, r->method_name.len);
202 199
203 ST(0) = TARG; 200 ST(0) = TARG;
204 201
205 202
206 void 203 void
210 dXSTARG; 207 dXSTARG;
211 ngx_http_request_t *r; 208 ngx_http_request_t *r;
212 209
213 ngx_http_perl_set_request(r); 210 ngx_http_perl_set_request(r);
214 ngx_http_perl_set_targ(r->connection->addr_text.data, 211 ngx_http_perl_set_targ(r->connection->addr_text.data,
215 r->connection->addr_text.len, 1); 212 r->connection->addr_text.len);
216 213
217 ST(0) = TARG; 214 ST(0) = TARG;
218 215
219 216
220 void 217 void
264 if (hh->offset) { 261 if (hh->offset) {
265 262
266 ph = (ngx_table_elt_t **) ((char *) &r->headers_in + hh->offset); 263 ph = (ngx_table_elt_t **) ((char *) &r->headers_in + hh->offset);
267 264
268 if (*ph) { 265 if (*ph) {
269 ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len, 0); 266 ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len);
270 267
271 goto done; 268 goto done;
272 } 269 }
273 270
274 XSRETURN_UNDEF; 271 XSRETURN_UNDEF;
283 } 280 }
284 281
285 ph = r->headers_in.cookies.elts; 282 ph = r->headers_in.cookies.elts;
286 283
287 if (n == 1) { 284 if (n == 1) {
288 ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len, 0); 285 ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len);
289 286
290 goto done; 287 goto done;
291 } 288 }
292 289
293 size = - (ssize_t) (sizeof("; ") - 1); 290 size = - (ssize_t) (sizeof("; ") - 1);
311 } 308 }
312 309
313 *p++ = ';'; *p++ = ' '; 310 *p++ = ';'; *p++ = ' ';
314 } 311 }
315 312
316 ngx_http_perl_set_targ(cookie, size, 0); 313 ngx_http_perl_set_targ(cookie, size);
317 314
318 goto done; 315 goto done;
319 } 316 }
320 317
321 /* iterate over all headers */ 318 /* iterate over all headers */
339 || ngx_strcasecmp(p, h[i].key.data) != 0) 336 || ngx_strcasecmp(p, h[i].key.data) != 0)
340 { 337 {
341 continue; 338 continue;
342 } 339 }
343 340
344 ngx_http_perl_set_targ(h[i].value.data, h[i].value.len, 0); 341 ngx_http_perl_set_targ(h[i].value.data, h[i].value.len);
345 342
346 goto done; 343 goto done;
347 } 344 }
348 345
349 XSRETURN_UNDEF; 346 XSRETURN_UNDEF;
407 404
408 if (len == 0) { 405 if (len == 0) {
409 XSRETURN_UNDEF; 406 XSRETURN_UNDEF;
410 } 407 }
411 408
412 ngx_http_perl_set_targ(r->request_body->bufs->buf->pos, len, 0); 409 ngx_http_perl_set_targ(r->request_body->bufs->buf->pos, len);
413 410
414 ST(0) = TARG; 411 ST(0) = TARG;
415 412
416 413
417 void 414 void
426 if (r->request_body == NULL || r->request_body->temp_file == NULL) { 423 if (r->request_body == NULL || r->request_body->temp_file == NULL) {
427 XSRETURN_UNDEF; 424 XSRETURN_UNDEF;
428 } 425 }
429 426
430 ngx_http_perl_set_targ(r->request_body->temp_file->file.name.data, 427 ngx_http_perl_set_targ(r->request_body->temp_file->file.name.data,
431 r->request_body->temp_file->file.name.len, 1); 428 r->request_body->temp_file->file.name.len);
432 429
433 ST(0) = TARG; 430 ST(0) = TARG;
434 431
435 432
436 void 433 void
505 ctx->filename.len--; 502 ctx->filename.len--;
506 sv_setpv(PL_statname, (char *) ctx->filename.data); 503 sv_setpv(PL_statname, (char *) ctx->filename.data);
507 504
508 done: 505 done:
509 506
510 ngx_http_perl_set_targ(ctx->filename.data, ctx->filename.len, 1); 507 ngx_http_perl_set_targ(ctx->filename.data, ctx->filename.len);
511 508
512 ST(0) = TARG; 509 ST(0) = TARG;
513 510
514 511
515 void 512 void
783 type = items < 3 ? 0 : SvIV(ST(2)); 780 type = items < 3 ? 0 : SvIV(ST(2));
784 781
785 ngx_unescape_uri(&dst, &src, len, (ngx_uint_t) type); 782 ngx_unescape_uri(&dst, &src, len, (ngx_uint_t) type);
786 *dst = '\0'; 783 *dst = '\0';
787 784
788 ngx_http_perl_set_targ(p, dst - p, 1); 785 ngx_http_perl_set_targ(p, dst - p);
789 786
790 ST(0) = TARG; 787 ST(0) = TARG;
791 788
792 789
793 void 790 void
880 if (value) { 877 if (value) {
881 v[i].value = val; 878 v[i].value = val;
882 XSRETURN_UNDEF; 879 XSRETURN_UNDEF;
883 } 880 }
884 881
885 ngx_http_perl_set_targ(v[i].value.data, v[i].value.len, 0); 882 ngx_http_perl_set_targ(v[i].value.data, v[i].value.len);
886 883
887 goto done; 884 goto done;
888 } 885 }
889 } 886 }
890 887
924 vv->data = val.data; 921 vv->data = val.data;
925 922
926 XSRETURN_UNDEF; 923 XSRETURN_UNDEF;
927 } 924 }
928 925
929 ngx_http_perl_set_targ(vv->data, vv->len, 0); 926 ngx_http_perl_set_targ(vv->data, vv->len);
930 927
931 done: 928 done:
932 929
933 ST(0) = TARG; 930 ST(0) = TARG;
934 931