Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add adUnitCode to the imp.ext.prebid exception list #3610

Merged
merged 9 commits into from
Jan 28, 2025
44 changes: 15 additions & 29 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.ExtImpPrebid;
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,33 +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 ExtImpPrebid 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)
.bidder(null)
.build());
}
final Iterator<String> fieldsIterator = extImpPrebid.fieldNames();
final ObjectNode modifiedExtImpPrebid = extImpPrebid.deepCopy();

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);
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 @@ -61,4 +61,10 @@ public class ExtImpPrebid {
* 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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ class ImpExtPrebid {
ImpExtPrebidFloors floors
Map passThrough
Map<BidderName, Imp> imp
String adUnitCode
PrebidOptions options


static ImpExtPrebid getDefaultImpExtPrebid() {
new ImpExtPrebid().tap {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class Prebid {
List<MultiBid> multibid
Pbs pbs
Server server
Map<BidderName, Map<String, Integer>> bidderParams
Map bidderParams
ExtPrebidFloors floors
Map passThrough
Events events
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.prebid.server.functional.model.request.auction

import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming
import groovy.transform.ToString

@ToString(includeNames = true, ignoreNulls = true)
@JsonNaming(PropertyNamingStrategies.LowerCaseStrategy)
class PrebidOptions {

Boolean echoVideoAttrs
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package org.prebid.server.functional.model.request.auction

import groovy.transform.EqualsAndHashCode
import groovy.transform.ToString

@ToString(includeNames = true)
@EqualsAndHashCode
class PrebidStoredRequest {

String id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.prebid.server.functional.model.response.auction

import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming
import org.prebid.server.functional.model.request.auction.Video

@JsonNaming(PropertyNamingStrategies.LowerCaseStrategy)
class Prebid {
Expand All @@ -13,4 +14,5 @@ class Prebid {
Events events
Meta meta
Map passThrough
Video storedRequestAttributes
}
Loading
Loading