From 00876206692b043a3c3c790c88518cfcc165f9da Mon Sep 17 00:00:00 2001 From: Veronika Solovei Date: Mon, 10 Apr 2023 10:15:44 -0700 Subject: [PATCH] FPD for amp endpoint (#2672) --- endpoints/openrtb2/amp_auction.go | 16 ++- endpoints/openrtb2/amp_auction_test.go | 13 +- exchange/exchange.go | 4 +- ...rtydata-amp-imp-ext-one-prebid-bidder.json | 133 ++++++++++++++++++ 4 files changed, 156 insertions(+), 10 deletions(-) create mode 100644 exchange/exchangetest/firstpartydata-amp-imp-ext-one-prebid-bidder.json diff --git a/endpoints/openrtb2/amp_auction.go b/endpoints/openrtb2/amp_auction.go index 0228823f3db..5554d41a56a 100644 --- a/endpoints/openrtb2/amp_auction.go +++ b/endpoints/openrtb2/amp_auction.go @@ -590,15 +590,16 @@ func (deps *endpointDeps) overrideWithParams(ampParams amp.Params, req *openrtb2 req.TMax = int64(*ampParams.Timeout) - deps.cfg.AMPTimeoutAdjustment } - if err := setTargeting(req, ampParams.Targeting); err != nil { - return []error{err} + var errors []error + if warn := setTargeting(req, ampParams.Targeting); warn != nil { + errors = append(errors, warn) } if err := setTrace(req, ampParams.Trace); err != nil { - return []error{err} + return append(errors, err) } - return nil + return errors } // setConsentedProviders sets the addtl_consent value to user.ext.ConsentedProvidersSettings.consented_providers @@ -652,7 +653,12 @@ func setTargeting(req *openrtb2.BidRequest, targeting string) error { if len(req.Imp[0].Ext) > 0 { newImpExt, err := jsonpatch.MergePatch(req.Imp[0].Ext, targetingData) if err != nil { - return fmt.Errorf("unable to merge imp.ext with targeting data, check targeting data is correct: %s", err.Error()) + warn := errortypes.Warning{ + WarningCode: errortypes.BadInputErrorCode, + Message: fmt.Sprintf("unable to merge imp.ext with targeting data, check targeting data is correct: %s", err.Error()), + } + + return &warn } req.Imp[0].Ext = newImpExt return nil diff --git a/endpoints/openrtb2/amp_auction_test.go b/endpoints/openrtb2/amp_auction_test.go index 5b125fc57f1..a8e95e4d6db 100644 --- a/endpoints/openrtb2/amp_auction_test.go +++ b/endpoints/openrtb2/amp_auction_test.go @@ -22,6 +22,7 @@ import ( "github.com/prebid/prebid-server/analytics" analyticsConf "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/config" + "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/exchange" "github.com/prebid/prebid-server/hooks" "github.com/prebid/prebid-server/hooks/hookexecution" @@ -398,8 +399,9 @@ func TestOverrideWithParams(t *testing.T) { bidRequest *openrtb2.BidRequest } type testOutput struct { - bidRequest *openrtb2.BidRequest - errorMsgs []string + bidRequest *openrtb2.BidRequest + errorMsgs []string + expectFatalErrors bool } testCases := []struct { desc string @@ -520,7 +522,8 @@ func TestOverrideWithParams(t *testing.T) { Site: &openrtb2.Site{Ext: json.RawMessage(`{"amp":1}`)}, User: &openrtb2.User{Ext: json.RawMessage(`malformed`)}, }, - errorMsgs: []string{"invalid character 'm' looking for beginning of value"}, + errorMsgs: []string{"invalid character 'm' looking for beginning of value"}, + expectFatalErrors: true, }, }, { @@ -567,7 +570,8 @@ func TestOverrideWithParams(t *testing.T) { User: &openrtb2.User{Ext: json.RawMessage(`{"prebid":{malformed}}`)}, Site: &openrtb2.Site{Ext: json.RawMessage(`{"amp":1}`)}, }, - errorMsgs: []string{"invalid character 'm' looking for beginning of object key string"}, + errorMsgs: []string{"invalid character 'm' looking for beginning of object key string"}, + expectFatalErrors: true, }, }, } @@ -579,6 +583,7 @@ func TestOverrideWithParams(t *testing.T) { assert.Len(t, errs, len(test.expected.errorMsgs), test.desc) if len(test.expected.errorMsgs) > 0 { assert.Equal(t, test.expected.errorMsgs[0], errs[0].Error(), test.desc) + assert.Equal(t, test.expected.expectFatalErrors, errortypes.ContainsFatalError(errs), test.desc) } } } diff --git a/exchange/exchange.go b/exchange/exchange.go index aeba357ff7c..347423589fc 100644 --- a/exchange/exchange.go +++ b/exchange/exchange.go @@ -262,7 +262,9 @@ func (e *exchange) HoldAuction(ctx context.Context, r AuctionRequest, debugLog * } e.me.RecordDebugRequest(responseDebugAllow || accountDebugAllow, r.PubID) - if r.RequestType == metrics.ReqTypeORTB2Web || r.RequestType == metrics.ReqTypeORTB2App { + if r.RequestType == metrics.ReqTypeORTB2Web || + r.RequestType == metrics.ReqTypeORTB2App || + r.RequestType == metrics.ReqTypeAMP { //Extract First party data for auction endpoint only resolvedFPD, fpdErrors := firstpartydata.ExtractFPDForBidders(r.BidRequestWrapper) if len(fpdErrors) > 0 { diff --git a/exchange/exchangetest/firstpartydata-amp-imp-ext-one-prebid-bidder.json b/exchange/exchangetest/firstpartydata-amp-imp-ext-one-prebid-bidder.json new file mode 100644 index 00000000000..627c95f9d54 --- /dev/null +++ b/exchange/exchangetest/firstpartydata-amp-imp-ext-one-prebid-bidder.json @@ -0,0 +1,133 @@ +{ + "requestType": "amp", + "incomingRequest": { + "ortbRequest": { + "id": "some-request-id", + "site": { + "page": "test.somepage.com" + }, + "imp": [ + { + "id": "some-imp-id", + "banner": { + "format": [ + { + "w": 600, + "h": 500 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "prebid": { + "bidder": { + "appnexus": { + "placementId": 1 + } + } + }, + "data": { + "keywords": "prebid server example" + }, + "context": { + "data": { + "keywords": "another prebid server example" + } + } + } + } + ] + } + }, + "outgoingRequests": { + "appnexus": { + "expectRequest": { + "ortbRequest": { + "id": "some-request-id", + "site": { + "page": "test.somepage.com" + }, + "imp": [ + { + "id": "some-imp-id", + "banner": { + "format": [ + { + "w": 600, + "h": 500 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "placementId": 1 + }, + "data": { + "keywords": "prebid server example" + }, + "context": { + "data": { + "keywords": "another prebid server example" + } + } + } + } + ] + } + }, + "mockResponse": { + "pbsSeatBids": [ + { + "pbsBids": [ + { + "ortbBid": { + "id": "apn-bid", + "impid": "some-imp-id", + "price": 0.3, + "w": 200, + "h": 500, + "crid": "creative-1" + }, + "bidType": "banner" + } + ], + "seat": "appnexus" + } + ] + } + } + }, + "response": { + "bids": { + "id": "some-request-id", + "seatbid": [ + { + "seat": "appnexus", + "bid": [ + { + "id": "apn-bid", + "impid": "some-imp-id", + "price": 0.3, + "w": 200, + "h": 500, + "crid": "creative-1", + "ext": { + "origbidcpm": 0.3, + "prebid": { + "type": "banner" + } + } + } + ] + } + ] + } + } +} \ No newline at end of file