1919import io .vertx .core .CompositeFuture ;
2020import io .vertx .core .Future ;
2121import org .apache .commons .collections4 .CollectionUtils ;
22- import org .apache .commons .collections4 .ListUtils ;
2322import org .apache .commons .collections4 .map .CaseInsensitiveMap ;
2423import org .apache .commons .lang3 .ObjectUtils ;
2524import org .apache .commons .lang3 .StringUtils ;
3231import org .prebid .server .activity .infrastructure .payload .impl .BidRequestActivityInvocationPayload ;
3332import org .prebid .server .auction .aliases .AlternateBidderCodesConfig ;
3433import org .prebid .server .auction .aliases .BidderAliases ;
34+ import org .prebid .server .auction .bidderrequestpostprocessor .BidderRequestPostProcessor ;
35+ import org .prebid .server .auction .bidderrequestpostprocessor .BidderRequestRejectedException ;
3536import org .prebid .server .auction .externalortb .StoredResponseProcessor ;
36- import org .prebid .server .auction .mediatypeprocessor .MediaTypeProcessingResult ;
37- import org .prebid .server .auction .mediatypeprocessor .MediaTypeProcessor ;
3837import org .prebid .server .auction .model .AuctionContext ;
3938import org .prebid .server .auction .model .AuctionParticipation ;
4039import org .prebid .server .auction .model .BidRejectionReason ;
5251import org .prebid .server .auction .versionconverter .OrtbVersion ;
5352import org .prebid .server .bidder .Bidder ;
5453import org .prebid .server .bidder .BidderCatalog ;
55- import org .prebid .server .bidder .BidderInfo ;
5654import org .prebid .server .bidder .HttpBidderRequester ;
5755import org .prebid .server .bidder .Usersyncer ;
5856import org .prebid .server .bidder .model .BidderBid ;
@@ -143,7 +141,7 @@ public class ExchangeService {
143141 private final ImpAdjuster impAdjuster ;
144142 private final SupplyChainResolver supplyChainResolver ;
145143 private final DebugResolver debugResolver ;
146- private final MediaTypeProcessor mediaTypeProcessor ;
144+ private final BidderRequestPostProcessor bidderRequestPostProcessor ;
147145 private final UidUpdater uidUpdater ;
148146 private final TimeoutResolver timeoutResolver ;
149147 private final TimeoutFactory timeoutFactory ;
@@ -170,7 +168,7 @@ public ExchangeService(double logSamplingRate,
170168 ImpAdjuster impAdjuster ,
171169 SupplyChainResolver supplyChainResolver ,
172170 DebugResolver debugResolver ,
173- MediaTypeProcessor mediaTypeProcessor ,
171+ BidderRequestPostProcessor bidderRequestPostProcessor ,
174172 UidUpdater uidUpdater ,
175173 TimeoutResolver timeoutResolver ,
176174 TimeoutFactory timeoutFactory ,
@@ -197,7 +195,7 @@ public ExchangeService(double logSamplingRate,
197195 this .impAdjuster = Objects .requireNonNull (impAdjuster );
198196 this .supplyChainResolver = Objects .requireNonNull (supplyChainResolver );
199197 this .debugResolver = Objects .requireNonNull (debugResolver );
200- this .mediaTypeProcessor = Objects .requireNonNull (mediaTypeProcessor );
198+ this .bidderRequestPostProcessor = Objects .requireNonNull (bidderRequestPostProcessor );
201199 this .uidUpdater = Objects .requireNonNull (uidUpdater );
202200 this .timeoutResolver = Objects .requireNonNull (timeoutResolver );
203201 this .timeoutFactory = Objects .requireNonNull (timeoutFactory );
@@ -491,13 +489,12 @@ private Future<List<AuctionParticipation>> extractAuctionParticipations(
491489 .filter (bidder -> isBidderCallActivityAllowed (bidder , context ))
492490 .distinct ()
493491 .toList ();
494- final Map <String , Map <String , String >> impBidderToStoredBidResponse =
495- storedResponseResult .getImpBidderToStoredBidResponse ();
492+
496493 return makeAuctionParticipation (
497494 bidders ,
498495 context ,
499496 aliases ,
500- impBidderToStoredBidResponse ,
497+ storedResponseResult . getImpBidderToStoredBidResponse () ,
501498 imps ,
502499 bidderToMultiBid );
503500 }
@@ -538,7 +535,7 @@ private Future<List<AuctionParticipation>> makeAuctionParticipation(
538535
539536 final BidRequest bidRequest = context .getBidRequest ();
540537 final ExtRequest requestExt = bidRequest .getExt ();
541- final ExtRequestPrebid prebid = requestExt == null ? null : requestExt .getPrebid ();
538+ final ExtRequestPrebid prebid = requestExt != null ? requestExt .getPrebid () : null ;
542539 final Map <String , ExtBidderConfigOrtb > biddersToConfigs = getBiddersToConfigs (prebid );
543540 final EidPermissionHolder eidPermissionHolder = getEidPermissions (prebid );
544541 final Map <String , Pair <User , Device >> bidderToUserAndDevice =
@@ -1154,69 +1151,39 @@ private Future<BidderResponse> processAndRequestBids(AuctionContext auctionConte
11541151 Timeout timeout ,
11551152 BidderAliases aliases ) {
11561153
1157- final String bidderName = bidderRequest .getBidder ();
1158- final MediaTypeProcessingResult mediaTypeProcessingResult = mediaTypeProcessor .process (
1159- bidderRequest .getBidRequest (), bidderName , aliases , auctionContext .getAccount ());
1160- final List <BidderError > mediaTypeProcessingErrors = mediaTypeProcessingResult .getErrors ();
1161- if (mediaTypeProcessingResult .isRejected ()) {
1162- return processReject (
1163- auctionContext ,
1164- BidRejectionReason .REQUEST_BLOCKED_UNSUPPORTED_MEDIA_TYPE ,
1165- mediaTypeProcessingErrors ,
1166- bidderName );
1167- }
1168- if (isUnacceptableCurrency (auctionContext , aliases .resolveBidder (bidderName ))) {
1169- return processReject (
1170- auctionContext ,
1171- BidRejectionReason .REQUEST_BLOCKED_UNACCEPTABLE_CURRENCY ,
1172- List .of (BidderError .generic ("No match between the configured currencies and bidRequest.cur" )),
1173- bidderName );
1174- }
1175-
1176- return Future .succeededFuture (mediaTypeProcessingResult .getBidRequest ())
1177- .map (bidderRequest ::with )
1178- .compose (modifiedBidderRequest -> invokeHooksAndRequestBids (
1179- auctionContext , modifiedBidderRequest , timeout , aliases ))
1180- .map (bidderResponse -> bidderResponse .with (
1181- addWarnings (bidderResponse .getSeatBid (), mediaTypeProcessingErrors )));
1182- }
1183-
1184- private boolean isUnacceptableCurrency (AuctionContext auctionContext , String originalBidderName ) {
1185- final List <String > requestCurrencies = auctionContext .getBidRequest ().getCur ();
1186- final List <String > bidAcceptableCurrencies =
1187- Optional .ofNullable (bidderCatalog .bidderInfoByName (originalBidderName ))
1188- .map (BidderInfo ::getCurrencyAccepted )
1189- .orElse (null );
1190-
1191- if (CollectionUtils .isEmpty (requestCurrencies ) || CollectionUtils .isEmpty (bidAcceptableCurrencies )) {
1192- return false ;
1193- }
1194-
1195- return !CollectionUtils .containsAny (requestCurrencies , bidAcceptableCurrencies );
1196- }
1197-
1198- private static Future <BidderResponse > processReject (AuctionContext auctionContext ,
1199- BidRejectionReason bidRejectionReason ,
1200- List <BidderError > warnings ,
1201- String bidderName ) {
1202-
1203- auctionContext .getBidRejectionTrackers ()
1204- .get (bidderName )
1205- .rejectAll (bidRejectionReason );
1206- final BidderSeatBid bidderSeatBid = BidderSeatBid .builder ()
1207- .warnings (warnings )
1208- .build ();
1209- return Future .succeededFuture (BidderResponse .of (bidderName , bidderSeatBid , 0 ));
1154+ return bidderRequestPostProcessor .process (bidderRequest , aliases , auctionContext )
1155+ .compose (result -> invokeHooksAndRequestBids (auctionContext , result .getValue (), timeout , aliases )
1156+ .map (response -> response .with (addWarnings (response .getSeatBid (), result .getErrors ()))))
1157+ .recover (throwable -> recoverBidderRequestRejection (
1158+ auctionContext , bidderRequest .getBidder (), throwable ));
12101159 }
12111160
12121161 private static BidderSeatBid addWarnings (BidderSeatBid seatBid , List <BidderError > warnings ) {
12131162 return CollectionUtils .isNotEmpty (warnings )
12141163 ? seatBid .toBuilder ()
1215- .warnings (ListUtils .union (warnings , seatBid .getWarnings ()))
1164+ .warnings (ListUtil .union (warnings , seatBid .getWarnings ()))
12161165 .build ()
12171166 : seatBid ;
12181167 }
12191168
1169+ private static Future <BidderResponse > recoverBidderRequestRejection (AuctionContext auctionContext ,
1170+ String bidderName ,
1171+ Throwable throwable ) {
1172+
1173+ if (throwable instanceof BidderRequestRejectedException rejection ) {
1174+ auctionContext .getBidRejectionTrackers ()
1175+ .get (bidderName )
1176+ .rejectAll (rejection .getRejectionReason ());
1177+ final BidderSeatBid bidderSeatBid = BidderSeatBid .builder ()
1178+ .warnings (rejection .getErrors ())
1179+ .build ();
1180+
1181+ return Future .succeededFuture (BidderResponse .of (bidderName , bidderSeatBid , 0 ));
1182+ }
1183+
1184+ return Future .failedFuture (throwable );
1185+ }
1186+
12201187 private Future <BidderResponse > invokeHooksAndRequestBids (AuctionContext auctionContext ,
12211188 BidderRequest bidderRequest ,
12221189 Timeout timeout ,
0 commit comments