11package org .prebid .server .auction ;
22
3- import com .iab .openrtb .request .BidRequest ;
43import com .iab .openrtb .request .Device ;
54import com .iab .openrtb .request .Geo ;
65import io .vertx .core .Future ;
98import org .apache .commons .lang3 .BooleanUtils ;
109import org .apache .commons .lang3 .StringUtils ;
1110import org .prebid .server .auction .model .AuctionContext ;
11+ import org .prebid .server .auction .model .IpAddress ;
12+ import org .prebid .server .auction .requestfactory .Ortb2ImplicitParametersResolver ;
1213import org .prebid .server .execution .Timeout ;
1314import org .prebid .server .geolocation .GeoLocationService ;
1415import org .prebid .server .geolocation .model .GeoInfo ;
1516import org .prebid .server .metric .Metrics ;
17+ import org .prebid .server .model .HttpRequestContext ;
1618import org .prebid .server .settings .model .Account ;
1719import 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 );
0 commit comments