Welcome! Log In Create A New Profile

Advanced

Improvements to geoip module

October 16, 2009 02:19AM
Hello Nginx users and committers,

Nginx is great - thanks for all the work.

I needed the continent code and the latitude/longitude returned from the MaxMind geoip libraries and I modified ngx_http_geoip_module.c to add more variables for this data.

Patch on version 0.8.20 is below (fairly straightforward, it seems longer because of a slight refactoring to avoid cut/paste)

Any interest in merging this to the tree?

Arvind.

diff -crB ../orig/nginx-0.8.20/src/http/modules/ngx_http_geoip_module.c src/http/modules/ngx_http_geoip_module.c
*** ../orig/nginx-0.8.20/src/http/modules/ngx_http_geoip_module.c 2009-08-19 10:44:33.000000000 -0700
--- src/http/modules/ngx_http_geoip_module.c 2009-10-15 22:49:18.000000000 -0700
***************
*** 30,35 ****
--- 30,37 ----
ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
+ static ngx_int_t ngx_http_geoip_city_float_variable(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data);

static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf);
static void *ngx_http_geoip_create_conf(ngx_conf_t *cf);
***************
*** 102,107 ****
--- 104,112 ----
{ ngx_string("geoip_country_name"), NULL, ngx_http_geoip_country_variable,
(uintptr_t) GeoIP_country_name_by_ipnum, 0, 0 },

+ { ngx_string("geoip_city_continent_code"), NULL, ngx_http_geoip_city_variable,
+ offsetof(GeoIPRecord, continent_code), 0, 0 },
+
{ ngx_string("geoip_city_country_code"), NULL, ngx_http_geoip_city_variable,
offsetof(GeoIPRecord, country_code), 0, 0 },

***************
*** 124,129 ****
--- 129,142 ----
ngx_http_geoip_city_variable,
offsetof(GeoIPRecord, postal_code), 0, 0 },

+ { ngx_string("geoip_latitude"), NULL,
+ ngx_http_geoip_city_float_variable,
+ offsetof(GeoIPRecord, latitude), 0, 0 },
+
+ { ngx_string("geoip_longitude"), NULL,
+ ngx_http_geoip_city_float_variable,
+ offsetof(GeoIPRecord, longitude), 0, 0 },
+
{ ngx_null_string, NULL, NULL, 0, 0, 0 }
};

***************
*** 175,206 ****
}


! static ngx_int_t
! ngx_http_geoip_city_variable(ngx_http_request_t *r,
! ngx_http_variable_value_t *v, uintptr_t data)
{
u_long addr;
- char *val;
- size_t len;
- GeoIPRecord *gr;
struct sockaddr_in *sin;
ngx_http_geoip_conf_t *gcf;
!
gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);

if (gcf->city == NULL) {
! goto not_found;
}

if (r->connection->sockaddr->sa_family != AF_INET) {
! goto not_found;
}

sin = (struct sockaddr_in *) r->connection->sockaddr;
addr = ntohl(sin->sin_addr.s_addr);

! gr = GeoIP_record_by_ipnum(gcf->city, addr);

if (gr == NULL) {
goto not_found;
}
--- 188,226 ----
}


! static GeoIPRecord*
! ngx_http_geoip_get_city_record(ngx_http_request_t *r)
{
u_long addr;
struct sockaddr_in *sin;
ngx_http_geoip_conf_t *gcf;
!
gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);

if (gcf->city == NULL) {
! return NULL;
}

if (r->connection->sockaddr->sa_family != AF_INET) {
! return NULL;
}

sin = (struct sockaddr_in *) r->connection->sockaddr;
addr = ntohl(sin->sin_addr.s_addr);

! return GeoIP_record_by_ipnum(gcf->city, addr);
! }
!
!
! static ngx_int_t
! ngx_http_geoip_city_variable(ngx_http_request_t *r,
! ngx_http_variable_value_t *v, uintptr_t data)
! {
! char *val;
! size_t len;
! GeoIPRecord *gr;

+ gr = ngx_http_geoip_get_city_record(r);
if (gr == NULL) {
goto not_found;
}
***************
*** 241,246 ****
--- 261,298 ----
return NGX_OK;
}

+ static ngx_int_t
+ ngx_http_geoip_city_float_variable(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data)
+ {
+ GeoIPRecord *gr;
+ float float_val;
+
+ gr = ngx_http_geoip_get_city_record(r);
+ if (gr == NULL) {
+ goto not_found;
+ }
+
+ v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN + 10);
+ if (v->data == NULL) {
+ GeoIPRecord_delete(gr);
+ return NGX_ERROR;
+ }
+
+ float_val = *(float *) ((char *) gr + data);
+ v->len = ngx_sprintf(v->data, "%.4f", float_val) - v->data;
+
+ GeoIPRecord_delete(gr);
+
+ return NGX_OK;
+
+ not_found:
+
+ v->not_found = 1;
+
+ return NGX_OK;
+ }
+

static ngx_int_t
ngx_http_geoip_add_variables(ngx_conf_t *cf)
Subject Author Posted

Improvements to geoip module

arvinds October 16, 2009 02:19AM

Re: Improvements to geoip module

st1905 November 24, 2009 06:51AM

Re: Improvements to geoip module

arvinds November 27, 2009 07:40PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 282
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready