comparison src/http/modules/ngx_http_geoip_module.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 89dc5654117c
children
comparison
equal deleted inserted replaced
507:bfc170196f52 508:68c0ae0a4959
28 28
29 static ngx_int_t ngx_http_geoip_country_variable(ngx_http_request_t *r, 29 static ngx_int_t ngx_http_geoip_country_variable(ngx_http_request_t *r,
30 ngx_http_variable_value_t *v, uintptr_t data); 30 ngx_http_variable_value_t *v, uintptr_t data);
31 static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r, 31 static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r,
32 ngx_http_variable_value_t *v, uintptr_t data); 32 ngx_http_variable_value_t *v, uintptr_t data);
33 static ngx_int_t ngx_http_geoip_city_float_variable(ngx_http_request_t *r,
34 ngx_http_variable_value_t *v, uintptr_t data);
35 static GeoIPRecord *ngx_http_geoip_get_city_record(ngx_http_request_t *r);
33 36
34 static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf); 37 static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf);
35 static void *ngx_http_geoip_create_conf(ngx_conf_t *cf); 38 static void *ngx_http_geoip_create_conf(ngx_conf_t *cf);
36 static char *ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, 39 static char *ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd,
37 void *conf); 40 void *conf);
91 }; 94 };
92 95
93 96
94 static ngx_http_variable_t ngx_http_geoip_vars[] = { 97 static ngx_http_variable_t ngx_http_geoip_vars[] = {
95 98
96 { ngx_string("geoip_country_code"), NULL, ngx_http_geoip_country_variable, 99 { ngx_string("geoip_country_code"), NULL,
100 ngx_http_geoip_country_variable,
97 (uintptr_t) GeoIP_country_code_by_ipnum, 0, 0 }, 101 (uintptr_t) GeoIP_country_code_by_ipnum, 0, 0 },
98 102
99 { ngx_string("geoip_country_code3"), NULL, ngx_http_geoip_country_variable, 103 { ngx_string("geoip_country_code3"), NULL,
104 ngx_http_geoip_country_variable,
100 (uintptr_t) GeoIP_country_code3_by_ipnum, 0, 0 }, 105 (uintptr_t) GeoIP_country_code3_by_ipnum, 0, 0 },
101 106
102 { ngx_string("geoip_country_name"), NULL, ngx_http_geoip_country_variable, 107 { ngx_string("geoip_country_name"), NULL,
108 ngx_http_geoip_country_variable,
103 (uintptr_t) GeoIP_country_name_by_ipnum, 0, 0 }, 109 (uintptr_t) GeoIP_country_name_by_ipnum, 0, 0 },
104 110
105 { ngx_string("geoip_city_country_code"), NULL, ngx_http_geoip_city_variable, 111 { ngx_string("geoip_city_continent_code"), NULL,
112 ngx_http_geoip_city_variable,
113 offsetof(GeoIPRecord, continent_code), 0, 0 },
114
115 { ngx_string("geoip_city_country_code"), NULL,
116 ngx_http_geoip_city_variable,
106 offsetof(GeoIPRecord, country_code), 0, 0 }, 117 offsetof(GeoIPRecord, country_code), 0, 0 },
107 118
108 { ngx_string("geoip_city_country_code3"), NULL, 119 { ngx_string("geoip_city_country_code3"), NULL,
109 ngx_http_geoip_city_variable, 120 ngx_http_geoip_city_variable,
110 offsetof(GeoIPRecord, country_code3), 0, 0 }, 121 offsetof(GeoIPRecord, country_code3), 0, 0 },
111 122
112 { ngx_string("geoip_city_country_name"), NULL, ngx_http_geoip_city_variable, 123 { ngx_string("geoip_city_country_name"), NULL,
124 ngx_http_geoip_city_variable,
113 offsetof(GeoIPRecord, country_name), 0, 0 }, 125 offsetof(GeoIPRecord, country_name), 0, 0 },
114 126
115 { ngx_string("geoip_region"), NULL, 127 { ngx_string("geoip_region"), NULL,
116 ngx_http_geoip_city_variable, 128 ngx_http_geoip_city_variable,
117 offsetof(GeoIPRecord, region), 0, 0 }, 129 offsetof(GeoIPRecord, region), 0, 0 },
121 offsetof(GeoIPRecord, city), 0, 0 }, 133 offsetof(GeoIPRecord, city), 0, 0 },
122 134
123 { ngx_string("geoip_postal_code"), NULL, 135 { ngx_string("geoip_postal_code"), NULL,
124 ngx_http_geoip_city_variable, 136 ngx_http_geoip_city_variable,
125 offsetof(GeoIPRecord, postal_code), 0, 0 }, 137 offsetof(GeoIPRecord, postal_code), 0, 0 },
138
139 { ngx_string("geoip_latitude"), NULL,
140 ngx_http_geoip_city_float_variable,
141 offsetof(GeoIPRecord, latitude), 0, 0 },
142
143 { ngx_string("geoip_longitude"), NULL,
144 ngx_http_geoip_city_float_variable,
145 offsetof(GeoIPRecord, longitude), 0, 0 },
126 146
127 { ngx_null_string, NULL, NULL, 0, 0, 0 } 147 { ngx_null_string, NULL, NULL, 0, 0, 0 }
128 }; 148 };
129 149
130 150
177 197
178 static ngx_int_t 198 static ngx_int_t
179 ngx_http_geoip_city_variable(ngx_http_request_t *r, 199 ngx_http_geoip_city_variable(ngx_http_request_t *r,
180 ngx_http_variable_value_t *v, uintptr_t data) 200 ngx_http_variable_value_t *v, uintptr_t data)
181 { 201 {
182 u_long addr; 202 char *val;
183 char *val; 203 size_t len;
184 size_t len; 204 GeoIPRecord *gr;
185 GeoIPRecord *gr; 205
186 struct sockaddr_in *sin; 206 gr = ngx_http_geoip_get_city_record(r);
187 ngx_http_geoip_conf_t *gcf;
188
189 gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);
190
191 if (gcf->city == NULL) {
192 goto not_found;
193 }
194
195 if (r->connection->sockaddr->sa_family != AF_INET) {
196 goto not_found;
197 }
198
199 sin = (struct sockaddr_in *) r->connection->sockaddr;
200 addr = ntohl(sin->sin_addr.s_addr);
201
202 gr = GeoIP_record_by_ipnum(gcf->city, addr);
203
204 if (gr == NULL) { 207 if (gr == NULL) {
205 goto not_found; 208 goto not_found;
206 } 209 }
207 210
208 val = *(char **) ((char *) gr + data); 211 val = *(char **) ((char *) gr + data);
209
210 if (val == NULL) { 212 if (val == NULL) {
211 goto no_value; 213 goto no_value;
212 } 214 }
213 215
214 len = ngx_strlen(val); 216 len = ngx_strlen(val);
237 not_found: 239 not_found:
238 240
239 v->not_found = 1; 241 v->not_found = 1;
240 242
241 return NGX_OK; 243 return NGX_OK;
244 }
245
246
247 static ngx_int_t
248 ngx_http_geoip_city_float_variable(ngx_http_request_t *r,
249 ngx_http_variable_value_t *v, uintptr_t data)
250 {
251 float val;
252 GeoIPRecord *gr;
253
254 gr = ngx_http_geoip_get_city_record(r);
255 if (gr == NULL) {
256 v->not_found = 1;
257 return NGX_OK;
258 }
259
260 v->data = ngx_pnalloc(r->pool, NGX_INT64_LEN + 5);
261 if (v->data == NULL) {
262 GeoIPRecord_delete(gr);
263 return NGX_ERROR;
264 }
265
266 val = *(float *) ((char *) gr + data);
267
268 v->len = ngx_sprintf(v->data, "%.4f", val) - v->data;
269
270 GeoIPRecord_delete(gr);
271
272 return NGX_OK;
273 }
274
275
276 static GeoIPRecord *
277 ngx_http_geoip_get_city_record(ngx_http_request_t *r)
278 {
279 u_long addr;
280 struct sockaddr_in *sin;
281 ngx_http_geoip_conf_t *gcf;
282
283 gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);
284
285 if (gcf->city && r->connection->sockaddr->sa_family == AF_INET) {
286
287 sin = (struct sockaddr_in *) r->connection->sockaddr;
288 addr = ntohl(sin->sin_addr.s_addr);
289
290 return GeoIP_record_by_ipnum(gcf->city, addr);
291 }
292
293 return NULL;
242 } 294 }
243 295
244 296
245 static ngx_int_t 297 static ngx_int_t
246 ngx_http_geoip_add_variables(ngx_conf_t *cf) 298 ngx_http_geoip_add_variables(ngx_conf_t *cf)