diff -ru nginx-1.0.1/src/http/modules/ngx_http_geoip_module.c nginx-1.0.1-geo-isp-org-asnum/src/http/modules/ngx_http_geoip_module.c --- nginx-1.0.1/src/http/modules/ngx_http_geoip_module.c 2011-01-27 06:51:59.000000000 -0600 +++ nginx-1.0.1-geo-isp-org-asnum/src/http/modules/ngx_http_geoip_module.c 2011-05-10 08:10:22.000000000 -0500 @@ -14,6 +14,7 @@ typedef struct { GeoIP *country; + GeoIP *isp; GeoIP *city; } ngx_http_geoip_conf_t; @@ -28,6 +29,8 @@ static ngx_int_t ngx_http_geoip_country_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_geoip_isp_variable(ngx_http_request_t *r, + 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_region_name_variable(ngx_http_request_t *r, @@ -42,6 +45,8 @@ static void *ngx_http_geoip_create_conf(ngx_conf_t *cf); static char *ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); +static char *ngx_http_geoip_isp(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); static char *ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); static void ngx_http_geoip_cleanup(void *data); @@ -56,6 +61,13 @@ 0, NULL }, + { ngx_string("geoip_isp"), + NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, + ngx_http_geoip_isp, + NGX_HTTP_MAIN_CONF_OFFSET, + 0, + NULL }, + { ngx_string("geoip_city"), NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, ngx_http_geoip_city, @@ -112,6 +124,10 @@ ngx_http_geoip_country_variable, (uintptr_t) GeoIP_country_name_by_ipnum, 0, 0 }, + { ngx_string("geoip_isp"), NULL, + ngx_http_geoip_isp_variable, + (uintptr_t) GeoIP_name_by_ipnum, 0, 0 }, + { ngx_string("geoip_city_continent_code"), NULL, ngx_http_geoip_city_variable, offsetof(GeoIPRecord, continent_code), 0, 0 }, @@ -212,6 +228,53 @@ static ngx_int_t +ngx_http_geoip_isp_variable(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ngx_http_geoip_variable_handler_pt handler = + (ngx_http_geoip_variable_handler_pt) data; + + u_long addr; + const char *val; + struct sockaddr_in *sin; + ngx_http_geoip_conf_t *gcf; + + gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module); + + if (gcf->isp == 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); + + val = handler(gcf->isp, addr); + + if (val == NULL) { + goto not_found; + } + + v->len = ngx_strlen(val); + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) val; + + return NGX_OK; + +not_found: + + v->not_found = 1; + + return NGX_OK; +} + + +static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data) { @@ -441,7 +504,7 @@ if (gcf->country == NULL) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "GeoIO_open(\"%V\") failed", &value[1]); + "GeoIP_open(\"%V\") failed", &value[1]); return NGX_CONF_ERROR; } @@ -475,6 +538,56 @@ static char * +ngx_http_geoip_isp(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_http_geoip_conf_t *gcf = conf; + + ngx_str_t *value; + + if (gcf->isp) { + return "is duplicate"; + } + + value = cf->args->elts; + + gcf->isp = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); + + if (gcf->isp == NULL) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "GeoIP_open(\"%V\") failed", &value[1]); + + return NGX_CONF_ERROR; + } + + if (cf->args->nelts == 3) { + if (ngx_strcmp(value[2].data, "utf8") == 0) { + GeoIP_set_charset (gcf->isp, GEOIP_CHARSET_UTF8); + + } else { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid parameter \"%V\"", &value[2]); + return NGX_CONF_ERROR; + } + } + + switch (gcf->isp->databaseType) { + + case GEOIP_ISP_EDITION: + case GEOIP_ORG_EDITION: + case GEOIP_ASNUM_EDITION: + + return NGX_CONF_OK; + + default: + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid GeoIP database \"%V\" type:%d", + &value[1], gcf->isp->databaseType); + return NGX_CONF_ERROR; + } +} + + +static char * ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_geoip_conf_t *gcf = conf; @@ -491,7 +604,7 @@ if (gcf->city == NULL) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "GeoIO_open(\"%V\") failed", &value[1]); + "GeoIP_open(\"%V\") failed", &value[1]); return NGX_CONF_ERROR; } @@ -532,6 +645,10 @@ GeoIP_delete(gcf->country); } + if (gcf->isp) { + GeoIP_delete(gcf->isp); + } + if (gcf->city) { GeoIP_delete(gcf->city); }