Skip to content

Commit eb8a26d

Browse files
committed
Merge pull request #13 from oschwald/all-data-types
Support all MaxMind DB data types
2 parents bd530bc + 21ffc35 commit eb8a26d

File tree

1 file changed

+40
-7
lines changed

1 file changed

+40
-7
lines changed

ngx_http_geoip2_module.c

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,15 @@ static ngx_int_t ngx_http_geoip2_cidr_value(ngx_conf_t *cf, ngx_str_t *net,
5050
static void ngx_http_geoip2_cleanup(void *data);
5151

5252

53+
#define FORMAT(fmt, ...) \
54+
p = ngx_palloc(r->pool, NGX_OFF_T_LEN); \
55+
if (p == NULL) { \
56+
return NGX_ERROR; \
57+
} \
58+
v->len = ngx_sprintf(p, fmt, __VA_ARGS__) - p; \
59+
v->data = p; \
60+
break
61+
5362
static ngx_command_t ngx_http_geoip2_commands[] = {
5463

5564
{ ngx_string("geoip2"),
@@ -184,18 +193,42 @@ ngx_http_geoip2_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
184193
}
185194

186195
switch (entry_data.type) {
196+
case MMDB_DATA_TYPE_BOOLEAN:
197+
FORMAT("%d", entry_data.boolean);
187198
case MMDB_DATA_TYPE_UTF8_STRING:
188199
v->data = (u_char *) entry_data.utf8_string;
189200
v->len = entry_data.data_size;
190201
break;
191-
case MMDB_DATA_TYPE_UINT32:
192-
p = ngx_palloc(r->pool, NGX_OFF_T_LEN);
193-
if (p == NULL) {
194-
return NGX_ERROR;
195-
}
196-
v->len = ngx_sprintf(p, "%O", entry_data.uint32) - p;
197-
v->data = p;
202+
case MMDB_DATA_TYPE_BYTES:
203+
v->data = (u_char *) entry_data.bytes;
204+
v->len = entry_data.data_size;
198205
break;
206+
case MMDB_DATA_TYPE_FLOAT:
207+
FORMAT("%.5f", entry_data.float_value);
208+
case MMDB_DATA_TYPE_DOUBLE:
209+
FORMAT("%.5f", entry_data.double_value);
210+
case MMDB_DATA_TYPE_UINT16:
211+
FORMAT("%uD", entry_data.uint16);
212+
case MMDB_DATA_TYPE_UINT32:
213+
FORMAT("%uD", entry_data.uint32);
214+
case MMDB_DATA_TYPE_INT32:
215+
FORMAT("%D", entry_data.int32);
216+
case MMDB_DATA_TYPE_UINT64:
217+
FORMAT("%uL", entry_data.uint64);
218+
case MMDB_DATA_TYPE_UINT128: ;
219+
#if MMDB_UINT128_IS_BYTE_ARRAY
220+
uint8_t *val = (uint8_t *)entry_data.uint128;
221+
FORMAT( "0x%02x%02x%02x%02x%02x%02x%02x%02x"
222+
"%02x%02x%02x%02x%02x%02x%02x%02x",
223+
val[0], val[1], val[2], val[3],
224+
val[4], val[5], val[6], val[7],
225+
val[8], val[9], val[10], val[11],
226+
val[12], val[13], val[14], val[15]);
227+
#else
228+
mmdb_uint128_t val = entry_data.uint128;
229+
FORMAT("0x%016uxL%016uxL",
230+
(uint64_t) (val >> 64), (uint64_t) val);
231+
#endif
199232
default:
200233
goto not_found;
201234
}

0 commit comments

Comments
 (0)