Skip to content

Commit

Permalink
Rubicon Bidder: Remove imp.ext.prebid populating
Browse files Browse the repository at this point in the history
  • Loading branch information
AntoxaAntoxic committed Jan 17, 2025
1 parent 6c1e3e4 commit c545a24
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 329 deletions.
43 changes: 15 additions & 28 deletions src/main/java/org/prebid/server/auction/ExchangeService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.prebid.server.auction;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.iab.openrtb.request.App;
Expand Down Expand Up @@ -56,7 +55,6 @@
import org.prebid.server.bidder.model.Price;
import org.prebid.server.cookie.UidsCookie;
import org.prebid.server.exception.InvalidRequestException;
import org.prebid.server.exception.PreBidException;
import org.prebid.server.execution.timeout.Timeout;
import org.prebid.server.execution.timeout.TimeoutFactory;
import org.prebid.server.floors.PriceFloorAdjuster;
Expand All @@ -79,8 +77,6 @@
import org.prebid.server.proto.openrtb.ext.request.ExtApp;
import org.prebid.server.proto.openrtb.ext.request.ExtBidderConfigOrtb;
import org.prebid.server.proto.openrtb.ext.request.ExtDooh;
import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebidBidderFields;
import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebidFloors;
import org.prebid.server.proto.openrtb.ext.request.ExtRequest;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidBidderConfig;
Expand Down Expand Up @@ -126,6 +122,8 @@ public class ExchangeService {
private static final Integer DEFAULT_MULTIBID_LIMIT_MAX = 9;
private static final String EID_ALLOWED_FOR_ALL_BIDDERS = "*";
private static final BigDecimal THOUSAND = BigDecimal.valueOf(1000);
private static final Set<String> BIDDER_FIELDS_EXCEPTION_LIST = Set.of(
"adunitcode", "storedrequest", "options", "is_rewarded_inventory");

private final double logSamplingRate;
private final BidderCatalog bidderCatalog;
Expand Down Expand Up @@ -870,7 +868,7 @@ private Imp prepareImp(Imp imp,
return imp.toBuilder()
.bidfloor(adjustedPrice.getValue())
.bidfloorcur(adjustedPrice.getCurrency())
.ext(prepareImpExt(bidder, imp.getExt(), adjustedPrice.getValue(), transmitTid, useFirstPartyData))
.ext(prepareImpExt(bidder, imp.getExt(), transmitTid, useFirstPartyData))
.build();
}

Expand All @@ -885,11 +883,10 @@ private Price resolveBidPrice(Imp imp,

private ObjectNode prepareImpExt(String bidder,
ObjectNode impExt,
BigDecimal adjustedFloor,
boolean transmitTid,
boolean useFirstPartyData) {
final JsonNode bidderNode = bidderParamsFromImpExt(impExt).get(bidder);
final JsonNode impExtPrebid = prepareImpExt(impExt.get(PREBID_EXT), adjustedFloor);
final JsonNode impExtPrebid = cleanUpImpExtPrebid(impExt.get(PREBID_EXT));
Optional.ofNullable(impExtPrebid).ifPresentOrElse(
ext -> impExt.set(PREBID_EXT, ext),
() -> impExt.remove(PREBID_EXT));
Expand All @@ -901,32 +898,22 @@ private ObjectNode prepareImpExt(String bidder,
return fpdResolver.resolveImpExt(impExt, useFirstPartyData);
}

private JsonNode prepareImpExt(JsonNode extImpPrebidNode, BigDecimal adjustedFloor) {
if (extImpPrebidNode.size() <= 1) {
private JsonNode cleanUpImpExtPrebid(JsonNode extImpPrebid) {
if (extImpPrebid.size() <= 1) {
return null;
}

final ExtImpPrebidBidderFields extImpPrebid = extImpPrebid(extImpPrebidNode);
final ExtImpPrebidFloors floors = extImpPrebid.getFloors();
final ExtImpPrebidFloors updatedFloors = floors != null
? ExtImpPrebidFloors.of(floors.getFloorRule(),
floors.getFloorRuleValue(),
adjustedFloor,
floors.getFloorMin(),
floors.getFloorMinCur())
: null;

return mapper.mapper().valueToTree(extImpPrebid(extImpPrebidNode).toBuilder()
.floors(updatedFloors)
.build());
}
final Iterator<String> fieldsIterator = extImpPrebid.fieldNames();
final ObjectNode modifiedExtImpPrebid = extImpPrebid.deepCopy();

private ExtImpPrebidBidderFields extImpPrebid(JsonNode extImpPrebid) {
try {
return mapper.mapper().treeToValue(extImpPrebid, ExtImpPrebidBidderFields.class);
} catch (JsonProcessingException e) {
throw new PreBidException("Error decoding imp.ext.prebid: " + e.getMessage(), e);
while (fieldsIterator.hasNext()) {
final String fieldName = fieldsIterator.next();
if (!BIDDER_FIELDS_EXCEPTION_LIST.contains(fieldName)) {
modifiedExtImpPrebid.remove(fieldName);
}
}

return modifiedExtImpPrebid;
}

private App prepareApp(App app, ObjectNode fpdApp, boolean useFirstPartyData) {
Expand Down
48 changes: 2 additions & 46 deletions src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.prebid.server.bidder.rubicon;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
Expand Down Expand Up @@ -52,7 +51,6 @@
import org.prebid.server.bidder.rubicon.proto.request.RubiconExtPrebidBiddersBidder;
import org.prebid.server.bidder.rubicon.proto.request.RubiconExtPrebidBiddersBidderDebug;
import org.prebid.server.bidder.rubicon.proto.request.RubiconImpExt;
import org.prebid.server.bidder.rubicon.proto.request.RubiconImpExtPrebid;
import org.prebid.server.bidder.rubicon.proto.request.RubiconImpExtRp;
import org.prebid.server.bidder.rubicon.proto.request.RubiconImpExtRpRtb;
import org.prebid.server.bidder.rubicon.proto.request.RubiconImpExtRpTrack;
Expand Down Expand Up @@ -89,7 +87,6 @@
import org.prebid.server.proto.openrtb.ext.request.ExtDevice;
import org.prebid.server.proto.openrtb.ext.request.ExtImpContextDataAdserver;
import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebid;
import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebidFloors;
import org.prebid.server.proto.openrtb.ext.request.ExtPublisher;
import org.prebid.server.proto.openrtb.ext.request.ExtRegs;
import org.prebid.server.proto.openrtb.ext.request.ExtRegsDsa;
Expand Down Expand Up @@ -507,16 +504,7 @@ private Imp makeImp(Imp imp,
final Imp.ImpBuilder builder = imp.toBuilder()
.metric(makeMetrics(imp))
.ext(mapper.mapper().valueToTree(
makeImpExt(
imp,
bidRequest,
extImpRubicon,
resolvedFormats,
site,
app,
extRequest,
ipfCurrency,
priceFloorResult)));
makeImpExt(imp, extImpRubicon, resolvedFormats, site, app, extRequest)));

final BigDecimal resolvedBidFloor = ipfFloor != null
? convertToXAPICurrency(ipfFloor, ipfCurrency, imp, bidRequest)
Expand Down Expand Up @@ -672,18 +660,11 @@ private BigDecimal convertBidFloorCurrency(BigDecimal bidFloor,
}

private RubiconImpExt makeImpExt(Imp imp,
BidRequest bidRequest,
ExtImpRubicon rubiconImpExt,
Set<ImpMediaType> formats,
Site site,
App app,
ExtRequest extRequest,
String ipfResolvedCurrency,
PriceFloorResult priceFloorResult) {

final RubiconImpExtPrebid rubiconImpExtPrebid = priceFloorResult != null
? makeRubiconExtPrebid(priceFloorResult, ipfResolvedCurrency, imp, bidRequest)
: null;
ExtRequest extRequest) {

final RubiconImpExtRpRtb rubiconImpExtRpRtb = CollectionUtils.isNotEmpty(formats)
? RubiconImpExtRpRtb.of(formats)
Expand All @@ -702,7 +683,6 @@ private RubiconImpExt makeImpExt(Imp imp,
.gpid(getGpid(imp.getExt()))
.skadn(getSkadn(imp.getExt()))
.tid(getTid(imp.getExt()))
.prebid(rubiconImpExtPrebid)
.build();
}

Expand All @@ -722,30 +702,6 @@ private JsonNode makeTarget(Imp imp, ExtImpRubicon rubiconImpExt, Site site, App
return result;
}

private RubiconImpExtPrebid makeRubiconExtPrebid(PriceFloorResult priceFloorResult,
String currency,
Imp imp,
BidRequest bidRequest) {
final ObjectNode impExt = imp.getExt();
final ExtImpPrebid extImpPrebid = extImpPrebid(impExt.get(PREBID_EXT));
final ExtImpPrebidFloors floors = extImpPrebid != null ? extImpPrebid.getFloors() : null;

return RubiconImpExtPrebid.of(ExtImpPrebidFloors.of(
priceFloorResult.getFloorRule(),
convertToXAPICurrency(priceFloorResult.getFloorRuleValue(), currency, imp, bidRequest),
convertToXAPICurrency(priceFloorResult.getFloorValue(), currency, imp, bidRequest),
floors != null ? floors.getFloorMin() : null,
floors != null ? floors.getFloorMinCur() : null));
}

private ExtImpPrebid extImpPrebid(JsonNode extImpPrebid) {
try {
return mapper.mapper().treeToValue(extImpPrebid, ExtImpPrebid.class);
} catch (JsonProcessingException e) {
throw new PreBidException("Error decoding imp.ext.prebid: " + e.getMessage(), e);
}
}

private void mergeFirstPartyDataFromSite(Site site, ObjectNode result) {
// merge OPENRTB.site.ext.data.* to every impression – XAPI.imp[].ext.rp.target.*
final ExtSite siteExt = site != null ? site.getExt() : null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,68 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import lombok.Builder;
import lombok.Value;

import java.util.List;

@Data
@SuperBuilder(toBuilder = true)
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
public class ExtImpPrebid extends ExtImpPrebidBidderFields {
/**
* Defines the contract for bidrequest.imp[i].ext.prebid
*/
@Builder(toBuilder = true)
@Value
public class ExtImpPrebid {

/**
* Defines the contract for bidrequest.imp[i].ext.prebid.storedrequest
*/
ExtStoredRequest storedrequest;

/**
* Defines the contract for bidrequest.imp[i].ext.prebid.storedauctionresponse
*/
@JsonProperty("storedauctionresponse")
ExtStoredAuctionResponse storedAuctionResponse;

/**
* Defines the contract for bidrequest.imp[i].ext.prebid.storedbidresponse
*/
@JsonProperty("storedbidresponse")
List<ExtStoredBidResponse> storedBidResponse;

/**
* Defines the contract for bidrequest.imp[i].ext.prebid.options
*/
ExtOptions options;

/**
* Defines the contract for bidrequest.imp[i].ext.prebid.is_rewarded_inventory
*/
Integer isRewardedInventory;

/**
* Defines the contract for bidrequest.imp[i].ext.prebid.BIDDER
*/
ObjectNode bidder;

/**
* Defines the contract for bidrequest.imp[i].ext.prebid.floors
*/
ExtImpPrebidFloors floors;

/**
* Defines the contract for bidrequest.imp[i].ext.prebid.passthrough
*/
JsonNode passthrough;

/**
* Defines the contract for bidrequest.imp[i].ext.prebid.imp
*/
ObjectNode imp;

/**
* Defines the contract for bidrequest.imp[i].ext.prebid.adunitcode
*/
@JsonProperty("adunitcode")
String adUnitCode;
}

This file was deleted.

34 changes: 0 additions & 34 deletions src/test/java/org/prebid/server/auction/ExchangeServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3667,44 +3667,10 @@ public void shouldProperPopulateImpExtPrebid() {
"storedrequest", Map.of("id", "id"),
"options", Map.of("echovideoattrs", true),
"is_rewarded_inventory", 1,
"floors", Map.of("floorRule", "rule"),
"adunitcode", "adCodeValue"),
"bidder", Map.of("test-host", "unknownHost", "publisher_id", "ps4"))));
}

@Test
public void shouldThrowErrorIfCannotBeParsedImpExtPrebid() {
// given
final String prebid = "prebid";
final String bidderKey = "bidder";
final String optionKey = "options";
final String bidderName = "bidderName";
final String optionValue = "1";
final Map<String, Map<String, String>> bidderValue =
singletonMap(bidderName, Map.of("test-host", "unknownHost", "publisher_id", "ps4"));

final ObjectNode prebidJsonNodes = mapper.valueToTree(
singletonMap(prebid, Map.of(optionKey, optionValue, bidderKey, bidderValue)));

final Imp imp = Imp.builder().ext(prebidJsonNodes).build();
final BidRequest bidRequest = givenBidRequest(singletonList(imp), identity());
final AuctionContext auctionContext = givenRequestContext(bidRequest);

given(privacyEnforcementService.mask(any(), anyMap(), any()))
.willReturn(Future.succeededFuture(singletonList(BidderPrivacyResult.builder()
.requestBidder(bidderName)
.build())));

// when
final Future<AuctionContext> result = target.holdAuction(auctionContext);

// then
assertThat(result.failed()).isTrue();
assertThat(result.cause())
.hasMessageStartingWith("Error decoding imp.ext.prebid: "
+ "Cannot construct instance of `org.prebid.server.proto.openrtb.ext.request.ExtOptions`");
}

@Test
public void shouldReturnsSourceWithCorrespondingRequestExtPrebidSchainsIfSchainIsNotNull() {
// given
Expand Down
Loading

0 comments on commit c545a24

Please sign in to comment.