-
Notifications
You must be signed in to change notification settings - Fork 753
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 alternatebiddercodes in Prebid request ext #2339
Add alternatebiddercodes in Prebid request ext #2339
Conversation
eac5ba9
to
06ae526
Compare
exchange/utils.go
Outdated
extCopy.Prebid.AlternateBidderCodes = nil | ||
|
||
//fill request.ext.prebid.alternatebiddercode to have data only of the current bidder | ||
if unpackedExt.Prebid.AlternateBidderCodes != nil && len(unpackedExt.Prebid.AlternateBidderCodes.Bidders) != 0 { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we want to pass openrtb_ext.ExtAlternateBidderCodes{Enabled: true/false}
to the bidders that are not present in the list req.ext?.
i.e.
if unpackedExt.Prebid.AlternateBidderCodes != nil && len(unpackedExt.Prebid.AlternateBidderCodes.Bidders) != 0 {
extCopy.Prebid.AlternateBidderCodes = &openrtb_ext.ExtAlternateBidderCodes{
Enabled: unpackedExt.Prebid.AlternateBidderCodes.Enabled,
}
if bidderCodes, ok := unpackedExt.Prebid.AlternateBidderCodes.Bidders[bidder]; ok {
extCopy.Prebid.AlternateBidderCodes.Bidders = map[string]openrtb_ext.ExtAdapterAlternateBidderCodes{
bidder: bidderCodes,
}
}
}
Current changes do not pass it as I don't find any use case for the same.
06ae526
to
171b9b1
Compare
Code looks good, local testing looks good too. |
config/accounts.go
Outdated
CookieSync CookieSync `mapstructure:"cookie_sync" json:"cookie_sync"` | ||
Events Events `mapstructure:"events" json:"events"` // Don't enable this feature. It is still under developmment - https://github.com/prebid/prebid-server/issues/1725 | ||
TruncateTargetAttribute *int `mapstructure:"truncate_target_attr" json:"truncate_target_attr"` | ||
AlternateBidderCodes *AlternateBidderCodes `mapstructure:"alternatebiddercodes" json:"alternatebiddercodes"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why are we changing this to a pointer? I thought we wanted an empty object if alternatebiddercodes
didn't exist in the fetched account so that Enabled
is set to its default value of false
which would make this an opt-in feature. Do we need to detect presence when determining whether to use the account config values?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reverted the change. Yes, I did it to detect the presence of account config values but I guess we don't need it.
btw, we would need the AlternateBidderCodes in the request.ext to be pointer to detect its presence and to choose between request and account values.
exchange/exchange.go
Outdated
@@ -245,6 +245,8 @@ func (e *exchange) HoldAuction(ctx context.Context, r AuctionRequest, debugLog * | |||
} | |||
} | |||
|
|||
setExtAlternateBidderCodes(requestExt, r.Account.AlternateBidderCodes) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This function appears to merge the alternate bidder codes account config with the request resulting in a modified request ext which seems a little odd to me. Perhaps it would be better if this function created a new instance of AlternateBidderCodes
so requestExt
is left unmodified. I'm not seeing the value in modifying it and I think this can lead to confusion.
I do see that you're making use of the alternate bidder codes set on the requestExt
in CleanOpenRTBRequests
and that function has a lot of parameters but I suggest you add another parameter there to pass this new AlternateBidderCodes
object in and we can worry about getting the number of parameters down in a future refactor.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sure, moved setExtAlternateBidderCodes
's code into CleanOpenRTBRequests
's buildRequestExtForBidder
.
It looks messy now, too many scenarios, although tried to cover all them in unit tests.
exchange/utils.go
Outdated
|
||
// getExtAlternateBidderCodes map config.account.alternatebiddercodes to ext.prebid.alternatebiddercodes | ||
func setExtAlternateBidderCodes(requestExt *openrtb_ext.ExtRequest, cfgABC *config.AlternateBidderCodes) { | ||
if requestExt == nil || requestExt.Prebid.AlternateBidderCodes != nil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If requestExt
is nil, shouldn't we still consider any alternate bidder codes defined in the account config?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
missed this one. Updated the code in buildRequestExtForBidder
and added unit test for the same.
"alternatebiddercodes": { | ||
"enabled": true, | ||
"bidders": { | ||
"pubmatic": { | ||
"enabled": true, | ||
"allowedbiddercodes": ["groupm"] | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm thinking that maybe we should include an expectRequest
object under outgoingRequests
for each of the two bidders so we can verify the appropriate alternate bidder code "groupm" was added to the pubmatic bid request but not to the appnexus bid request. Otherwise, this test is just verifying that the alternatebiddercodes
object in the original request is well-formed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agreed, also I could not test end to end flow at one place where we could validate outgoing and incoming request as these json file based tests mock requestBid
function which has alternatebiddercodes validation.
Hence, I wrote TestOverrideConfigAlternateBidderCodesWithRequestValues
to cover the validation of alternatebiddercodes coming as response from adapters and added unit tests in all the possible functions that could change request.ext.prebid. alternatebiddercodes
to cover the request to adapters part. Ex. setExtAlternateBidderCodes
and CleanOpenRTBRequests
(now clubbed).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
added expectRequest
Hi @bsardo, I've address the comments. Could you review the same. |
exchange/utils.go
Outdated
@@ -48,6 +49,7 @@ func cleanOpenRTBRequests(ctx context.Context, | |||
gdprPermsBuilder gdpr.PermissionsBuilder, | |||
tcf2ConfigBuilder gdpr.TCF2ConfigBuilder, | |||
hostSChainNode *openrtb2.SupplyChainNode, | |||
cfgABC config.AlternateBidderCodes, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is the account config alternate bidder codes right? We could actually remove this parameter here and just grab it off of the parameter auctionReq AuctionRequest
which has the account on it. Sorry about that. I didn't realize it was available in this function already until just now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
exchange/utils.go
Outdated
alternateBidderCodes = &openrtb_ext.ExtAlternateBidderCodes{ | ||
Bidders: map[string]openrtb_ext.ExtAdapterAlternateBidderCodes{ | ||
bidder: bidderCodes, | ||
}, | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this should be:
alternateBidderCodes.Bidders = map[string]openrtb_ext.ExtAdapterAlternateBidderCodes{
bidder: bidderCodes,
}
alternateBidderCodes
was created just above with Enabled
appropriately set.
If you agree, we may need another test case in TestCleanOpenRTBRequestsFilterBidderRequestExt
because this wasn't caught.
I think maybe the test case is something like:
{
desc: "Nil request ext, alternatebiddercodes config enabled with bidder code for only one bidder",
inExt: nil,
inCfgABC: config.AlternateBidderCodes{
Enabled: true,
Bidders: map[string]openrtb_ext.ExtAdapterAlternateBidderCodes{
"pubmatic": {
Enabled: true,
AllowedBidderCodes: []string{"groupm"},
},
},
},
wantExt: []json.RawMessage{
json.RawMessage(`{"prebid":{"alternatebiddercodes":{"enabled":true,"bidders":null}}}`),
json.RawMessage(`{"prebid":{"alternatebiddercodes":{"enabled":true,"bidders":{"pubmatic":{"enabled":true,"allowedbiddercodes":["groupm"]}}}}}`),
},
wantError: false,
},
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done. Added similar test case for buildRequestExtForBidder()
exchange/utils.go
Outdated
// default case where alternatebiddercode is either not defined in account config or defined with default values, | ||
// do not fill alternatebiddercode in such scenario to keep the request payload as is (regression) | ||
if reflect.DeepEqual(openrtb_ext.ExtAlternateBidderCodes{}, *alternateBidderCodes) { | ||
if len(requestExt) == 0 || requestExtParsed == nil { | ||
return json.RawMessage(``), nil | ||
} | ||
alternateBidderCodes = nil | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We generally try to avoid using the reflect package. Is there an alternative?
What if we change this to:
if alternateBidderCodes.Enabled == false && alternateBidderCodes.Bidders == nil {
alternateBidderCodes = nil
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
if len(requestExt) == 0 || requestExtParsed == nil { | ||
return json.RawMessage(``), nil | ||
func buildRequestExtForBidder(bidder string, requestExt json.RawMessage, requestExtParsed *openrtb_ext.ExtRequest, bidderParamsInReqExt map[string]json.RawMessage, cfgABC config.AlternateBidderCodes) (json.RawMessage, error) { | ||
// Resolve alternatebiddercode for current bidder |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What if we extract the logic you have here that sets alternateBidderCodes
into its own function for readability?
The logic here could just be something like:
// Resolve alternatebiddercode for current bidder
var reqABC *openrtb_ext.ExtAlternateBidderCodes
if len(requestExt) != 0 && requestExtParsed != nil && requestExtParsed.Prebid.AlternateBidderCodes != nil {
reqABC = requestExtParsed.Prebid.AlternateBidderCodes
}
alternateBidderCodes := buildRequestExtAlternateBidderCodes(bidder, cfgABC, reqABC)
if (len(requestExt) == 0 || requestExtParsed == nil) && alternateBidderCodes == nil {
return json.RawMessage(``), nil
}
And then most of this logic is then extracted into a function with a signature like func buildRequestExtAlternateBidderCodes(bidder string, accABC config.AlternateBidderCodes, reqABC *openrtb_ext.ExtAlternateBidderCodes) (*openrtb_ext.ExtAlternateBidderCodes) {
Thoughts? You shouldn't need any new unit tests since this new function would just be a private method and you're already adequately testing the caller.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
@bsardo I've address the comments. Could you review the same. Thank you for the critical inputs. A good learning for my future PRs :) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code looks so much better and easier to understand now. LGTM
exchange/utils.go
Outdated
return &openrtb_ext.ExtAlternateBidderCodes{ | ||
Enabled: reqABC.Enabled, | ||
Bidders: map[string]openrtb_ext.ExtAdapterAlternateBidderCodes{ | ||
bidder: reqABC.Bidders[bidder], |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If the bidder isn't defined in the request config, I think this will create a map with the bidder name as the key and the value as an empty instance of ExtAdapterAlternateBidderCodes
rather than nil
. I think we want it to be nil
, in which case we would want to check if the key exists before making this assignment just like you do on lines 339-343.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done. Also added a test case for this scenario
exchange/exchange.go
Outdated
//This will be used validate bids | ||
alternateBidderCodes := openrtb_ext.ExtAlternateBidderCodes(r.Account.AlternateBidderCodes) | ||
if requestExt != nil && requestExt.Prebid.AlternateBidderCodes != nil { | ||
alternateBidderCodes = *requestExt.Prebid.AlternateBidderCodes | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It feels like this logic is in an odd place which has me wondering if it is even needed. With the current design where we pass alternateBidderCodes
into getAllBids
it makes sense. Ideally though I think we should be able use the alternate bidder codes attached to each bidder request when validating the bidders in the bid responses. Thoughts? Perhaps this is something for a future PR?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added this to make sure PBS-Core data is used to validate the adapter's response instead of relying on the data from adapter's request which could be altered by the adapter code.
json.RawMessage(`{"prebid":{"alternatebiddercodes":{"enabled":true,"bidders":null}}}`), | ||
json.RawMessage(`{"prebid":{"alternatebiddercodes":{"enabled":true,"bidders":null}}}`), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see a few instances where prebid.alternatebiddercodes.bidders
is null
. Perhaps this should be omitted if null, in which case we would add the omitempty
tag to the ExtAlternateBidderCodes.Bidders
field. Thoughts?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added omit empty to all the alternatebiddercodes fields.
The only downside I see here is that the SSPs would not know whether these fields were omitted by the user or by the PBS. One will have to refer the incoming payload to PBS to verify the same. I don't see any harm though.
cb28687
to
07a3091
Compare
Addressed the review comments. Had to rebase and force push to fix the master merge test failures. @bsardo Could you please review the latest changes. Thanks |
What is the holdup here can we get these changes merged? |
@abhinavsinha001 I'm waiting for a response on this #2174 (comment) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for your patience @pm-nilesh-chate. Please see my comments. I ran a bunch of manual tests with my suggested changes to make sure they were in line with my requirements analysis outlined in my comment in exchange/utils.go
. Let me know if you want to discuss.
openrtb_ext/alternatebiddercodes.go
Outdated
|
||
type ExtAdapterAlternateBidderCodes struct { | ||
Enabled bool `mapstructure:"enabled" json:"enabled"` | ||
AllowedBidderCodes []string `mapstructure:"allowedbiddercodes" json:"allowedbiddercodes,omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On second thought, I think we should remove this omitempty
tag going back to the way you originally had it. By removing it, if allowedbiddercodes
is absent for the bidder in the original request, it will be set to null
on the bidder request. This outcome will be different from when allowedbiddercodes
is set to an empty list on the original request which is good; we need to maintain that distinction because they have different meanings.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done, removed omitempty
tag.
openrtb_ext/alternatebiddercodes.go
Outdated
// ExtAlternateBidderCodes defines list of alternate bidder codes allowed by adatpers. This overrides host level configs. | ||
type ExtAlternateBidderCodes struct { | ||
Enabled bool `mapstructure:"enabled" json:"enabled"` | ||
Bidders map[string]ExtAdapterAlternateBidderCodes `mapstructure:"bidders" json:"bidders,omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I also think we should remove this omitempty
tag even though I don't see a behavioral issue similar to that of having omitempty
on allowedbiddercodes
. Removing this will just make things more consistent.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done, removed omitempty
tag.
exchange/utils.go
Outdated
} | ||
extMap["prebid"] = prebidJson | ||
|
||
return json.Marshal(extMap) | ||
} | ||
|
||
func buildRequestExtAlternateBidderCodes(bidder string, accABC config.AlternateBidderCodes, reqABC *openrtb_ext.ExtAlternateBidderCodes) *openrtb_ext.ExtAlternateBidderCodes { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
After looking more closely at the requirements, I believe we should aim for the following behavior:
- If
alternatebiddercodes
is not defined in the account or on the request, the field should be omitted from all bidder requests. - If
alternatebiddercodes
is defined either in the account or on the request but itsenabled
is not set, thealternatebiddercodes
field should be added to the bidder request with the default value of false. - The
alternatebiddercodes
object set on a bidder request should only contain its own bidder object in thebidders
field and it should match the bidder object in the account/request it was sourced from. Note an undefined map or slice in the original request or account will appear asnull
in a bidder request (we will need to get rid ofomitempty
), so that we can distinguish between an empty array/map and an undefined array/map.
Given the above, I'd like to suggest a couple of things here:
- In
config/accounts.go
, can we make the fieldAlternateBidderCodes
in theAccount
struct of type*AlternateBidderCodes
? - Let's get rid of the
if
block on line 348 that setsalternateBidderCodes = nil
. - I think this function ultimately looks like this:
if reqABC != nil {
alternateBidderCodes := &openrtb_ext.ExtAlternateBidderCodes{
Enabled: reqABC.Enabled,
}
if bidderCodes, ok := reqABC.Bidders[bidder]; ok {
alternateBidderCodes.Bidders = map[string]openrtb_ext.ExtAdapterAlternateBidderCodes{
bidder: bidderCodes,
}
}
return alternateBidderCodes
}
if accABC != nil {
alternateBidderCodes := &openrtb_ext.ExtAlternateBidderCodes{
Enabled: accABC.Enabled,
}
if bidderCodes, ok := accABC.Bidders[bidder]; ok {
alternateBidderCodes.Bidders = map[string]openrtb_ext.ExtAdapterAlternateBidderCodes{
bidder: bidderCodes,
}
}
return alternateBidderCodes
}
return nil
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done. made accABC
pointer to detect its presence.
exchange/exchange.go
Outdated
adapterBids, adapterExtra, anyBidsReturned = e.getAllBids(auctionCtx, bidderRequests, bidAdjustmentFactors, conversions, accountDebugAllow, r.GlobalPrivacyControlHeader, debugLog.DebugOverride, r.Account.AlternateBidderCodes, requestExt.Prebid.Experiment) | ||
|
||
//This will be used validate bids | ||
alternateBidderCodes := openrtb_ext.ExtAlternateBidderCodes(r.Account.AlternateBidderCodes) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See my related comment in exchange/utils.go
that asks for the account field to be converted to a pointer.
Should this be something like this now:
var alternateBidderCodes openrtb_ext.ExtAlternateBidderCodes
if r.Account.AlternateBidderCodes != nil {
alternateBidderCodes = openrtb_ext.ExtAlternateBidderCodes(*r.Account.AlternateBidderCodes)
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
exchange/utils.go
Outdated
} | ||
} | ||
|
||
if !alternateBidderCodes.Enabled && alternateBidderCodes.Bidders == nil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm wondering now if we should delete this if block. If we remove it, ext.prebid.alternatebiddercodes
in the bidder request will contain exactly what's pertinent to the bidder in the account config with the lone exception being that enabled
flags will be set to the default value false if not defined. This is the same behavior as if ext.prebid.alternatebiddercodes
were to be populated on the bidder request with information pulled from the original request, assuming we remove the couple of omitempty
tags I pointed out in my other comments.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
agreed. removed this code.
…174-read-alternatebiddercodes-from-request-ext-3
Hi @bsardo, I've addressed the comments. Please review the same. Fyi, last commit (master merge) is to address Trivy's check. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
config/accounts.go
Outdated
@@ -18,20 +16,22 @@ const ( | |||
IntegrationTypeWeb IntegrationType = "web" | |||
) | |||
|
|||
type AlternateBidderCodes openrtb_ext.ExtAlternateBidderCodes |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nitpick: What is the purpose of this type alias? The two reasons in Go to use a type alias is to provide a more descriptive name or to attach methods. Neither seem to apply. Perhaps it can be removed?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
btw, I did it to keep config's and extension's alternatebiddercodes distinguishable for reading.
Ex:
Original
func buildRequestExtAlternateBidderCodes(bidder string, accABC *config.AlternateBidderCodes, reqABC *openrtb_ext.ExtAlternateBidderCodes) *openrtb_ext.ExtAlternateBidderCodes {
Current (Both accABC
and reqABC
have same type now)
func buildRequestExtAlternateBidderCodes(bidder string, accABC *openrtb_ext.ExtAlternateBidderCodes, reqABC *openrtb_ext.ExtAlternateBidderCodes) *openrtb_ext.ExtAlternateBidderCodes {
openrtb_ext/alternatebiddercodes.go
Outdated
|
||
func (bidderCodes *ExtAlternateBidderCodes) IsValidBidderCode(bidder, alternateBidder string) (bool, error) { | ||
const ErrAlternateBidderNotDefined = "alternateBidderCodes not defined for adapter %q, rejecting bids for %q" | ||
const ErrAlternateBidderDisabled = "alternateBidderCodes disabled for %q, rejecting bids for %q" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The naming convention errSomeName
is usually for when the value is an error type. This is an error message and the separation of the fields from the Errorf calls is a bit hard to follow IMHO. Consider extracting each to their own simple builder method, like:
func alternateBidderNotDefinedError(bidder, alternateBidder string) error {
return fmt.Errorf("alternateBidderCodes not defined for adapter %q, rejecting bids for %q", bidder, alternateBidder)
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
* origin/master: (316 commits) Fix alt bidder code test broken by imp wrapper commit (prebid#2405) ImpWrapper (prebid#2375) Update sspBC adapter to v5.7 (prebid#2394) Change errors to warnings (prebid#2385) TheMediaGrid: support native mediaType (prebid#2377) Huaweiadsadapter gdpr (prebid#2345) Add alternatebiddercodes in Prebid request ext (prebid#2339) Changed FS bidder names to mixed case (prebid#2390) Load bidders names from file system in lowercase (prebid#2388) consumable adapter: add schain and coppa support (prebid#2361) Adapter aliases: moved adapter related configs to bidder.yaml files (prebid#2353) pubmatic adapter: add param prebiddealpriority (prebid#2281) Yieldlab Adapter: Add support for ad unit sizes (prebid#2364) GDPR: add enforce_algo config flag and convert enforce_purpose to bool (prebid#2330) Resolves CVE-2022-27664 (prebid#2376) AMP Endpoint: support parameters consentType and gdprApplies (prebid#2338) Dianomi - added usync for redirect (prebid#2368) Create issue_prioritization.yml (prebid#2372) Update yaml files for gzip supported bidders (prebid#2365) Adnuntius Adapter: Set no cookies as a parameter (prebid#2352) ...
w.r.t #2174 (comment)
This changes would make alternatebiddercodes from PBS config formally part of Prebid ORTB extensions.
Ex. s2s config on page and incoming PBS request
More details at #2174