~udienz/nginx/nginx.hardy

« back to all changes in this revision

Viewing changes to src/http/modules/ngx_http_geoip_module.c

  • Committer: Daniel Holbach
  • Date: 2010-07-22 07:45:20 UTC
  • mfrom: (1.1.17 upstream)
  • Revision ID: daniel.holbach@canonical.com-20100722074520-lzfoz7cctw91gik7
Merging shared upstream rev into target branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
    ngx_http_variable_value_t *v, uintptr_t data);
31
31
static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r,
32
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
37
static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf);
35
38
static void *ngx_http_geoip_create_conf(ngx_conf_t *cf);
93
96
 
94
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
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
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
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
117
      offsetof(GeoIPRecord, country_code), 0, 0 },
107
118
 
108
119
    { ngx_string("geoip_city_country_code3"), NULL,
109
120
      ngx_http_geoip_city_variable,
110
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
125
      offsetof(GeoIPRecord, country_name), 0, 0 },
114
126
 
115
127
    { ngx_string("geoip_region"), NULL,
124
136
      ngx_http_geoip_city_variable,
125
137
      offsetof(GeoIPRecord, postal_code), 0, 0 },
126
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 },
 
146
 
127
147
    { ngx_null_string, NULL, NULL, 0, 0, 0 }
128
148
};
129
149
 
179
199
ngx_http_geoip_city_variable(ngx_http_request_t *r,
180
200
    ngx_http_variable_value_t *v, uintptr_t data)
181
201
{
182
 
    u_long                  addr;
183
 
    char                   *val;
184
 
    size_t                  len;
185
 
    GeoIPRecord            *gr;
186
 
    struct sockaddr_in     *sin;
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
 
 
 
202
    char         *val;
 
203
    size_t        len;
 
204
    GeoIPRecord  *gr;
 
205
 
 
206
    gr = ngx_http_geoip_get_city_record(r);
204
207
    if (gr == NULL) {
205
208
        goto not_found;
206
209
    }
207
210
 
208
211
    val = *(char **) ((char *) gr + data);
209
 
 
210
212
    if (val == NULL) {
211
213
        goto no_value;
212
214
    }
243
245
 
244
246
 
245
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;
 
294
}
 
295
 
 
296
 
 
297
static ngx_int_t
246
298
ngx_http_geoip_add_variables(ngx_conf_t *cf)
247
299
{
248
300
    ngx_http_variable_t  *var, *v;