summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--auto/cc/icc6
-rw-r--r--auto/lib/perl/make6
-rw-r--r--docs/xml/nginx/changes.xml36
-rw-r--r--src/core/nginx.c4
-rw-r--r--src/core/nginx.h2
-rw-r--r--src/core/ngx_string.c35
-rw-r--r--src/core/ngx_string.h10
-rw-r--r--src/http/modules/ngx_http_referer_module.c7
-rw-r--r--src/http/modules/perl/nginx.pm7
-rw-r--r--src/http/modules/perl/nginx.xs47
-rw-r--r--src/http/ngx_http_script.c2
-rw-r--r--src/os/unix/ngx_freebsd_config.h6
-rw-r--r--src/os/unix/ngx_linux_config.h3
-rw-r--r--src/os/unix/ngx_posix_config.h3
-rw-r--r--src/os/unix/ngx_solaris_config.h3
15 files changed, 135 insertions, 42 deletions
diff --git a/auto/cc/icc b/auto/cc/icc
index 81b042748..afcabe6e6 100644
--- a/auto/cc/icc
+++ b/auto/cc/icc
@@ -20,9 +20,6 @@ CFLAGS="$CFLAGS -O"
# inline any function, at the compiler's discretion
CFLAGS="$CFLAGS -Ob2"
-# single-file IP optimizations
-#IPO="-ip"
-
# multi-file IP optimizations
case "$NGX_ICC_VER" in
9.*)
@@ -34,6 +31,9 @@ case "$NGX_ICC_VER" in
;;
esac
+# single-file IP optimizations
+#IPO="-ip"
+
CFLAGS="$CFLAGS $IPO"
CORE_LINK="$CORE_LINK $IPO"
CORE_LINK="$CORE_LINK -opt_report_file=$NGX_OBJS/opt_report_file"
diff --git a/auto/lib/perl/make b/auto/lib/perl/make
index 36544223a..b7c8cb3bd 100644
--- a/auto/lib/perl/make
+++ b/auto/lib/perl/make
@@ -15,14 +15,16 @@ $NGX_OBJS/src/http/modules/perl/blib/arch/auto/nginx/nginx.so: \
cd $NGX_OBJS/src/http/modules/perl && make
-$NGX_OBJS/src/http/modules/perl/Makefile: src/http/modules/perl/Makefile.PL
+$NGX_OBJS/src/http/modules/perl/Makefile: \
+ src/http/modules/perl/Makefile.PL \
+ src/http/modules/perl/nginx.pm
cp -p src/http/modules/perl/nginx.* $NGX_OBJS/src/http/modules/perl/
cp -p src/http/modules/perl/typemap $NGX_OBJS/src/http/modules/perl/
cp -p src/http/modules/perl/Makefile.PL $NGX_OBJS/src/http/modules/perl/
cd $NGX_OBJS/src/http/modules/perl \
- && NGX_PERL_CFLAGS="$NGX_PERL_CFLAGS" \
+ && NGX_PERL_CFLAGS="$NGX_PERL_CFLAGS $NGX_CC_OPT" \
NGX_PCRE=$PCRE \
NGX_ZLIB=$ZLIB \
NGX_OBJS=$NGX_OBJS \
diff --git a/docs/xml/nginx/changes.xml b/docs/xml/nginx/changes.xml
index e4845f6b0..8ef64c9ca 100644
--- a/docs/xml/nginx/changes.xml
+++ b/docs/xml/nginx/changes.xml
@@ -9,6 +9,42 @@
<title lang="en">nginx changelog</title>
+<changes ver="0.3.22" date="17.01.2006">
+
+<change type="feature">
+<para lang="ru">
+модуль ngx_http_perl_module поддерживает методы $r->args и $r->unescape.
+</para>
+<para lang="en">
+the ngx_http_perl_module supports the $r->args and $r->unescape methods.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+метод $r->query_string в модуле ngx_http_perl_module упразднён.
+</para>
+<para lang="en">
+the method $r->query_string of ngx_http_perl_module is canceled.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+если в директиве valid_referers указаны только none или blocked, то
+происходил segmentation fault;
+ошибка появилась в 0.3.18.
+</para>
+<para lang="en">
+segmentation fault was occurred if the "none" or "blocked" values was
+specified in the "valid_referers" directive;
+bug appeared in 0.3.18.
+</para>
+</change>
+
+</changes>
+
+
<changes ver="0.3.21" date="16.01.2006">
<change type="feature">
diff --git a/src/core/nginx.c b/src/core/nginx.c
index d30e12744..a9a0dd905 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -168,6 +168,8 @@ ngx_module_t ngx_core_module = {
ngx_uint_t ngx_max_module;
+static char *ngx_null_environ = NULL;
+
int ngx_cdecl
main(int argc, char *const *argv)
@@ -232,6 +234,8 @@ main(int argc, char *const *argv)
return 1;
}
+ environ = &ngx_null_environ;
+
ngx_max_module = 0;
for (i = 0; ngx_modules[i]; i++) {
ngx_modules[i]->index = ngx_max_module++;
diff --git a/src/core/nginx.h b/src/core/nginx.h
index ec125d60e..a2c696fea 100644
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -8,7 +8,7 @@
#define _NGINX_H_INCLUDED_
-#define NGINX_VER "nginx/0.3.21"
+#define NGINX_VER "nginx/0.3.22"
#define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin"
diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c
index 2bb335a07..c99778d87 100644
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -931,7 +931,7 @@ ngx_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type)
void
-ngx_unescape_uri(u_char **dst, u_char **src, size_t size)
+ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type)
{
u_char *d, *s, ch, c, decoded;
enum {
@@ -952,7 +952,7 @@ ngx_unescape_uri(u_char **dst, u_char **src, size_t size)
switch (state) {
case sw_usual:
- if (ch == '?') {
+ if (ch == '?' && type == NGX_UNESCAPE_URI) {
*d++ = ch;
goto done;
}
@@ -995,12 +995,18 @@ ngx_unescape_uri(u_char **dst, u_char **src, size_t size)
if (ch >= '0' && ch <= '9') {
ch = (u_char) ((decoded << 4) + ch - '0');
- if (ch > '%' && ch < 0x7f) {
- *d++ = ch;
+ if (type == NGX_UNESCAPE_URI) {
+ if (ch > '%' && ch < 0x7f) {
+ *d++ = ch;
+ break;
+ }
+
+ *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);
+
break;
}
- *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);
+ *d++ = ch;
break;
}
@@ -1009,17 +1015,22 @@ ngx_unescape_uri(u_char **dst, u_char **src, size_t size)
if (c >= 'a' && c <= 'f') {
ch = (u_char) ((decoded << 4) + c - 'a' + 10);
- if (ch == '?') {
- *d++ = ch;
- goto done;
- }
+ if (type == NGX_UNESCAPE_URI) {
+ if (ch == '?') {
+ *d++ = ch;
+ goto done;
+ }
+
+ if (ch > '%' && ch < 0x7f) {
+ *d++ = ch;
+ break;
+ }
- if (ch > '%' && ch < 0x7f) {
- *d++ = ch;
+ *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);
break;
}
- *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);
+ *d++ = ch;
break;
}
diff --git a/src/core/ngx_string.h b/src/core/ngx_string.h
index 0192a3068..d76a0f555 100644
--- a/src/core/ngx_string.h
+++ b/src/core/ngx_string.h
@@ -144,13 +144,15 @@ size_t ngx_utf_length(ngx_str_t *utf);
u_char * ngx_utf_cpystrn(u_char *dst, u_char *src, size_t n);
-#define NGX_ESCAPE_URI 0
-#define NGX_ESCAPE_ARGS 1
-#define NGX_ESCAPE_HTML 2
+#define NGX_ESCAPE_URI 0
+#define NGX_ESCAPE_ARGS 1
+#define NGX_ESCAPE_HTML 2
+
+#define NGX_UNESCAPE_URI 1
uintptr_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,
ngx_uint_t type);
-void ngx_unescape_uri(u_char **dst, u_char **src, size_t size);
+void ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type);
#define ngx_qsort qsort
diff --git a/src/http/modules/ngx_http_referer_module.c b/src/http/modules/ngx_http_referer_module.c
index 0d3ee6f7a..459984eaa 100644
--- a/src/http/modules/ngx_http_referer_module.c
+++ b/src/http/modules/ngx_http_referer_module.c
@@ -90,10 +90,7 @@ ngx_http_referer_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
rlcf = ngx_http_get_module_loc_conf(r, ngx_http_referer_module);
- if (rlcf->hash.buckets == NULL
- && rlcf->dns_wildcards == NULL
- && rlcf->dns_wildcards->hash.buckets == NULL)
- {
+ if (rlcf->hash.buckets == NULL && rlcf->dns_wildcards == NULL) {
goto valid;
}
@@ -145,7 +142,7 @@ ngx_http_referer_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
}
}
- if (rlcf->dns_wildcards && rlcf->dns_wildcards->hash.buckets) {
+ if (rlcf->dns_wildcards) {
uri = ngx_hash_find_wildcard(rlcf->dns_wildcards, buf, len);
if (uri) {
goto uri;
diff --git a/src/http/modules/perl/nginx.pm b/src/http/modules/perl/nginx.pm
index 66ff64f9a..c0f3f27eb 100644
--- a/src/http/modules/perl/nginx.pm
+++ b/src/http/modules/perl/nginx.pm
@@ -17,7 +17,7 @@ our @EXPORT = qw(
HTTP_SERVER_ERROR
);
-our $VERSION = '0.3.21';
+our $VERSION = '0.3.22';
require XSLoader;
XSLoader::load('nginx', $VERSION);
@@ -48,11 +48,6 @@ nginx - Perl interface to the nginx HTTP server API
This module provides a Perl interface to the nginx HTTP server API.
-=head2 EXPORT
-
-None by default.
-
-
=head1 SEE ALSO
diff --git a/src/http/modules/perl/nginx.xs b/src/http/modules/perl/nginx.xs
index 21d2deb99..d41bf684f 100644
--- a/src/http/modules/perl/nginx.xs
+++ b/src/http/modules/perl/nginx.xs
@@ -156,13 +156,13 @@ uri(r, ...)
char *
-query_string(r, ...)
+args(r, ...)
nginx r
CODE:
if (items != 1) {
- croak("$r->query_string(text) is not implemented");
+ croak("$r->args(text) is not implemented");
}
RETVAL = ngx_palloc(r->pool, r->args.len + 1);
@@ -360,6 +360,9 @@ print(r, ...)
b->start = p;
b->end = b->last;
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "$r->print: read-only SV: %z", len);
+
goto out;
}
}
@@ -374,12 +377,11 @@ print(r, ...)
sv = SvRV(sv);
}
- ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
- "SV: %p %d %Xd",
- sv, SvREFCNT(sv), SvREADONLY(sv));
-
(void) SvPV(sv, len);
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "$r->print: copy SV: %z", len);
+
size += len;
}
@@ -513,6 +515,8 @@ rflush(r)
b->flush = 1;
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "$r->rflush");
+
RETVAL = ngx_http_perl_output(r, b);
done:
@@ -549,3 +553,34 @@ internal_redirect(r, uri)
XSRETURN_EMPTY;
}
}
+
+
+char *
+unescape(r, text, type = 0)
+ nginx r
+ SV *text
+ int type
+
+ PREINIT:
+
+ u_char *p, *dst, *src;
+ STRLEN n;
+
+ CODE:
+
+ src = (u_char *) SvPV(text, n);
+
+ p = ngx_palloc(r->pool, n + 1);
+ if (p == NULL) {
+ XSRETURN_UNDEF;
+ }
+
+ dst = p;
+
+ ngx_unescape_uri(&dst, &src, n, (ngx_uint_t) type);
+ *dst = '\0';
+
+ RETVAL = (char *) p;
+
+ OUTPUT:
+ RETVAL
diff --git a/src/http/ngx_http_script.c b/src/http/ngx_http_script.c
index 4986675a9..b46c9bb35 100644
--- a/src/http/ngx_http_script.c
+++ b/src/http/ngx_http_script.c
@@ -682,7 +682,7 @@ ngx_http_script_regex_end_code(ngx_http_script_engine_t *e)
dst = e->buf.data;
src = e->buf.data;
- ngx_unescape_uri(&dst, &src, e->pos - e->buf.data);
+ ngx_unescape_uri(&dst, &src, e->pos - e->buf.data, NGX_UNESCAPE_URI);
if (src < e->pos) {
dst = ngx_copy(dst, src, e->pos - src);
diff --git a/src/os/unix/ngx_freebsd_config.h b/src/os/unix/ngx_freebsd_config.h
index 73deb9ccd..c187191b9 100644
--- a/src/os/unix/ngx_freebsd_config.h
+++ b/src/os/unix/ngx_freebsd_config.h
@@ -97,9 +97,11 @@ pid_t rfork_thread(int flags, void *stack, int (*func)(void *arg), void *arg);
#endif
-extern char *malloc_options;
-
#define NGX_HAVE_OS_SPECIFIC_INIT 1
+extern char **environ;
+extern char *malloc_options;
+
+
#endif /* _NGX_FREEBSD_CONFIG_H_INCLUDED_ */
diff --git a/src/os/unix/ngx_linux_config.h b/src/os/unix/ngx_linux_config.h
index ac7d7a8df..74bbfb1bd 100644
--- a/src/os/unix/ngx_linux_config.h
+++ b/src/os/unix/ngx_linux_config.h
@@ -101,4 +101,7 @@ extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size);
#define NGX_HAVE_OS_SPECIFIC_INIT 1
+extern char **environ;
+
+
#endif /* _NGX_LINUX_CONFIG_H_INCLUDED_ */
diff --git a/src/os/unix/ngx_posix_config.h b/src/os/unix/ngx_posix_config.h
index dc4341a94..984db9670 100644
--- a/src/os/unix/ngx_posix_config.h
+++ b/src/os/unix/ngx_posix_config.h
@@ -102,4 +102,7 @@
#endif
+extern char **environ;
+
+
#endif /* _NGX_POSIX_CONFIG_H_INCLUDED_ */
diff --git a/src/os/unix/ngx_solaris_config.h b/src/os/unix/ngx_solaris_config.h
index a668b95e1..ba1d351c7 100644
--- a/src/os/unix/ngx_solaris_config.h
+++ b/src/os/unix/ngx_solaris_config.h
@@ -88,4 +88,7 @@
#define NGX_HAVE_OS_SPECIFIC_INIT 1
+extern char **environ;
+
+
#endif /* _NGX_SOLARIS_CONFIG_H_INCLUDED_ */