77import com .iab .openrtb .request .Banner ;
88import com .iab .openrtb .request .BidRequest ;
99import com .iab .openrtb .request .Device ;
10+ import com .iab .openrtb .request .User ;
1011import com .iab .openrtb .request .Format ;
1112import com .iab .openrtb .request .Imp ;
1213import com .iab .openrtb .response .Bid ;
1617import org .apache .commons .collections4 .CollectionUtils ;
1718import org .apache .commons .lang3 .ObjectUtils ;
1819import org .apache .commons .lang3 .StringUtils ;
20+ import org .apache .http .client .utils .URIBuilder ;
1921import org .prebid .server .bidder .Bidder ;
2022import org .prebid .server .bidder .model .BidderBid ;
2123import org .prebid .server .bidder .model .BidderCall ;
3537import org .prebid .server .util .HttpUtil ;
3638
3739import java .math .BigDecimal ;
40+ import java .net .URISyntaxException ;
3841import java .util .ArrayList ;
3942import java .util .Collection ;
4043import java .util .Collections ;
@@ -74,6 +77,13 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request
7477 return Result .withError (BidderError .badInput ("Device IP is required" ));
7578 }
7679
80+ final String optimalEndpointUrl ;
81+ try {
82+ optimalEndpointUrl = getOptimalEndpointUrl (request );
83+ } catch (PreBidException e ) {
84+ return Result .withError (BidderError .badInput (e .getMessage ()));
85+ }
86+
7787 final String displayManagerVer = buildDisplayManagerVersion (request );
7888 final MultiMap headers = resolveHeaders (device );
7989
@@ -85,7 +95,7 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request
8595 final ExtImpConnatix extImpConnatix = parseExtImp (imp );
8696 final Imp modifiedImp = modifyImp (imp , extImpConnatix , displayManagerVer , request );
8797
88- httpRequests .add (makeHttpRequest (request , modifiedImp , headers ));
98+ httpRequests .add (makeHttpRequest (request , modifiedImp , headers , optimalEndpointUrl ));
8999 } catch (PreBidException e ) {
90100 errors .add (BidderError .badInput (e .getMessage ()));
91101 }
@@ -94,6 +104,42 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request
94104 return Result .of (httpRequests , errors );
95105 }
96106
107+ private String getOptimalEndpointUrl (BidRequest request ) {
108+ final Optional <String > dataCenterCode = getUserId (request ).map (ConnatixBidder ::getDataCenterCode );
109+
110+ if (dataCenterCode .isEmpty ()) {
111+ return endpointUrl ;
112+ }
113+
114+ try {
115+ return new URIBuilder (endpointUrl )
116+ .addParameter ("dc" , dataCenterCode .get ())
117+ .build ()
118+ .toString ();
119+ } catch (URISyntaxException e ) {
120+ throw new PreBidException (e .getMessage ());
121+ }
122+ }
123+
124+ private static Optional <String > getUserId (BidRequest request ) {
125+ return Optional .ofNullable (request .getUser ())
126+ .map (User ::getBuyeruid )
127+ .filter (StringUtils ::isNotBlank )
128+ .map (String ::trim );
129+ }
130+
131+ private static String getDataCenterCode (String usedId ) {
132+ if (usedId .startsWith ("1-" )) {
133+ return "us-east-2" ;
134+ } else if (usedId .startsWith ("2-" )) {
135+ return "us-west-2" ;
136+ } else if (usedId .startsWith ("3-" )) {
137+ return "eu-west-1" ;
138+ }
139+
140+ return null ;
141+ }
142+
97143 private static String buildDisplayManagerVersion (BidRequest request ) {
98144 return Optional .ofNullable (request .getApp ())
99145 .map (App ::getExt )
@@ -171,12 +217,13 @@ private Banner modifyImpBanner(Banner banner) {
171217 return banner ;
172218 }
173219
174- private HttpRequest <BidRequest > makeHttpRequest (BidRequest request , Imp imp , MultiMap headers ) {
175- final BidRequest outgoingRequest = request . toBuilder ()
176- . imp ( List . of ( imp ))
177- . build ();
220+ private HttpRequest <BidRequest > makeHttpRequest (BidRequest request ,
221+ Imp imp ,
222+ MultiMap headers ,
223+ String optimalEndpointUrl ) {
178224
179- return BidderUtil .defaultRequest (outgoingRequest , headers , endpointUrl , mapper );
225+ final BidRequest outgoingRequest = request .toBuilder ().imp (List .of (imp )).build ();
226+ return BidderUtil .defaultRequest (outgoingRequest , headers , optimalEndpointUrl , mapper );
180227 }
181228
182229 @ Override
0 commit comments