Skip to content

Commit 1c769c1

Browse files
Stored bid response (prebid#1174)
1 parent a44b700 commit 1c769c1

26 files changed

+895
-669
lines changed

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

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -149,16 +149,16 @@ public Future<BidResponse> holdAuction(AuctionContext context) {
149149
final Account account = context.getAccount();
150150
final List<String> debugWarnings = context.getDebugWarnings();
151151

152-
final List<SeatBid> storedResponse = new ArrayList<>();
152+
final List<SeatBid> storedAuctionResponses = new ArrayList<>();
153153
final BidderAliases aliases = aliases(bidRequest);
154154
final String publisherId = account.getId();
155155
final BidRequestCacheInfo cacheInfo = bidRequestCacheInfo(bidRequest);
156156
final boolean debugEnabled = isDebugEnabled(bidRequest);
157157
final Map<String, MultiBidConfig> bidderToMultiBid = bidderToMultiBids(bidRequest, debugWarnings);
158158

159-
return storedResponseProcessor.getStoredResponseResult(bidRequest.getImp(), aliases, timeout)
160-
.map(storedResponseResult -> populateStoredResponse(storedResponseResult, storedResponse))
161-
.compose(impsRequiredRequest -> extractBidderRequests(context, impsRequiredRequest, aliases))
159+
return storedResponseProcessor.getStoredResponseResult(bidRequest.getImp(), timeout)
160+
.map(storedResponseResult -> populateStoredResponse(storedResponseResult, storedAuctionResponses))
161+
.compose(storedResponseResult -> extractBidderRequests(context, storedResponseResult, aliases))
162162
.map(bidderRequests -> updateRequestMetric(
163163
bidderRequests, uidsCookie, aliases, publisherId, context.getRequestTypeMetric()))
164164
.compose(bidderRequests -> CompositeFuture.join(
@@ -172,7 +172,7 @@ public Future<BidResponse> holdAuction(AuctionContext context) {
172172
// send all the requests to the bidders and gathers results
173173
.map(CompositeFuture::<BidderResponse>list)
174174
.map(bidderResponses -> storedResponseProcessor.mergeWithBidderResponses(
175-
bidderResponses, storedResponse, bidRequest.getImp()))
175+
bidderResponses, storedAuctionResponses, bidRequest.getImp()))
176176
.map(bidderResponses -> validateAndAdjustBids(bidderResponses, context, aliases))
177177
.map(bidderResponses -> updateMetricsFromResponses(bidderResponses, publisherId, aliases))
178178
// produce response from bidder results
@@ -327,10 +327,10 @@ private static MultiBidConfig toMultiBid(String bidder, Integer maxBids, String
327327
* Populates storedResponse parameter with stored {@link List<SeatBid>} and returns {@link List<Imp>} for which
328328
* request to bidders should be performed.
329329
*/
330-
private static List<Imp> populateStoredResponse(StoredResponseResult storedResponseResult,
331-
List<SeatBid> storedResponse) {
332-
storedResponse.addAll(storedResponseResult.getStoredResponse());
333-
return storedResponseResult.getRequiredRequestImps();
330+
private static StoredResponseResult populateStoredResponse(StoredResponseResult storedResponseResult,
331+
List<SeatBid> storedResponse) {
332+
storedResponse.addAll(storedResponseResult.getAuctionStoredResponse());
333+
return storedResponseResult;
334334
}
335335

336336
/**
@@ -362,21 +362,20 @@ private static List<Imp> populateStoredResponse(StoredResponseResult storedRespo
362362
* {@link Imp}, and are known to {@link BidderCatalog} or aliases from bidRequest.ext.prebid.aliases.
363363
*/
364364
private Future<List<BidderRequest>> extractBidderRequests(AuctionContext context,
365-
List<Imp> requestedImps,
365+
StoredResponseResult storedResponseResult,
366366
BidderAliases aliases) {
367-
368-
final List<Imp> imps = requestedImps.stream()
367+
final List<Imp> imps = storedResponseResult.getRequiredRequestImps().stream()
369368
.filter(imp -> bidderParamsFromImpExt(imp.getExt()) != null)
370369
.collect(Collectors.toList());
371-
372370
// identify valid bidders and aliases out of imps
373371
final List<String> bidders = imps.stream()
374372
.flatMap(imp -> StreamUtil.asStream(bidderParamsFromImpExt(imp.getExt()).fieldNames())
375373
.filter(bidder -> isValidBidder(bidder, aliases)))
376374
.distinct()
377375
.collect(Collectors.toList());
378376

379-
return makeBidderRequests(bidders, context, aliases, imps);
377+
return makeBidderRequests(bidders, context, aliases, storedResponseResult.getImpBidderToStoredBidResponse(),
378+
imps);
380379
}
381380

382381
private static JsonNode bidderParamsFromImpExt(ObjectNode ext) {
@@ -408,6 +407,7 @@ private boolean isValidBidder(String bidder, BidderAliases aliases) {
408407
private Future<List<BidderRequest>> makeBidderRequests(List<String> bidders,
409408
AuctionContext context,
410409
BidderAliases aliases,
410+
Map<String, Map<String, String>> impBidderToStoredResponse,
411411
List<Imp> imps) {
412412

413413
final BidRequest bidRequest = context.getBidRequest();
@@ -424,7 +424,8 @@ private Future<List<BidderRequest>> makeBidderRequests(List<String> bidders,
424424
return privacyEnforcementService
425425
.mask(context, bidderToUser, bidders, aliases)
426426
.map(bidderToPrivacyResult ->
427-
getBidderRequests(bidderToPrivacyResult, bidRequest, imps, biddersToConfigs));
427+
getBidderRequests(bidderToPrivacyResult, bidRequest, impBidderToStoredResponse, imps,
428+
biddersToConfigs));
428429
}
429430

430431
private Map<String, ExtBidderConfigOrtb> getBiddersToConfigs(ExtRequest requestExt) {
@@ -576,6 +577,7 @@ private String resolveCookieFamilyName(String bidder) {
576577
*/
577578
private List<BidderRequest> getBidderRequests(List<BidderPrivacyResult> bidderPrivacyResults,
578579
BidRequest bidRequest,
580+
Map<String, Map<String, String>> impBidderToStoredBidResponse,
579581
List<Imp> imps,
580582
Map<String, ExtBidderConfigOrtb> biddersToConfigs) {
581583

@@ -588,6 +590,7 @@ private List<BidderRequest> getBidderRequests(List<BidderPrivacyResult> bidderPr
588590
.map(bidderPrivacyResult -> createBidderRequest(
589591
bidderPrivacyResult,
590592
bidRequest,
593+
impBidderToStoredBidResponse,
591594
imps,
592595
biddersToConfigs,
593596
bidderToPrebidBidders))
@@ -624,6 +627,7 @@ private static Map<String, JsonNode> bidderToPrebidBidders(BidRequest bidRequest
624627
*/
625628
private BidderRequest createBidderRequest(BidderPrivacyResult bidderPrivacyResult,
626629
BidRequest bidRequest,
630+
Map<String, Map<String, String>> impBidderToStoredBidResponse,
627631
List<Imp> imps,
628632
Map<String, ExtBidderConfigOrtb> biddersToConfigs,
629633
Map<String, JsonNode> bidderToPrebidBidders) {
@@ -650,7 +654,12 @@ private BidderRequest createBidderRequest(BidderPrivacyResult bidderPrivacyResul
650654
return null;
651655
}
652656

653-
return BidderRequest.of(bidder, bidRequest.toBuilder()
657+
// stored bid response supported only for single imp requests
658+
final String storedBidResponse = impBidderToStoredBidResponse.size() == 1
659+
? impBidderToStoredBidResponse.get(imps.get(0).getId()).get(bidder)
660+
: null;
661+
662+
return BidderRequest.of(bidder, storedBidResponse, bidRequest.toBuilder()
654663
// User was already prepared above
655664
.user(bidderPrivacyResult.getUser())
656665
.device(bidderPrivacyResult.getDevice())
@@ -889,7 +898,7 @@ private Future<BidderResponse> requestBids(BidderRequest bidderRequest,
889898
final Bidder<?> bidder = bidderCatalog.bidderByName(aliases.resolveBidder(bidderName));
890899
final long startTime = clock.millis();
891900

892-
return httpBidderRequester.requestBids(bidder, bidderRequest.getBidRequest(), timeout, debugEnabled)
901+
return httpBidderRequester.requestBids(bidder, bidderRequest, timeout, debugEnabled)
893902
.map(seatBid -> BidderResponse.of(bidderName, seatBid, responseTime(startTime)));
894903
}
895904

0 commit comments

Comments
 (0)