From d1c394465a774276d1f09e8cd140e7de5f5b60e8 Mon Sep 17 00:00:00 2001 From: Scott Kay Date: Tue, 23 Jun 2020 18:00:39 -0400 Subject: [PATCH 1/5] OpenX + Facebook Hardening --- adapters/adapterstest/test_json.go | 6 +- .../exemplary/banner-app.json | 122 ++++++++++++++++ .../{banner.json => banner-site.json} | 0 .../supplemental/invalid-interstitial.json | 40 ++++++ .../supplemental/missing-adm-bidid.json | 113 +++++++++++++++ .../supplemental/missing-adm.json | 112 +++++++++++++++ .../supplemental/no-imps.json | 22 +++ .../supplemental/server-error-500.json | 93 ++++++++++++ adapters/audienceNetwork/facebook.go | 132 +++++++++--------- adapters/audienceNetwork/facebook_test.go | 32 ++++- adapters/openx/openx.go | 6 +- exchange/adapter_map.go | 1 - util/maputil/maputil.go | 21 +++ util/maputil/maputil_test.go | 30 ++++ 14 files changed, 652 insertions(+), 78 deletions(-) create mode 100644 adapters/audienceNetwork/audienceNetworktest/exemplary/banner-app.json rename adapters/audienceNetwork/audienceNetworktest/exemplary/{banner.json => banner-site.json} (100%) create mode 100644 adapters/audienceNetwork/audienceNetworktest/supplemental/invalid-interstitial.json create mode 100644 adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm-bidid.json create mode 100644 adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm.json create mode 100644 adapters/audienceNetwork/audienceNetworktest/supplemental/no-imps.json create mode 100644 adapters/audienceNetwork/audienceNetworktest/supplemental/server-error-500.json create mode 100644 util/maputil/maputil.go create mode 100644 util/maputil/maputil_test.go diff --git a/adapters/adapterstest/test_json.go b/adapters/adapterstest/test_json.go index 8fdb9c5d9d6..a25a4f1905a 100644 --- a/adapters/adapterstest/test_json.go +++ b/adapters/adapterstest/test_json.go @@ -164,14 +164,16 @@ type httpRequest struct { } type httpResponse struct { - Status int `json:"status"` - Body json.RawMessage `json:"body"` + Status int `json:"status"` + Body json.RawMessage `json:"body"` + Headers http.Header `json:"headers"` } func (resp *httpResponse) ToResponseData(t *testing.T) *adapters.ResponseData { return &adapters.ResponseData{ StatusCode: resp.Status, Body: resp.Body, + Headers: resp.Headers, } } diff --git a/adapters/audienceNetwork/audienceNetworktest/exemplary/banner-app.json b/adapters/audienceNetwork/audienceNetworktest/exemplary/banner-app.json new file mode 100644 index 00000000000..775e98df5c3 --- /dev/null +++ b/adapters/audienceNetwork/audienceNetworktest/exemplary/banner-app.json @@ -0,0 +1,122 @@ +{ + "mockBidRequest": { + "id": "test-req-id", + "imp": [{ + "id": "test-imp-id", + "banner": { + "format": [{ + "w": 300, + "h": 250 + }], + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "publisherid": "123", + "placementid": "456" + } + } + }], + "app": { + "id": "app-abc", + "bundle": "com.prebid" + }, + "device": { + "ip": "152.193.6.74" + }, + "user": { + "id": "db089de9-a62e-4861-a881-0ff15e052516", + "buyeruid": "v4_bidder_token" + }, + "tmax": 500 + }, + "httpcalls": [{ + "expectedRequest": { + "uri": "https://an.facebook.com/placementbid.ortb", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "X-Fb-Pool-Routing-Token": [ + "v4_bidder_token" + ] + }, + "body": { + "id": "test-imp-id", + "imp": [{ + "id": "test-imp-id", + "banner": { + "w": -1, + "h": 250 + }, + "tagid": "123_456" + }], + "ext": { + "appnexus": { + "hb_source": 5 + }, + "prebid": {} + }, + "app": { + "id": "app-abc", + "bundle": "com.prebid", + "publisher": { + "id": "123" + } + }, + "device": { + "ip": "152.193.6.74" + }, + "user": { + "id": "db089de9-a62e-4861-a881-0ff15e052516", + "buyeruid": "v4_bidder_token" + }, + "tmax": 500, + "ext": { + "authentication_id": "4e24a2b23fbfb5e41a9093b921d6cddf497c24dd5f63879038cec2ab2f27d174", + "platformid": "test-platform-id" + } + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-imp-id", + "seatbid": [{ + "bid": [{ + "id": "987", + "impid": "test-imp-id", + "price": 1.000000, + "adm": "{\"type\":\"ID\",\"bid_id\":\"987\",\"placement_id\":\"123_456\",\"resolved_placement_id\":\"123_456\",\"sdk_version\":\"5.5.0\",\"device_id\":\"abc\",\"template\":1,\"payload\":null,\"bid_time_token\":\"v4_bidder_token=\"}", + "nurl": "https://www.facebook.com/audiencenetwork/nurl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&ortb_loss_code=0&clearing_price=${AUCTION_PRICE}&app_version=iOS-1.0", + "lurl": "https://www.facebook.com/audiencenetwork/nurl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&ortb_loss_code=${AUCTION_LOSS}&clearing_price=${AUCTION_PRICE}&app_version=iOS-1.0", + "burl": "https://www.facebook.com/audiencenetwork/burl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&clearing_price=${AUCTION_PRICE}" + }] + }], + "bidid": "654", + "cur": "USD" + } + } + }], + "expectedBidResponses": [{ + "currency": "USD", + "bids": [{ + "bid": { + "id": "987", + "impid": "test-imp-id", + "price": 1, + "adm": "{\"type\":\"ID\",\"bid_id\":\"987\",\"placement_id\":\"123_456\",\"resolved_placement_id\":\"123_456\",\"sdk_version\":\"5.5.0\",\"device_id\":\"abc\",\"template\":1,\"payload\":null,\"bid_time_token\":\"v4_bidder_token=\"}", + "adid": "987", + "crid": "987", + "nurl": "https://www.facebook.com/audiencenetwork/nurl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&ortb_loss_code=0&clearing_price=${AUCTION_PRICE}&app_version=iOS-1.0", + "lurl": "https://www.facebook.com/audiencenetwork/nurl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&ortb_loss_code=${AUCTION_LOSS}&clearing_price=${AUCTION_PRICE}&app_version=iOS-1.0", + "burl": "https://www.facebook.com/audiencenetwork/burl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&clearing_price=${AUCTION_PRICE}" + }, + "type": "banner" + }] + }] +} \ No newline at end of file diff --git a/adapters/audienceNetwork/audienceNetworktest/exemplary/banner.json b/adapters/audienceNetwork/audienceNetworktest/exemplary/banner-site.json similarity index 100% rename from adapters/audienceNetwork/audienceNetworktest/exemplary/banner.json rename to adapters/audienceNetwork/audienceNetworktest/exemplary/banner-site.json diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/invalid-interstitial.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/invalid-interstitial.json new file mode 100644 index 00000000000..ad19d94c6e9 --- /dev/null +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/invalid-interstitial.json @@ -0,0 +1,40 @@ +{ + "mockBidRequest": { + "id": "test-req-id", + "imp": [{ + "id": "test-imp-id", + "video": { + "mimes": ["video/mp4"], + "minduration": 15, + "maxduration": 30, + "protocols": [2, 3, 5, 6, 7, 8], + "linearity": 1, + "w": 940, + "h": 560 + }, + "instl": 1, + "ext": { + "bidder": { + "publisherid": "123", + "placementid": "456" + } + } + }], + "site": { + "domain": "prebid.org", + "page": "prebid.org" + }, + "device": { + "ip": "152.193.6.74" + }, + "user": { + "id": "db089de9-a62e-4861-a881-0ff15e052516", + "buyeruid": "v4_bidder_token" + }, + "tmax": 500 + }, + "expectedMakeRequestsErrors": [{ + "value": "imp #test-imp-id: interstitial imps are only supported for banner", + "comparison": "literal" + }] +} \ No newline at end of file diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm-bidid.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm-bidid.json new file mode 100644 index 00000000000..d44ba228231 --- /dev/null +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm-bidid.json @@ -0,0 +1,113 @@ +{ + "mockBidRequest": { + "id": "test-req-id", + "imp": [{ + "id": "test-imp-id", + "banner": { + "format": [{ + "w": 300, + "h": 250 + }], + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "publisherid": "123", + "placementid": "456" + } + } + }], + "site": { + "domain": "prebid.org", + "page": "prebid.org" + }, + "device": { + "ip": "152.193.6.74" + }, + "user": { + "id": "db089de9-a62e-4861-a881-0ff15e052516", + "buyeruid": "v4_bidder_token" + }, + "tmax": 500 + }, + "httpcalls": [{ + "expectedRequest": { + "uri": "https://an.facebook.com/placementbid.ortb", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "X-Fb-Pool-Routing-Token": [ + "v4_bidder_token" + ] + }, + "body": { + "id": "test-imp-id", + "imp": [{ + "id": "test-imp-id", + "banner": { + "w": -1, + "h": 250 + }, + "tagid": "123_456" + }], + "ext": { + "appnexus": { + "hb_source": 5 + }, + "prebid": {} + }, + "site": { + "domain": "prebid.org", + "page": "prebid.org", + "publisher": { + "id": "123" + } + }, + "device": { + "ip": "152.193.6.74" + }, + "user": { + "id": "db089de9-a62e-4861-a881-0ff15e052516", + "buyeruid": "v4_bidder_token" + }, + "tmax": 500, + "ext": { + "authentication_id": "4e24a2b23fbfb5e41a9093b921d6cddf497c24dd5f63879038cec2ab2f27d174", + "platformid": "test-platform-id" + } + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-imp-id", + "seatbid": [{ + "bid": [{ + "id": "987", + "impid": "test-imp-id", + "price": 1.000000, + "adm": "{\"type\":\"ID\",\"placement_id\":\"123_456\",\"resolved_placement_id\":\"123_456\",\"sdk_version\":\"5.5.0\",\"device_id\":\"abc\",\"template\":1,\"payload\":null,\"bid_time_token\":\"v4_bidder_token=\"}", + "nurl": "https://www.facebook.com/audiencenetwork/nurl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&ortb_loss_code=0&clearing_price=${AUCTION_PRICE}&app_version=iOS-1.0", + "lurl": "https://www.facebook.com/audiencenetwork/nurl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&ortb_loss_code=${AUCTION_LOSS}&clearing_price=${AUCTION_PRICE}&app_version=iOS-1.0", + "burl": "https://www.facebook.com/audiencenetwork/burl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&clearing_price=${AUCTION_PRICE}" + }] + }], + "bidid": "654", + "cur": "USD" + } + } + }], + "expectedBidResponses": [{ + "currency": "USD", + "bids": [] + }], + "expectedMakeBidsErrors": [{ + "value": "bid 987 missing 'bid_id' in 'adm'", + "comparison": "literal" + }] +} \ No newline at end of file diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm.json new file mode 100644 index 00000000000..bc643395b00 --- /dev/null +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm.json @@ -0,0 +1,112 @@ +{ + "mockBidRequest": { + "id": "test-req-id", + "imp": [{ + "id": "test-imp-id", + "banner": { + "format": [{ + "w": 300, + "h": 250 + }], + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "publisherid": "123", + "placementid": "456" + } + } + }], + "site": { + "domain": "prebid.org", + "page": "prebid.org" + }, + "device": { + "ip": "152.193.6.74" + }, + "user": { + "id": "db089de9-a62e-4861-a881-0ff15e052516", + "buyeruid": "v4_bidder_token" + }, + "tmax": 500 + }, + "httpcalls": [{ + "expectedRequest": { + "uri": "https://an.facebook.com/placementbid.ortb", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "X-Fb-Pool-Routing-Token": [ + "v4_bidder_token" + ] + }, + "body": { + "id": "test-imp-id", + "imp": [{ + "id": "test-imp-id", + "banner": { + "w": -1, + "h": 250 + }, + "tagid": "123_456" + }], + "ext": { + "appnexus": { + "hb_source": 5 + }, + "prebid": {} + }, + "site": { + "domain": "prebid.org", + "page": "prebid.org", + "publisher": { + "id": "123" + } + }, + "device": { + "ip": "152.193.6.74" + }, + "user": { + "id": "db089de9-a62e-4861-a881-0ff15e052516", + "buyeruid": "v4_bidder_token" + }, + "tmax": 500, + "ext": { + "authentication_id": "4e24a2b23fbfb5e41a9093b921d6cddf497c24dd5f63879038cec2ab2f27d174", + "platformid": "test-platform-id" + } + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-imp-id", + "seatbid": [{ + "bid": [{ + "id": "987", + "impid": "test-imp-id", + "price": 1.000000, + "nurl": "https://www.facebook.com/audiencenetwork/nurl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&ortb_loss_code=0&clearing_price=${AUCTION_PRICE}&app_version=iOS-1.0", + "lurl": "https://www.facebook.com/audiencenetwork/nurl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&ortb_loss_code=${AUCTION_LOSS}&clearing_price=${AUCTION_PRICE}&app_version=iOS-1.0", + "burl": "https://www.facebook.com/audiencenetwork/burl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&clearing_price=${AUCTION_PRICE}" + }] + }], + "bidid": "654", + "cur": "USD" + } + } + }], + "expectedBidResponses": [{ + "currency": "USD", + "bids": [] + }], + "expectedMakeBidsErrors": [{ + "value": "Bid 987 missing 'adm'", + "comparison": "literal" + }] +} \ No newline at end of file diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/no-imps.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/no-imps.json new file mode 100644 index 00000000000..7420f7e8fb2 --- /dev/null +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/no-imps.json @@ -0,0 +1,22 @@ +{ + "mockBidRequest": { + "id": "test-req-id", + "imp": [], + "site": { + "domain": "prebid.org", + "page": "prebid.org" + }, + "device": { + "ip": "152.193.6.74" + }, + "user": { + "id": "db089de9-a62e-4861-a881-0ff15e052516", + "buyeruid": "v4_bidder_token" + }, + "tmax": 500 + }, + "expectedMakeRequestsErrors": [{ + "value": "No impressions provided", + "comparison": "literal" + }] +} \ No newline at end of file diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/server-error-500.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/server-error-500.json new file mode 100644 index 00000000000..596226cad84 --- /dev/null +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/server-error-500.json @@ -0,0 +1,93 @@ +{ + "mockBidRequest": { + "id": "test-req-id", + "imp": [{ + "id": "test-imp-id", + "native": { + "request": "{\"ver\":\"1.1\",\"context\":1,\"contextsubtype\":11,\"plcmttype\":4,\"plcmtcnt\":1,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":500}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1,\"hmin\":1}},{\"id\":3,\"required\":0,\"data\":{\"type\":1,\"len\":200}},{\"id\":4,\"required\":0,\"data\":{\"type\":2,\"len\":15000}},{\"id\":5,\"required\":0,\"data\":{\"type\":6,\"len\":40}},{\"id\":6,\"required\":0,\"data\":{\"type\":500}}]}", + "ver": "1.1" + }, + "ext": { + "bidder": { + "publisherid": "123", + "placementid": "456" + } + } + }], + "site": { + "domain": "prebid.org", + "page": "prebid.org" + }, + "device": { + "ip": "152.193.6.74" + }, + "user": { + "id": "db089de9-a62e-4861-a881-0ff15e052516", + "buyeruid": "v4_bidder_token" + }, + "tmax": 500 + }, + "httpcalls": [{ + "expectedRequest": { + "uri": "https://an.facebook.com/placementbid.ortb", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "X-Fb-Pool-Routing-Token": [ + "v4_bidder_token" + ] + }, + "body": { + "id": "test-imp-id", + "imp": [{ + "id": "test-imp-id", + "native": { + "w": -1, + "h": -1 + }, + "tagid": "123_456" + }], + "ext": { + "appnexus": { + "hb_source": 5 + }, + "prebid": {} + }, + "site": { + "domain": "prebid.org", + "page": "prebid.org", + "publisher": { + "id": "123" + } + }, + "device": { + "ip": "152.193.6.74" + }, + "user": { + "id": "db089de9-a62e-4861-a881-0ff15e052516", + "buyeruid": "v4_bidder_token" + }, + "tmax": 500, + "ext": { + "authentication_id": "4e24a2b23fbfb5e41a9093b921d6cddf497c24dd5f63879038cec2ab2f27d174", + "platformid": "test-platform-id" + } + } + }, + "mockResponse": { + "headers": { + "X-Fb-An-Errors": [ + "someError" + ]}, + "status": 500 + } + }], + "expectedMakeBidsErrors": [{ + "value": "Unexpected status code 500 with error message 'someError'", + "comparison": "literal" + }] +} \ No newline at end of file diff --git a/adapters/audienceNetwork/facebook.go b/adapters/audienceNetwork/facebook.go index 9edb9a7d57e..d0e42c19e5e 100644 --- a/adapters/audienceNetwork/facebook.go +++ b/adapters/audienceNetwork/facebook.go @@ -10,16 +10,17 @@ import ( "net/http" "strings" - "github.com/buger/jsonparser" - "github.com/golang/glog" - "github.com/mxmCherry/openrtb" "github.com/prebid/prebid-server/adapters" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/openrtb_ext" + "github.com/prebid/prebid-server/util/maputil" + + "github.com/buger/jsonparser" + "github.com/golang/glog" + "github.com/mxmCherry/openrtb" ) type FacebookAdapter struct { - http *adapters.HTTPAdapter URI string nonSecureUri string platformID string @@ -35,15 +36,6 @@ var supportedBannerHeights = map[uint64]bool{ 250: true, } -// used for cookies and such -func (a *FacebookAdapter) Name() string { - return "audienceNetwork" -} - -func (a *FacebookAdapter) SkipNoCookies() bool { - return false -} - type facebookReqExt struct { PlatformID string `json:"platformid"` AuthID string `json:"authentication_id"` @@ -178,8 +170,10 @@ func (this *FacebookAdapter) modifyImp(out *openrtb.Imp) error { } } - switch impType { - case openrtb_ext.BidTypeBanner: + if impType == openrtb_ext.BidTypeBanner { + bannerCopy := *out.Banner + out.Banner = &bannerCopy + if out.Instl == 1 { out.Banner.W = openrtb.Uint64Ptr(0) out.Banner.H = openrtb.Uint64Ptr(0) @@ -212,7 +206,6 @@ func (this *FacebookAdapter) modifyImp(out *openrtb.Imp) error { /* This will get overwritten post-serialization */ out.Banner.W = openrtb.Uint64Ptr(0) out.Banner.Format = nil - break } return nil @@ -239,102 +232,106 @@ func (this *FacebookAdapter) extractPlacementAndPublisher(out *openrtb.Imp) (str } } - placementId := fbExt.PlacementId - publisherId := fbExt.PublisherId + placementID := fbExt.PlacementId + publisherID := fbExt.PublisherId // Support the legacy path with the caller was expected to pass in just placementId // which was an underscore concantenated string with the publisherId and placementId. // The new path for callers is to pass in the placementId and publisherId independently // and the below code will prefix the placementId that we pass to FAN with the publsiherId // so that we can abstract the implementation details from the caller - toks := strings.Split(placementId, "_") + toks := strings.Split(placementID, "_") if len(toks) == 1 { - if publisherId == "" { + if publisherID == "" { return "", "", &errortypes.BadInput{ Message: "Missing publisherId param", } } - return placementId, publisherId, nil + return placementID, publisherID, nil } else if len(toks) == 2 { - publisherId = toks[0] - placementId = toks[1] + publisherID = toks[0] + placementID = toks[1] } else { return "", "", &errortypes.BadInput{ - Message: fmt.Sprintf("Invalid placementId param '%s' and publisherId param '%s'", placementId, publisherId), + Message: fmt.Sprintf("Invalid placementId param '%s' and publisherId param '%s'", placementID, publisherID), } } - return placementId, publisherId, nil + return placementID, publisherID, nil } // XXX: This entire function is just a hack to get around mxmCherry 11.0.0 limitations, without // having to fork the library and maintain our own branch -func modifyImpCustom(json []byte, imp *openrtb.Imp) ([]byte, error) { +func modifyImpCustom(jsonData []byte, imp *openrtb.Imp) ([]byte, error) { impType, ok := resolveImpType(imp) if ok == false { panic("processing an invalid impression") } - var err error + var jsonMap map[string]interface{} + err := json.Unmarshal(jsonData, &jsonMap) + if err != nil { + return jsonData, err + } + + var impMap map[string]interface{} + if impSlice, ok := maputil.ReadEmbeddedSlice(jsonMap, "imp"); !ok { + return jsonData, errors.New("unable to find imp in json data") + } else if len(impSlice) == 0 { + return jsonData, errors.New("unable to find imp[0] in json data") + } else if impMap, ok = impSlice[0].(map[string]interface{}); !ok { + return jsonData, errors.New("unexpected type of imp[0] found in json data") + } switch impType { case openrtb_ext.BidTypeBanner: - // The current version of mxmCherry (11.0.0) repesents banner.w as unsigned - // integers, so setting a value of -1 is not possible which is why we have to do it + // The current version of mxmCherry (11.0.0) represents banner.w as an unsigned + // integer, so setting a value of -1 is not possible which is why we have to do it // post-serialization - - // The above does not apply to interstitial impressions - if imp.Instl == 1 { - break - } - - json, err = jsonparser.Set(json, []byte("-1"), "imp", "[0]", "banner", "w") - if err != nil { - return json, err + isInterstitial := imp.Instl == 1 + if !isInterstitial { + if bannerMap, ok := maputil.ReadEmbeddedMap(impMap, "banner"); ok { + bannerMap["w"] = json.RawMessage("-1") + } else { + return jsonData, errors.New("unable to find imp[0].banner in json data") + } } - break - case openrtb_ext.BidTypeVideo: // mxmCherry omits video.w/h if set to zero, so we need to force set those // fields to zero post-serialization for the time being - json, err = jsonparser.Set(json, []byte("0"), "imp", "[0]", "video", "w") - if err != nil { - return json, err + if videoMap, ok := maputil.ReadEmbeddedMap(impMap, "video"); ok { + videoMap["w"] = json.RawMessage("0") + videoMap["h"] = json.RawMessage("0") + } else { + return jsonData, errors.New("unable to find imp[0].video in json data") } - json, err = jsonparser.Set(json, []byte("0"), "imp", "[0]", "video", "h") - if err != nil { - return json, err + case openrtb_ext.BidTypeNative: + nativeMap, ok := maputil.ReadEmbeddedMap(impMap, "native") + if !ok { + return jsonData, errors.New("unable to find imp[0].video in json data") } - break - - case openrtb_ext.BidTypeNative: // Set w/h to -1 for native impressions based on the facebook native spec. // We have to set this post-serialization since the OpenRTB protocol doesn't - // actaully support w/h in the native object - json, err = jsonparser.Set(json, []byte("-1"), "imp", "[0]", "native", "w") - if err != nil { - return json, err - } - - json, err = jsonparser.Set(json, []byte("-1"), "imp", "[0]", "native", "h") - if err != nil { - return json, err - } + // actually support w/h in the native object + nativeMap["w"] = json.RawMessage("-1") + nativeMap["h"] = json.RawMessage("-1") // The FAN adserver does not expect the native request payload, all that information // is derived server side based on the placement ID. We need to remove these pieces of // information manually since OpenRTB (and thus mxmCherry) never omit native.request - json = jsonparser.Delete(json, "imp", "[0]", "native", "ver") - json = jsonparser.Delete(json, "imp", "[0]", "native", "request") - - break + delete(nativeMap, "ver") + delete(nativeMap, "request") } - return json, nil + if jsonReEncoded, err := json.Marshal(jsonMap); err == nil { + return jsonReEncoded, nil + } else { + return nil, fmt.Errorf("unable to encode json data (%v)", err) + } } func (this *FacebookAdapter) MakeBids(request *openrtb.BidRequest, adapterRequest *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) { @@ -430,7 +427,7 @@ func resolveImpType(imp *openrtb.Imp) (openrtb_ext.BidType, bool) { return openrtb_ext.BidTypeBanner, false } -func NewFacebookBidder(client *http.Client, platformID string, appSecret string) adapters.Bidder { +func NewFacebookBidder(platformID string, appSecret string) adapters.Bidder { if platformID == "" { glog.Errorf("No facebook partnerID specified. Calls to the Audience Network will fail. Did you set adapters.facebook.platform_id in the app config?") return &adapters.MisconfiguredBidder{ @@ -447,11 +444,8 @@ func NewFacebookBidder(client *http.Client, platformID string, appSecret string) } } - a := &adapters.HTTPAdapter{Client: client} - return &FacebookAdapter{ - http: a, - URI: "https://an.facebook.com/placementbid.ortb", + URI: "https://an.facebook.com/placementbid.ortb", //for AB test nonSecureUri: "http://an.facebook.com/placementbid.ortb", platformID: platformID, diff --git a/adapters/audienceNetwork/facebook_test.go b/adapters/audienceNetwork/facebook_test.go index 784a540e596..fa7bb68c907 100644 --- a/adapters/audienceNetwork/facebook_test.go +++ b/adapters/audienceNetwork/facebook_test.go @@ -1,6 +1,8 @@ package audienceNetwork import ( + "errors" + "fmt" "testing" "time" @@ -40,14 +42,14 @@ type FacebookExt struct { } func TestJsonSamples(t *testing.T) { - adapterstest.RunJSONBidderTest(t, "audienceNetworktest", NewFacebookBidder(nil, "test-platform-id", "test-app-secret")) + adapterstest.RunJSONBidderTest(t, "audienceNetworktest", NewFacebookBidder("test-platform-id", "test-app-secret")) } func TestMakeTimeoutNoticeApp(t *testing.T) { req := adapters.RequestData{ Body: []byte(`{"id":"1234","imp":[{"id":"1234"}],"app":{"publisher":{"id":"5678"}}}`), } - fba := NewFacebookBidder(nil, "test-platform-id", "test-app-secret") + fba := NewFacebookBidder("test-platform-id", "test-app-secret") tb, ok := fba.(adapters.TimeoutBidder) if !ok { @@ -64,7 +66,7 @@ func TestMakeTimeoutNoticeSite(t *testing.T) { req := adapters.RequestData{ Body: []byte(`{"id":"1234","imp":[{"id":"1234"}],"site":{"publisher":{"id":"5678"}}}`), } - fba := NewFacebookBidder(nil, "test-platform-id", "test-app-secret") + fba := NewFacebookBidder("test-platform-id", "test-app-secret") tb, ok := fba.(adapters.TimeoutBidder) if !ok { @@ -81,7 +83,7 @@ func TestMakeTimeoutNoticeBadRequest(t *testing.T) { req := adapters.RequestData{ Body: []byte(`{"imp":[{{"id":"1234"}}`), } - fba := NewFacebookBidder(nil, "test-platform-id", "test-app-secret") + fba := NewFacebookBidder("test-platform-id", "test-app-secret") tb, ok := fba.(adapters.TimeoutBidder) if !ok { @@ -93,3 +95,25 @@ func TestMakeTimeoutNoticeBadRequest(t *testing.T) { assert.NotNil(t, err, "Facebook MakeTimeoutNotification() did not return an error") } + +func TestNewFacebookBidderMissingPlatformID(t *testing.T) { + result := NewFacebookBidder("", "anyAppSecret") + + expected := &adapters.MisconfiguredBidder{ + Name: "audienceNetwork", + Error: fmt.Errorf("Audience Network is not configured properly on this Prebid Server deploy. If you believe this should work, contact the company hosting the service and tell them to check their configuration."), + } + + assert.Equal(t, expected, result) +} + +func TestNewFacebookBidderMissingAppSecret(t *testing.T) { + result := NewFacebookBidder("anyPlatformID", "") + + expected := &adapters.MisconfiguredBidder{ + Name: "audienceNetwork", + Error: errors.New("Audience Network is not configured properly on this Prebid Server deploy. If you believe this should work, contact the company hosting the service and tell them to check their configuration."), + } + + assert.Equal(t, expected, result) +} diff --git a/adapters/openx/openx.go b/adapters/openx/openx.go index 63297d0a4ee..ca88b18bdb8 100644 --- a/adapters/openx/openx.go +++ b/adapters/openx/openx.go @@ -143,11 +143,13 @@ func preprocess(imp *openrtb.Imp, reqExt *openxReqExt) error { } if imp.Video != nil { + videoCopy := *imp.Video if bidderExt.Prebid != nil && bidderExt.Prebid.IsRewardedInventory == 1 { - imp.Video.Ext = json.RawMessage(`{"rewarded":1}`) + videoCopy.Ext = json.RawMessage(`{"rewarded":1}`) } else { - imp.Video.Ext = nil + videoCopy.Ext = nil } + imp.Video = &videoCopy } return nil diff --git a/exchange/adapter_map.go b/exchange/adapter_map.go index 2ea8f7fb648..225bb312666 100755 --- a/exchange/adapter_map.go +++ b/exchange/adapter_map.go @@ -117,7 +117,6 @@ func newAdapterMap(client *http.Client, cfg *config.Configuration, infos adapter openrtb_ext.BidderEngageBDR: engagebdr.NewEngageBDRBidder(client, cfg.Adapters[string(openrtb_ext.BidderEngageBDR)].Endpoint), openrtb_ext.BidderEPlanning: eplanning.NewEPlanningBidder(client, cfg.Adapters[string(openrtb_ext.BidderEPlanning)].Endpoint), openrtb_ext.BidderFacebook: audienceNetwork.NewFacebookBidder( - client, cfg.Adapters[strings.ToLower(string(openrtb_ext.BidderFacebook))].PlatformID, cfg.Adapters[strings.ToLower(string(openrtb_ext.BidderFacebook))].AppSecret), openrtb_ext.BidderGamma: gamma.NewGammaBidder(cfg.Adapters[string(openrtb_ext.BidderGamma)].Endpoint), diff --git a/util/maputil/maputil.go b/util/maputil/maputil.go new file mode 100644 index 00000000000..0d1d7dbb51c --- /dev/null +++ b/util/maputil/maputil.go @@ -0,0 +1,21 @@ +package maputil + +// ReadEmbeddedMap reads element k from the map m as a map[string]interface{}. +func ReadEmbeddedMap(m map[string]interface{}, k string) (map[string]interface{}, bool) { + if v, ok := m[k]; ok { + vCasted, ok := v.(map[string]interface{}) + return vCasted, ok + } + + return nil, false +} + +// ReadEmbeddedSlice reads element k from the map m as a []interface{}. +func ReadEmbeddedSlice(m map[string]interface{}, k string) ([]interface{}, bool) { + if v, ok := m[k]; ok { + vCasted, ok := v.([]interface{}) + return vCasted, ok + } + + return nil, false +} diff --git a/util/maputil/maputil_test.go b/util/maputil/maputil_test.go new file mode 100644 index 00000000000..d6a2c5a92fe --- /dev/null +++ b/util/maputil/maputil_test.go @@ -0,0 +1,30 @@ +package maputil + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestReadEmbeddedMap(t *testing.T) { + testCases := []struct { + value map[string]interface{} + key string + expectedMap map[string]interface{} + expectedOK bool + }{ + { + value: nil, + key: "", + expectedMap: nil, + expectedOK: false, + }, + } + + for _, test := range testCases { + resultMap, resultOK := ReadEmbeddedMap(test.value, test.key) + + assert.Equal(t, test.expectedMap, resultMap) + assert.Equal(t, test.expectedOK, resultOK) + } +} From 9821787c7d983816140be2132975dc183a93779e Mon Sep 17 00:00:00 2001 From: Scott Kay Date: Tue, 23 Jun 2020 21:22:25 -0400 Subject: [PATCH 2/5] Util Tests --- util/maputil/maputil_test.go | 87 +++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/util/maputil/maputil_test.go b/util/maputil/maputil_test.go index d6a2c5a92fe..2e6955cec9b 100644 --- a/util/maputil/maputil_test.go +++ b/util/maputil/maputil_test.go @@ -8,23 +8,106 @@ import ( func TestReadEmbeddedMap(t *testing.T) { testCases := []struct { + description string value map[string]interface{} key string expectedMap map[string]interface{} expectedOK bool }{ { + description: "Nil", value: nil, key: "", expectedMap: nil, expectedOK: false, }, + { + description: "Empty", + value: map[string]interface{}{}, + key: "foo", + expectedMap: nil, + expectedOK: false, + }, + { + description: "Success", + value: map[string]interface{}{"foo": map[string]interface{}{"bar": 42}}, + key: "foo", + expectedMap: map[string]interface{}{"bar": 42}, + expectedOK: true, + }, + { + description: "Not Found", + value: map[string]interface{}{"foo": map[string]interface{}{"bar": 42}}, + key: "notFound", + expectedMap: nil, + expectedOK: false, + }, + { + description: "Wrong Type", + value: map[string]interface{}{"foo": 42}, + key: "foo", + expectedMap: nil, + expectedOK: false, + }, } for _, test := range testCases { resultMap, resultOK := ReadEmbeddedMap(test.value, test.key) - assert.Equal(t, test.expectedMap, resultMap) - assert.Equal(t, test.expectedOK, resultOK) + assert.Equal(t, test.expectedMap, resultMap, test.description+":map") + assert.Equal(t, test.expectedOK, resultOK, test.description+":ok") + } +} + +func TestReadEmbeddedSlice(t *testing.T) { + testCases := []struct { + description string + value map[string]interface{} + key string + expectedSlice []interface{} + expectedOK bool + }{ + { + description: "Nil", + value: nil, + key: "", + expectedSlice: nil, + expectedOK: false, + }, + { + description: "Empty", + value: map[string]interface{}{}, + key: "foo", + expectedSlice: nil, + expectedOK: false, + }, + { + description: "Success", + value: map[string]interface{}{"foo": []interface{}{42}}, + key: "foo", + expectedSlice: []interface{}{42}, + expectedOK: true, + }, + { + description: "Not Found", + value: map[string]interface{}{"foo": []interface{}{42}}, + key: "notFound", + expectedSlice: nil, + expectedOK: false, + }, + { + description: "Wrong Type", + value: map[string]interface{}{"foo": 42}, + key: "foo", + expectedSlice: nil, + expectedOK: false, + }, + } + + for _, test := range testCases { + resultSlice, resultOK := ReadEmbeddedSlice(test.value, test.key) + + assert.Equal(t, test.expectedSlice, resultSlice, test.description+":slicd") + assert.Equal(t, test.expectedOK, resultOK, test.description+":ok") } } From 75f24a50e985496ab580c5e15a82fc8743d98e45 Mon Sep 17 00:00:00 2001 From: Scott Kay Date: Tue, 23 Jun 2020 21:26:52 -0400 Subject: [PATCH 3/5] Grammar Fix --- adapters/audienceNetwork/facebook.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapters/audienceNetwork/facebook.go b/adapters/audienceNetwork/facebook.go index d0e42c19e5e..f4091e4e23c 100644 --- a/adapters/audienceNetwork/facebook.go +++ b/adapters/audienceNetwork/facebook.go @@ -281,7 +281,7 @@ func modifyImpCustom(jsonData []byte, imp *openrtb.Imp) ([]byte, error) { } else if len(impSlice) == 0 { return jsonData, errors.New("unable to find imp[0] in json data") } else if impMap, ok = impSlice[0].(map[string]interface{}); !ok { - return jsonData, errors.New("unexpected type of imp[0] found in json data") + return jsonData, errors.New("unexpected type for imp[0] found in json data") } switch impType { From f7a97cdf9818236d0f4f40f411962006512e034f Mon Sep 17 00:00:00 2001 From: Scott Kay Date: Mon, 29 Jun 2020 11:39:34 -0400 Subject: [PATCH 4/5] Fixed Unnecessary fmt.Errorf --- adapters/audienceNetwork/facebook_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/adapters/audienceNetwork/facebook_test.go b/adapters/audienceNetwork/facebook_test.go index fa7bb68c907..7f567d6137b 100644 --- a/adapters/audienceNetwork/facebook_test.go +++ b/adapters/audienceNetwork/facebook_test.go @@ -2,7 +2,6 @@ package audienceNetwork import ( "errors" - "fmt" "testing" "time" @@ -101,7 +100,7 @@ func TestNewFacebookBidderMissingPlatformID(t *testing.T) { expected := &adapters.MisconfiguredBidder{ Name: "audienceNetwork", - Error: fmt.Errorf("Audience Network is not configured properly on this Prebid Server deploy. If you believe this should work, contact the company hosting the service and tell them to check their configuration."), + Error: errors.New("Audience Network is not configured properly on this Prebid Server deploy. If you believe this should work, contact the company hosting the service and tell them to check their configuration."), } assert.Equal(t, expected, result) From 2c45d49932613f2e2b1c6a3d650e25afd8626fca Mon Sep 17 00:00:00 2001 From: Scott Kay Date: Mon, 29 Jun 2020 11:53:15 -0400 Subject: [PATCH 5/5] Removed Ignored Duplicate Ext From JSON Tests --- .../exemplary/banner-app.json | 6 - .../exemplary/banner-site.json | 6 - .../exemplary/interstitial.json | 6 - .../exemplary/native-1.1.json | 6 - .../audienceNetworktest/exemplary/video.json | 6 - .../supplemental/banner-format-only.json | 6 - .../supplemental/invalid-adm.json | 103 ++++++++++++++++++ .../supplemental/missing-adm-bidid.json | 6 - .../supplemental/missing-adm.json | 6 - .../supplemental/multi-imp.json | 12 -- .../supplemental/no-bid-204.json | 6 - .../supplemental/server-error-500.json | 6 - .../supplemental/split-placementId.json | 6 - 13 files changed, 103 insertions(+), 78 deletions(-) create mode 100644 adapters/audienceNetwork/audienceNetworktest/supplemental/invalid-adm.json diff --git a/adapters/audienceNetwork/audienceNetworktest/exemplary/banner-app.json b/adapters/audienceNetwork/audienceNetworktest/exemplary/banner-app.json index 775e98df5c3..3ac62d90cd4 100644 --- a/adapters/audienceNetwork/audienceNetworktest/exemplary/banner-app.json +++ b/adapters/audienceNetwork/audienceNetworktest/exemplary/banner-app.json @@ -55,12 +55,6 @@ }, "tagid": "123_456" }], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "app": { "id": "app-abc", "bundle": "com.prebid", diff --git a/adapters/audienceNetwork/audienceNetworktest/exemplary/banner-site.json b/adapters/audienceNetwork/audienceNetworktest/exemplary/banner-site.json index f5f92515e26..01bab3dfd71 100644 --- a/adapters/audienceNetwork/audienceNetworktest/exemplary/banner-site.json +++ b/adapters/audienceNetwork/audienceNetworktest/exemplary/banner-site.json @@ -62,12 +62,6 @@ "tagid": "123_456" } ], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "site": { "domain": "prebid.org", "page": "prebid.org", diff --git a/adapters/audienceNetwork/audienceNetworktest/exemplary/interstitial.json b/adapters/audienceNetwork/audienceNetworktest/exemplary/interstitial.json index bad228d5f18..9f563f11948 100644 --- a/adapters/audienceNetwork/audienceNetworktest/exemplary/interstitial.json +++ b/adapters/audienceNetwork/audienceNetworktest/exemplary/interstitial.json @@ -64,12 +64,6 @@ "tagid": "123_456" } ], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "site": { "domain": "prebid.org", "page": "prebid.org", diff --git a/adapters/audienceNetwork/audienceNetworktest/exemplary/native-1.1.json b/adapters/audienceNetwork/audienceNetworktest/exemplary/native-1.1.json index 9090d80d099..16bed344767 100644 --- a/adapters/audienceNetwork/audienceNetworktest/exemplary/native-1.1.json +++ b/adapters/audienceNetwork/audienceNetworktest/exemplary/native-1.1.json @@ -56,12 +56,6 @@ "tagid": "123_456" } ], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "site": { "domain": "prebid.org", "page": "prebid.org", diff --git a/adapters/audienceNetwork/audienceNetworktest/exemplary/video.json b/adapters/audienceNetwork/audienceNetworktest/exemplary/video.json index 22c62f8b821..5ece0f08530 100644 --- a/adapters/audienceNetwork/audienceNetworktest/exemplary/video.json +++ b/adapters/audienceNetwork/audienceNetworktest/exemplary/video.json @@ -66,12 +66,6 @@ "tagid": "123_456" } ], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "site": { "domain": "prebid.org", "page": "prebid.org", diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/banner-format-only.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/banner-format-only.json index 3edd6569258..5469fefbd65 100644 --- a/adapters/audienceNetwork/audienceNetworktest/supplemental/banner-format-only.json +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/banner-format-only.json @@ -64,12 +64,6 @@ "tagid": "123_456" } ], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "site": { "domain": "prebid.org", "page": "prebid.org", diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/invalid-adm.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/invalid-adm.json new file mode 100644 index 00000000000..f145f5fe4ce --- /dev/null +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/invalid-adm.json @@ -0,0 +1,103 @@ +{ + "mockBidRequest": { + "id": "test-req-id", + "imp": [{ + "id": "test-imp-id", + "banner": { + "format": [{ + "w": 300, + "h": 250 + }], + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "publisherid": "123", + "placementid": "456" + } + } + }], + "site": { + "domain": "prebid.org", + "page": "prebid.org" + }, + "device": { + "ip": "152.193.6.74" + }, + "user": { + "id": "db089de9-a62e-4861-a881-0ff15e052516", + "buyeruid": "v4_bidder_token" + }, + "tmax": 500 + }, + "httpcalls": [{ + "expectedRequest": { + "uri": "https://an.facebook.com/placementbid.ortb", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "X-Fb-Pool-Routing-Token": [ + "v4_bidder_token" + ] + }, + "body": { + "id": "test-imp-id", + "imp": [{ + "id": "test-imp-id", + "banner": { + "w": -1, + "h": 250 + }, + "tagid": "123_456" + }], + "site": { + "domain": "prebid.org", + "page": "prebid.org", + "publisher": { + "id": "123" + } + }, + "device": { + "ip": "152.193.6.74" + }, + "user": { + "id": "db089de9-a62e-4861-a881-0ff15e052516", + "buyeruid": "v4_bidder_token" + }, + "tmax": 500, + "ext": { + "authentication_id": "4e24a2b23fbfb5e41a9093b921d6cddf497c24dd5f63879038cec2ab2f27d174", + "platformid": "test-platform-id" + } + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-imp-id", + "seatbid": [{ + "bid": [{ + "id": "987", + "impid": "test-imp-id", + "price": 1.000000, + "adm": "malformed", + "nurl": "https://www.facebook.com/audiencenetwork/nurl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&ortb_loss_code=0&clearing_price=${AUCTION_PRICE}&app_version=iOS-1.0", + "lurl": "https://www.facebook.com/audiencenetwork/nurl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&ortb_loss_code=${AUCTION_LOSS}&clearing_price=${AUCTION_PRICE}&app_version=iOS-1.0", + "burl": "https://www.facebook.com/audiencenetwork/burl/?partner=test-platform-id&app=def&placement=456&auction=123&impression=123&request=123478&bid=987&clearing_price=${AUCTION_PRICE}" + }] + }], + "bidid": "654", + "cur": "USD" + } + } + }], + "expectedMakeBidsErrors": [{ + "value": "invalid character 'm' looking for beginning of value", + "comparison": "literal" + }] +} \ No newline at end of file diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm-bidid.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm-bidid.json index d44ba228231..b57c900104e 100644 --- a/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm-bidid.json +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm-bidid.json @@ -55,12 +55,6 @@ }, "tagid": "123_456" }], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "site": { "domain": "prebid.org", "page": "prebid.org", diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm.json index bc643395b00..23227aab959 100644 --- a/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm.json +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/missing-adm.json @@ -55,12 +55,6 @@ }, "tagid": "123_456" }], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "site": { "domain": "prebid.org", "page": "prebid.org", diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/multi-imp.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/multi-imp.json index 16e8aede10c..231c2826548 100644 --- a/adapters/audienceNetwork/audienceNetworktest/supplemental/multi-imp.json +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/multi-imp.json @@ -81,12 +81,6 @@ "tagid": "pub1_plmt1" } ], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "site": { "domain": "prebid.org", "page": "prebid.org", @@ -158,12 +152,6 @@ "tagid": "pub2_plmt2" } ], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "site": { "domain": "prebid.org", "page": "prebid.org", diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/no-bid-204.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/no-bid-204.json index bb192aad76f..45b35e05dd9 100644 --- a/adapters/audienceNetwork/audienceNetworktest/supplemental/no-bid-204.json +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/no-bid-204.json @@ -56,12 +56,6 @@ "tagid": "123_456" } ], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "site": { "domain": "prebid.org", "page": "prebid.org", diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/server-error-500.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/server-error-500.json index 596226cad84..7ff8886139a 100644 --- a/adapters/audienceNetwork/audienceNetworktest/supplemental/server-error-500.json +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/server-error-500.json @@ -51,12 +51,6 @@ }, "tagid": "123_456" }], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "site": { "domain": "prebid.org", "page": "prebid.org", diff --git a/adapters/audienceNetwork/audienceNetworktest/supplemental/split-placementId.json b/adapters/audienceNetwork/audienceNetworktest/supplemental/split-placementId.json index 4c561c55276..34c1eccc58e 100644 --- a/adapters/audienceNetwork/audienceNetworktest/supplemental/split-placementId.json +++ b/adapters/audienceNetwork/audienceNetworktest/supplemental/split-placementId.json @@ -50,12 +50,6 @@ "tagid": "123_456" } ], - "ext": { - "appnexus": { - "hb_source": 5 - }, - "prebid": {} - }, "site": { "domain": "prebid.org", "page": "prebid.org",