perl copy
Igor Sysoev
is at rambler-co.ru
Thu Dec 13 21:18:34 MSK 2007
Прилагаемый патч изменяет поведение ngx_http_perl_module - теперь все
возвращаемые из модуля данные копируются в память перла.
Существенного замедления быть не должно.
Бонусы:
1) значения можно использовать в численном контексте,
2) нуль в конце строки всегда есть,
3) решение возможных других проблем.
--
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/modules/perl/nginx.xs
===================================================================
--- src/http/modules/perl/nginx.xs (revision 1057)
+++ src/http/modules/perl/nginx.xs (working copy)
@@ -13,19 +13,16 @@
#include "XSUB.h"
+
#define ngx_http_perl_set_request(r) \
r = INT2PTR(ngx_http_request_t *, SvIV((SV *) SvRV(ST(0))))
-#define ngx_http_perl_set_targ(p, len, z) \
+#define ngx_http_perl_set_targ(p, len) \
\
- sv_upgrade(TARG, SVt_PV); \
+ SvUPGRADE(TARG, SVt_PV); \
SvPOK_on(TARG); \
- SvPV_set(TARG, (char *) p); \
- SvLEN_set(TARG, len + z); \
- SvCUR_set(TARG, len); \
- SvFAKE_on(TARG); \
- SvREADONLY_on(TARG); \
+ sv_setpvn(TARG, (char *) p, len)
static ngx_int_t
@@ -172,7 +169,7 @@
ngx_http_request_t *r;
ngx_http_perl_set_request(r);
- ngx_http_perl_set_targ(r->uri.data, r->uri.len, 0);
+ ngx_http_perl_set_targ(r->uri.data, r->uri.len);
ST(0) = TARG;
@@ -185,7 +182,7 @@
ngx_http_request_t *r;
ngx_http_perl_set_request(r);
- ngx_http_perl_set_targ(r->args.data, r->args.len, 0);
+ ngx_http_perl_set_targ(r->args.data, r->args.len);
ST(0) = TARG;
@@ -198,7 +195,7 @@
ngx_http_request_t *r;
ngx_http_perl_set_request(r);
- ngx_http_perl_set_targ(r->method_name.data, r->method_name.len, 0);
+ ngx_http_perl_set_targ(r->method_name.data, r->method_name.len);
ST(0) = TARG;
@@ -212,7 +209,7 @@
ngx_http_perl_set_request(r);
ngx_http_perl_set_targ(r->connection->addr_text.data,
- r->connection->addr_text.len, 1);
+ r->connection->addr_text.len);
ST(0) = TARG;
@@ -266,7 +263,7 @@
ph = (ngx_table_elt_t **) ((char *) &r->headers_in + hh->offset);
if (*ph) {
- ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len, 0);
+ ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len);
goto done;
}
@@ -285,7 +282,7 @@
ph = r->headers_in.cookies.elts;
if (n == 1) {
- ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len, 0);
+ ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len);
goto done;
}
@@ -313,7 +310,7 @@
*p++ = ';'; *p++ = ' ';
}
- ngx_http_perl_set_targ(cookie, size, 0);
+ ngx_http_perl_set_targ(cookie, size);
goto done;
}
@@ -341,7 +338,7 @@
continue;
}
- ngx_http_perl_set_targ(h[i].value.data, h[i].value.len, 0);
+ ngx_http_perl_set_targ(h[i].value.data, h[i].value.len);
goto done;
}
@@ -409,7 +406,7 @@
XSRETURN_UNDEF;
}
- ngx_http_perl_set_targ(r->request_body->bufs->buf->pos, len, 0);
+ ngx_http_perl_set_targ(r->request_body->bufs->buf->pos, len);
ST(0) = TARG;
@@ -428,7 +425,7 @@
}
ngx_http_perl_set_targ(r->request_body->temp_file->file.name.data,
- r->request_body->temp_file->file.name.len, 1);
+ r->request_body->temp_file->file.name.len);
ST(0) = TARG;
@@ -507,7 +504,7 @@
done:
- ngx_http_perl_set_targ(ctx->filename.data, ctx->filename.len, 1);
+ ngx_http_perl_set_targ(ctx->filename.data, ctx->filename.len);
ST(0) = TARG;
@@ -785,7 +782,7 @@
ngx_unescape_uri(&dst, &src, len, (ngx_uint_t) type);
*dst = '\0';
- ngx_http_perl_set_targ(p, dst - p, 1);
+ ngx_http_perl_set_targ(p, dst - p);
ST(0) = TARG;
@@ -882,7 +879,7 @@
XSRETURN_UNDEF;
}
- ngx_http_perl_set_targ(v[i].value.data, v[i].value.len, 0);
+ ngx_http_perl_set_targ(v[i].value.data, v[i].value.len);
goto done;
}
@@ -926,7 +923,7 @@
XSRETURN_UNDEF;
}
- ngx_http_perl_set_targ(vv->data, vv->len, 0);
+ ngx_http_perl_set_targ(vv->data, vv->len);
done:
More information about the nginx-ru
mailing list