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 {