Skip to content

Commit 2949607

Browse files
authored
Core: Geo Lookup update for IP in header (prebid#3081)
1 parent 1928473 commit 2949607

5 files changed

Lines changed: 372 additions & 27 deletions

File tree

src/main/java/org/prebid/server/auction/GeoLocationServiceWrapper.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.prebid.server.auction;
22

3-
import com.iab.openrtb.request.BidRequest;
43
import com.iab.openrtb.request.Device;
54
import com.iab.openrtb.request.Geo;
65
import io.vertx.core.Future;
@@ -9,10 +8,13 @@
98
import org.apache.commons.lang3.BooleanUtils;
109
import org.apache.commons.lang3.StringUtils;
1110
import org.prebid.server.auction.model.AuctionContext;
11+
import org.prebid.server.auction.model.IpAddress;
12+
import org.prebid.server.auction.requestfactory.Ortb2ImplicitParametersResolver;
1213
import org.prebid.server.execution.Timeout;
1314
import org.prebid.server.geolocation.GeoLocationService;
1415
import org.prebid.server.geolocation.model.GeoInfo;
1516
import org.prebid.server.metric.Metrics;
17+
import org.prebid.server.model.HttpRequestContext;
1618
import org.prebid.server.settings.model.Account;
1719
import org.prebid.server.settings.model.AccountSettings;
1820

@@ -24,33 +26,37 @@ public class GeoLocationServiceWrapper {
2426
private static final Logger logger = LoggerFactory.getLogger(GeoLocationServiceWrapper.class);
2527

2628
private final GeoLocationService geoLocationService;
29+
private final Ortb2ImplicitParametersResolver implicitParametersResolver;
2730
private final Metrics metrics;
2831

29-
public GeoLocationServiceWrapper(GeoLocationService geoLocationService, Metrics metrics) {
32+
public GeoLocationServiceWrapper(GeoLocationService geoLocationService,
33+
Ortb2ImplicitParametersResolver implicitParametersResolver,
34+
Metrics metrics) {
35+
3036
this.geoLocationService = geoLocationService;
37+
this.implicitParametersResolver = Objects.requireNonNull(implicitParametersResolver);
3138
this.metrics = Objects.requireNonNull(metrics);
3239
}
3340

3441
//todo: account settings will work as expected if the default account resolving refactoring is done
3542
public Future<GeoInfo> lookup(AuctionContext auctionContext) {
3643
final Account account = auctionContext.getAccount();
37-
final BidRequest bidRequest = auctionContext.getBidRequest();
44+
final Device device = auctionContext.getBidRequest().getDevice();
45+
final HttpRequestContext requestContext = auctionContext.getHttpRequest();
3846
final Timeout timeout = auctionContext.getTimeoutContext().getTimeout();
3947

4048
final boolean isGeoLookupEnabled = Optional.ofNullable(account.getSettings())
4149
.map(AccountSettings::getGeoLookup)
4250
.map(BooleanUtils::isTrue)
4351
.orElse(false);
4452

45-
final Device device = bidRequest.getDevice();
46-
4753
return isGeoLookupEnabled
48-
? doLookup(getIpAddress(device), getCountry(device), timeout).otherwiseEmpty()
54+
? doLookup(getIpAddress(device, requestContext), getCountry(device), timeout).otherwiseEmpty()
4955
: Future.succeededFuture();
5056
}
5157

5258
public Future<GeoInfo> doLookup(String ipAddress, String requestCountry, Timeout timeout) {
53-
if (geoLocationService == null || StringUtils.isNotBlank(requestCountry) || ipAddress == null) {
59+
if (geoLocationService == null || ipAddress == null || StringUtils.isNotBlank(requestCountry)) {
5460
return Future.failedFuture("Geolocation lookup is skipped");
5561
}
5662
return geoLocationService.lookup(ipAddress, timeout)
@@ -66,16 +72,23 @@ private String getCountry(Device device) {
6672
.orElse(null);
6773
}
6874

69-
private String getIpAddress(Device device) {
75+
private String getIpAddress(Device device, HttpRequestContext request) {
7076
final Optional<Device> optionalDevice = Optional.ofNullable(device);
7177
return optionalDevice.map(Device::getIp)
7278
.filter(StringUtils::isNotBlank)
7379
.or(() -> optionalDevice
7480
.map(Device::getIpv6)
7581
.filter(StringUtils::isNotBlank))
82+
.or(() -> ipFromHeader(request))
7683
.orElse(null);
7784
}
7885

86+
private Optional<String> ipFromHeader(HttpRequestContext request) {
87+
final IpAddress headerIp = implicitParametersResolver.findIpFromRequest(request);
88+
return Optional.ofNullable(headerIp)
89+
.map(IpAddress::getIp);
90+
}
91+
7992
private void logError(Throwable error) {
8093
final String message = "Geolocation lookup failed: " + error.getMessage();
8194
logger.warn(message);

src/main/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ private String sanitizeIp(String ip, IpAddress.IP version) {
284284
return ipAddress != null && ipAddress.getVersion() == version ? ipAddress.getIp() : null;
285285
}
286286

287-
private IpAddress findIpFromRequest(HttpRequestContext request) {
287+
public IpAddress findIpFromRequest(HttpRequestContext request) {
288288
final CaseInsensitiveMultiMap headers = request.getHeaders();
289289
final String remoteHost = request.getRemoteHost();
290290
final List<String> requestIps = paramsExtractor.ipFrom(headers, remoteHost);

src/main/java/org/prebid/server/spring/config/GeoLocationConfiguration.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import lombok.Data;
66
import org.apache.commons.lang3.StringUtils;
77
import org.prebid.server.auction.GeoLocationServiceWrapper;
8+
import org.prebid.server.auction.requestfactory.Ortb2ImplicitParametersResolver;
89
import org.prebid.server.execution.RemoteFileSyncer;
910
import org.prebid.server.execution.retry.FixedIntervalRetryPolicy;
1011
import org.prebid.server.geolocation.CircuitBreakerSecuredGeoLocationService;
@@ -201,9 +202,13 @@ private String readCsv(Resource resource) throws IOException {
201202
@Bean
202203
GeoLocationServiceWrapper geoLocationServiceWrapper(
203204
@Autowired(required = false) GeoLocationService geoLocationService,
205+
Ortb2ImplicitParametersResolver implicitParametersResolver,
204206
Metrics metrics) {
205207

206-
return new GeoLocationServiceWrapper(geoLocationService, metrics);
208+
return new GeoLocationServiceWrapper(
209+
geoLocationService,
210+
implicitParametersResolver,
211+
metrics);
207212
}
208213

209214
}

0 commit comments

Comments
 (0)