@@ -50,6 +50,15 @@ static ngx_int_t ngx_http_geoip2_cidr_value(ngx_conf_t *cf, ngx_str_t *net,
5050static 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+
5362static 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