Mercurial > hg > nginx-vendor-0-7
comparison src/core/ngx_times.c @ 508:68c0ae0a4959 NGINX_0_7_66
nginx 0.7.66
*) Security: now nginx/Windows ignores default file stream name.
Thanks to Jose Antonio Vazquez Gonzalez.
*) Change: now the charset filter runs before the SSI filter.
*) Change: now no message is written in an error log if a variable is
not found by $r->variable() method.
*) Change: now keepalive connections after POST requests are not
disabled for MSIE 7.0+.
Thanks to Adam Lounds.
*) Feature: the "proxy_no_cache" and "fastcgi_no_cache" directives.
*) Feature: now the "rewrite" directive does a redirect automatically
if the $scheme variable is used.
Thanks to Piotr Sikora.
*) Feature: the "chunked_transfer_encoding" directive.
*) Feature: the $geoip_city_continent_code, $geoip_latitude, and
$geoip_longitude variables.
Thanks to Arvind Sundararajan.
*) Feature: now the ngx_http_image_filter_module deletes always EXIF
and other application specific data if the data consume more than 5%
of a JPEG file.
*) Feature: now the "msie_padding" directive works for Chrome too.
*) Workaround: now keepalive connections are disabled for Safari.
Thanks to Joshua Sierles.
*) Bugfix: nginx ignored the "private" and "no-store" values in the
"Cache-Control" backend response header line.
*) Bugfix: an "&" character was not escaped when it was copied in
arguments part in a rewrite rule.
*) Bugfix: nginx might be terminated abnormally while a signal
processing or if the directive "timer_resolution" was used on
platforms which do not support kqueue or eventport notification
methods.
Thanks to George Xie and Maxim Dounin.
*) Bugfix: if temporary files and permanent storage area resided at
different file systems, then permanent file modification times were
incorrect.
Thanks to Maxim Dounin.
*) Bugfix: ngx_http_memcached_module might issue the error message
"memcached sent invalid trailer".
Thanks to Maxim Dounin.
*) Bugfix: nginx could not built zlib-1.2.4 library using the library
sources.
Thanks to Maxim Dounin.
*) Bugfix: values of the $query_string, $arg_..., etc. variables cached
in main request were used by the SSI module in subrequests.
*) Bugfix: nginx did not support HTTPS referrers.
*) Bugfix: nginx/Windows might not find file if path in configuration
was given in other character case; the bug had appeared in 0.7.65.
*) Bugfix: the $date_local variable has an incorrect value, if the "%s"
format was used.
Thanks to Maxim Dounin.
*) Bugfix: nginx did not support all ciphers and digests used in client
certificates.
Thanks to Innocenty Enikeew.
*) Bugfix: if ssl_session_cache was not set or was set to "none", then
during client certificate verify the error "session id context
uninitialized" might occur; the bug had appeared in 0.7.1.
*) Bugfix: OpenSSL-1.0.0 compatibility on 64-bit Linux.
Thanks to Maxim Dounin.
*) Bugfix: a geo range returned default value if the range included two
or more /16 networks and did not begin at /16 network boundary.
*) Bugfix: the $uid_got variable might not be used in the SSI and perl
modules.
*) Bugfix: a worker process hung if a FIFO file was requested.
Thanks to Vicente Aguilar and Maxim Dounin.
*) Bugfix: a variable value was repeatedly encoded after each an "echo"
SSI-command output; the bug had appeared in 0.6.14.
*) Bugfix: a "stub" parameter of an "include" SSI directive was not
used, if empty response has 200 status code.
*) Bugfix: a block used in a "stub" parameter of an "include" SSI
directive was output with "text/plain" MIME type.
*) Bugfix: if a proxied or FastCGI request was internally redirected to
another proxied or FastCGI location, then a segmentation fault might
occur in a worker process; the bug had appeared in 0.7.65.
Thanks to Yichun Zhang.
*) Bugfix: IMAP connections may hang until they timed out while talking
to Zimbra server.
Thanks to Alan Batie.
*) Bugfix: nginx did not support chunked transfer encoding for 201
responses.
Thanks to Julian Reich.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 07 Jun 2010 00:00:00 +0400 |
parents | a094317ba307 |
children |
comparison
equal
deleted
inserted
replaced
507:bfc170196f52 | 508:68c0ae0a4959 |
---|---|
26 volatile ngx_time_t *ngx_cached_time; | 26 volatile ngx_time_t *ngx_cached_time; |
27 volatile ngx_str_t ngx_cached_err_log_time; | 27 volatile ngx_str_t ngx_cached_err_log_time; |
28 volatile ngx_str_t ngx_cached_http_time; | 28 volatile ngx_str_t ngx_cached_http_time; |
29 volatile ngx_str_t ngx_cached_http_log_time; | 29 volatile ngx_str_t ngx_cached_http_log_time; |
30 | 30 |
31 #if !(NGX_WIN32) | |
32 | |
33 /* | |
34 * locatime() and localtime_r() are not Async-Signal-Safe functions, therefore, | |
35 * they must not be called by a signal handler, so we use the cached | |
36 * GMT offset value. Fortunately the value is changed only two times a year. | |
37 */ | |
38 | |
39 static ngx_int_t cached_gmtoff; | |
40 #endif | |
41 | |
31 static ngx_time_t cached_time[NGX_TIME_SLOTS]; | 42 static ngx_time_t cached_time[NGX_TIME_SLOTS]; |
32 static u_char cached_err_log_time[NGX_TIME_SLOTS] | 43 static u_char cached_err_log_time[NGX_TIME_SLOTS] |
33 [sizeof("1970/09/28 12:00:00")]; | 44 [sizeof("1970/09/28 12:00:00")]; |
34 static u_char cached_http_time[NGX_TIME_SLOTS] | 45 static u_char cached_http_time[NGX_TIME_SLOTS] |
35 [sizeof("Mon, 28 Sep 1970 06:00:00 GMT")]; | 46 [sizeof("Mon, 28 Sep 1970 06:00:00 GMT")]; |
48 ngx_cached_http_time.len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1; | 59 ngx_cached_http_time.len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1; |
49 ngx_cached_http_log_time.len = sizeof("28/Sep/1970:12:00:00 +0600") - 1; | 60 ngx_cached_http_log_time.len = sizeof("28/Sep/1970:12:00:00 +0600") - 1; |
50 | 61 |
51 ngx_cached_time = &cached_time[0]; | 62 ngx_cached_time = &cached_time[0]; |
52 | 63 |
53 ngx_time_update(0, 0); | 64 ngx_time_update(); |
54 } | 65 } |
55 | 66 |
56 | 67 |
57 void | 68 void |
58 ngx_time_update(time_t sec, ngx_uint_t msec) | 69 ngx_time_update(void) |
59 { | 70 { |
60 u_char *p0, *p1, *p2; | 71 u_char *p0, *p1, *p2; |
61 ngx_tm_t tm, gmt; | 72 ngx_tm_t tm, gmt; |
73 time_t sec; | |
74 ngx_uint_t msec; | |
62 ngx_time_t *tp; | 75 ngx_time_t *tp; |
63 struct timeval tv; | 76 struct timeval tv; |
64 | 77 |
65 if (!ngx_trylock(&ngx_time_lock)) { | 78 if (!ngx_trylock(&ngx_time_lock)) { |
66 return; | 79 return; |
67 } | 80 } |
68 | 81 |
69 if (sec == 0) { | 82 ngx_gettimeofday(&tv); |
70 ngx_gettimeofday(&tv); | 83 |
71 | 84 sec = tv.tv_sec; |
72 sec = tv.tv_sec; | 85 msec = tv.tv_usec / 1000; |
73 msec = tv.tv_usec / 1000; | |
74 } | |
75 | 86 |
76 ngx_current_msec = (ngx_msec_t) sec * 1000 + msec; | 87 ngx_current_msec = (ngx_msec_t) sec * 1000 + msec; |
77 | 88 |
78 tp = &cached_time[slot]; | 89 tp = &cached_time[slot]; |
79 | 90 |
110 ngx_gmtime(sec + tp->gmtoff * 60, &tm); | 121 ngx_gmtime(sec + tp->gmtoff * 60, &tm); |
111 | 122 |
112 #elif (NGX_HAVE_GMTOFF) | 123 #elif (NGX_HAVE_GMTOFF) |
113 | 124 |
114 ngx_localtime(sec, &tm); | 125 ngx_localtime(sec, &tm); |
115 tp->gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60); | 126 cached_gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60); |
127 tp->gmtoff = cached_gmtoff; | |
116 | 128 |
117 #else | 129 #else |
118 | 130 |
119 ngx_localtime(sec, &tm); | 131 ngx_localtime(sec, &tm); |
120 tp->gmtoff = ngx_timezone(tm.ngx_tm_isdst); | 132 cached_gmtoff = ngx_timezone(tm.ngx_tm_isdst); |
133 tp->gmtoff = cached_gmtoff; | |
121 | 134 |
122 #endif | 135 #endif |
123 | 136 |
124 | 137 |
125 p1 = &cached_err_log_time[slot][0]; | 138 p1 = &cached_err_log_time[slot][0]; |
147 ngx_cached_err_log_time.data = p1; | 160 ngx_cached_err_log_time.data = p1; |
148 ngx_cached_http_log_time.data = p2; | 161 ngx_cached_http_log_time.data = p2; |
149 | 162 |
150 ngx_unlock(&ngx_time_lock); | 163 ngx_unlock(&ngx_time_lock); |
151 } | 164 } |
165 | |
166 | |
167 #if !(NGX_WIN32) | |
168 | |
169 void | |
170 ngx_time_sigsafe_update(void) | |
171 { | |
172 u_char *p; | |
173 ngx_tm_t tm; | |
174 time_t sec; | |
175 ngx_time_t *tp; | |
176 struct timeval tv; | |
177 | |
178 if (!ngx_trylock(&ngx_time_lock)) { | |
179 return; | |
180 } | |
181 | |
182 ngx_gettimeofday(&tv); | |
183 | |
184 sec = tv.tv_sec; | |
185 | |
186 tp = &cached_time[slot]; | |
187 | |
188 if (tp->sec == sec) { | |
189 ngx_unlock(&ngx_time_lock); | |
190 return; | |
191 } | |
192 | |
193 if (slot == NGX_TIME_SLOTS - 1) { | |
194 slot = 0; | |
195 } else { | |
196 slot++; | |
197 } | |
198 | |
199 ngx_gmtime(sec + cached_gmtoff * 60, &tm); | |
200 | |
201 p = &cached_err_log_time[slot][0]; | |
202 | |
203 (void) ngx_sprintf(p, "%4d/%02d/%02d %02d:%02d:%02d", | |
204 tm.ngx_tm_year, tm.ngx_tm_mon, | |
205 tm.ngx_tm_mday, tm.ngx_tm_hour, | |
206 tm.ngx_tm_min, tm.ngx_tm_sec); | |
207 | |
208 ngx_memory_barrier(); | |
209 | |
210 ngx_cached_err_log_time.data = p; | |
211 | |
212 ngx_unlock(&ngx_time_lock); | |
213 } | |
214 | |
215 #endif | |
152 | 216 |
153 | 217 |
154 u_char * | 218 u_char * |
155 ngx_http_time(u_char *buf, time_t t) | 219 ngx_http_time(u_char *buf, time_t t) |
156 { | 220 { |