diff --git a/pom.xml b/pom.xml index 6328a7e..ee71dc5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ io.dropwizard dropwizard-maxmind - 1.0.5-1 + 1.0.5-2 jar dropwizard-maxmind diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/Characters.java b/src/main/java/io/dropwizard/maxmind/geoip2/Characters.java new file mode 100644 index 0000000..d7c1923 --- /dev/null +++ b/src/main/java/io/dropwizard/maxmind/geoip2/Characters.java @@ -0,0 +1,12 @@ +package io.dropwizard.maxmind.geoip2; + +public class Characters { + + public static String toAscii(String s) { + if (s == null || s.isEmpty()) { + return s; + } + return s.replaceAll("[^\\x20-\\x7e]", ""); + } + +} diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/filter/MaxMindGeoIpRequestFilter.java b/src/main/java/io/dropwizard/maxmind/geoip2/filter/MaxMindGeoIpRequestFilter.java index 286827a..56f7aab 100644 --- a/src/main/java/io/dropwizard/maxmind/geoip2/filter/MaxMindGeoIpRequestFilter.java +++ b/src/main/java/io/dropwizard/maxmind/geoip2/filter/MaxMindGeoIpRequestFilter.java @@ -28,6 +28,7 @@ import com.maxmind.geoip2.model.CountryResponse; import com.maxmind.geoip2.model.EnterpriseResponse; import com.maxmind.geoip2.record.*; +import io.dropwizard.maxmind.geoip2.Characters; import io.dropwizard.maxmind.geoip2.config.MaxMindConfig; import io.dropwizard.maxmind.geoip2.core.MaxMindHeaders; import lombok.extern.slf4j.Slf4j; @@ -175,26 +176,32 @@ public void filter(final ContainerRequestContext containerRequestContext) throws private void addCountryInfo(Country country, final ContainerRequestContext containerRequestContext) { if (!Strings.isNullOrEmpty(country.getName())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_COUNTRY, country.getName()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_COUNTRY, + Characters.toAscii(country.getName())); if (!Strings.isNullOrEmpty(country.getIsoCode())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_COUNTRY_ISO, country.getIsoCode()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_COUNTRY_ISO, + Characters.toAscii(country.getIsoCode())); } private void addStateInfo(Subdivision subdivision, final ContainerRequestContext containerRequestContext) { if (!Strings.isNullOrEmpty(subdivision.getName())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_STATE, subdivision.getName()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_STATE, + Characters.toAscii(subdivision.getName())); if (!Strings.isNullOrEmpty(subdivision.getIsoCode())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_STATE_ISO, subdivision.getIsoCode()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_STATE_ISO, + Characters.toAscii(subdivision.getIsoCode())); } private void addCityInfo(City city, final ContainerRequestContext containerRequestContext) { if (!Strings.isNullOrEmpty(city.getName())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_CITY, city.getName()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_CITY, + Characters.toAscii(city.getName())); } private void addPostalInfo(Postal postal, final ContainerRequestContext containerRequestContext) { if (!Strings.isNullOrEmpty(postal.getCode())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_POSTAL, postal.getCode()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_POSTAL, + Characters.toAscii(postal.getCode())); } private void addLocationInfo(Location location, final ContainerRequestContext containerRequestContext) { @@ -208,11 +215,14 @@ private void addLocationInfo(Location location, final ContainerRequestContext co private void addTraitsInfo(Traits traits, final ContainerRequestContext containerRequestContext) { if (!Strings.isNullOrEmpty(traits.getUserType())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_USER_TYPE, traits.getUserType()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_USER_TYPE, + Characters.toAscii(traits.getUserType())); if (!Strings.isNullOrEmpty(traits.getIsp())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_ISP, traits.getIsp()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_ISP, + Characters.toAscii(traits.getIsp())); if (traits.getConnectionType() != null) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_CONNECTION_TYPE, traits.getConnectionType().name()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_CONNECTION_TYPE, + Characters.toAscii(traits.getConnectionType().name())); containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_PROXY_LEGAL, String.valueOf(traits.isLegitimateProxy())); } diff --git a/src/test/java/io/dropwizard/maxmind/geoip2/CharactersTest.java b/src/test/java/io/dropwizard/maxmind/geoip2/CharactersTest.java new file mode 100644 index 0000000..7b473ca --- /dev/null +++ b/src/test/java/io/dropwizard/maxmind/geoip2/CharactersTest.java @@ -0,0 +1,25 @@ +package io.dropwizard.maxmind.geoip2; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class CharactersTest { + + @Test + public void testAsciiOnlyAsciiString(){ + String s = "example abcd"; + assertEquals(s, Characters.toAscii(s)); + } + + @Test + public void testAsciiNullString(){ + assertEquals(null, Characters.toAscii(null)); + } + + @Test + public void testAsciiWithNonAsciiCharacters(){ + assertEquals("orpsd", Characters.toAscii("orčpžsíáýd")); + } + +} \ No newline at end of file