Skip to content

Commit c11f026

Browse files
authored
Connatix: Enhance endpoint with DC (#3878)
1 parent 1c4c410 commit c11f026

2 files changed

Lines changed: 134 additions & 6 deletions

File tree

src/main/java/org/prebid/server/bidder/connatix/ConnatixBidder.java

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.iab.openrtb.request.Banner;
88
import com.iab.openrtb.request.BidRequest;
99
import com.iab.openrtb.request.Device;
10+
import com.iab.openrtb.request.User;
1011
import com.iab.openrtb.request.Format;
1112
import com.iab.openrtb.request.Imp;
1213
import com.iab.openrtb.response.Bid;
@@ -16,6 +17,7 @@
1617
import org.apache.commons.collections4.CollectionUtils;
1718
import org.apache.commons.lang3.ObjectUtils;
1819
import org.apache.commons.lang3.StringUtils;
20+
import org.apache.http.client.utils.URIBuilder;
1921
import org.prebid.server.bidder.Bidder;
2022
import org.prebid.server.bidder.model.BidderBid;
2123
import org.prebid.server.bidder.model.BidderCall;
@@ -35,6 +37,7 @@
3537
import org.prebid.server.util.HttpUtil;
3638

3739
import java.math.BigDecimal;
40+
import java.net.URISyntaxException;
3841
import java.util.ArrayList;
3942
import java.util.Collection;
4043
import 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

src/test/java/org/prebid/server/bidder/connatix/ConnatixBidderTest.java

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.iab.openrtb.request.Device;
99
import com.iab.openrtb.request.Format;
1010
import com.iab.openrtb.request.Imp;
11+
import com.iab.openrtb.request.User;
1112
import com.iab.openrtb.response.Bid;
1213
import com.iab.openrtb.response.BidResponse;
1314
import com.iab.openrtb.response.SeatBid;
@@ -268,6 +269,86 @@ public void makeHttpRequestsShouldIncludeResolvedHttpHeadersFromDevice() {
268269
tuple(HttpUtil.ACCEPT_HEADER.toString(), HttpHeaderValues.APPLICATION_JSON.toString()));
269270
}
270271

272+
@Test
273+
public void makeHttpRequestsShouldUseDataCenterUsEast2WhenUserIdStartsWith1() {
274+
// given
275+
final BidRequest bidRequest = givenBidRequest(
276+
request -> request.user(User.builder().buyeruid("1-UserId").build()),
277+
givenImp(impBuilder -> impBuilder
278+
.ext(mapper.valueToTree(ExtImpConnatix.of("placementId", null)))));
279+
280+
// when
281+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
282+
283+
// then
284+
assertThat(result.getErrors()).isEmpty();
285+
assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly("https://test-url.com/?dc=us-east-2");
286+
}
287+
288+
@Test
289+
public void makeHttpRequestsShouldUseDataCenterUsWest2WhenUserIdStartsWith2() {
290+
// given
291+
final BidRequest bidRequest = givenBidRequest(
292+
request -> request.user(User.builder().buyeruid("2-UserId").build()),
293+
givenImp(impBuilder -> impBuilder
294+
.ext(mapper.valueToTree(ExtImpConnatix.of("placementId", null)))));
295+
296+
// when
297+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
298+
299+
// then
300+
assertThat(result.getErrors()).isEmpty();
301+
assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly("https://test-url.com/?dc=us-west-2");
302+
}
303+
304+
@Test
305+
public void makeHttpRequestsShouldUseDataCenterEuWest1WhenUserIdStartsWith3() {
306+
// given
307+
final BidRequest bidRequest = givenBidRequest(
308+
request -> request.user(User.builder().buyeruid("3-UserId").build()),
309+
givenImp(impBuilder -> impBuilder
310+
.ext(mapper.valueToTree(ExtImpConnatix.of("placementId", null)))));
311+
312+
// when
313+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
314+
315+
// then
316+
assertThat(result.getErrors()).isEmpty();
317+
assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly("https://test-url.com/?dc=eu-west-1");
318+
}
319+
320+
@Test
321+
public void makeHttpRequestsShouldExcludeDataCenterWhenUserIdPrefixDoesNotMatch() {
322+
// given
323+
final BidRequest bidRequest = givenBidRequest(
324+
request -> request.user(User.builder().buyeruid("4-UserId").build()),
325+
givenImp(impBuilder -> impBuilder
326+
.ext(mapper.valueToTree(ExtImpConnatix.of("placementId", null)))));
327+
328+
// when
329+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
330+
331+
// then
332+
assertThat(result.getErrors()).isEmpty();
333+
assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly(CONNATIX_ENDPOINT);
334+
}
335+
336+
@Test
337+
public void makeHttpRequestsShouldExcludeDataCenterWhenUserIdIsMissing() {
338+
// given
339+
final BidRequest bidRequest = givenBidRequest(
340+
UnaryOperator.identity(),
341+
givenImp(impBuilder -> impBuilder
342+
.ext(mapper.valueToTree(ExtImpConnatix.of("placementId", null)))));
343+
344+
// when
345+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
346+
347+
// then
348+
assertThat(result.getErrors()).isEmpty();
349+
assertThat(result.getValue()).extracting(HttpRequest::getUri).containsOnly(CONNATIX_ENDPOINT);
350+
}
351+
271352
@Test
272353
public void makeBidsShouldErrorIfResponseBodyCannotBeParsed() {
273354
// given

0 commit comments

Comments
 (0)