From 4d826c1cc05c8ff7e62d3233d888ddc589428fe8 Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Mon, 14 Apr 2025 06:25:15 +0200 Subject: [PATCH 01/17] BID-3594: Blis adapter --- adapters/blis/blis.go | 120 ++++++++++++ adapters/blis/blis_test.go | 21 +++ adapters/blis/blistest/exemplary/valid.json | 171 ++++++++++++++++++ .../supplemental/invalid-imp-ext-bidder.json | 18 ++ .../supplemental/invalid-imp-ext.json | 17 ++ .../supplemental/response-http-204.json | 54 ++++++ .../supplemental/response-http-500.json | 58 ++++++ .../supplemental/unsupported-media-type.json | 84 +++++++++ adapters/blis/params_test.go | 44 +++++ exchange/adapter_builders.go | 2 + openrtb_ext/bidders.go | 2 + openrtb_ext/imp_blis.go | 5 + static/bidder-info/blis.yaml | 21 +++ static/bidder-params/blis.json | 16 ++ 14 files changed, 633 insertions(+) create mode 100644 adapters/blis/blis.go create mode 100644 adapters/blis/blis_test.go create mode 100644 adapters/blis/blistest/exemplary/valid.json create mode 100644 adapters/blis/blistest/supplemental/invalid-imp-ext-bidder.json create mode 100644 adapters/blis/blistest/supplemental/invalid-imp-ext.json create mode 100644 adapters/blis/blistest/supplemental/response-http-204.json create mode 100644 adapters/blis/blistest/supplemental/response-http-500.json create mode 100644 adapters/blis/blistest/supplemental/unsupported-media-type.json create mode 100644 adapters/blis/params_test.go create mode 100644 openrtb_ext/imp_blis.go create mode 100644 static/bidder-info/blis.yaml create mode 100644 static/bidder-params/blis.json diff --git a/adapters/blis/blis.go b/adapters/blis/blis.go new file mode 100644 index 00000000000..e1f49b92462 --- /dev/null +++ b/adapters/blis/blis.go @@ -0,0 +1,120 @@ +package blis + +import ( + "fmt" + "net/http" + "strconv" + "strings" + + "github.com/prebid/openrtb/v20/openrtb2" + "github.com/prebid/prebid-server/v3/adapters" + "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/errortypes" + "github.com/prebid/prebid-server/v3/openrtb_ext" + "github.com/prebid/prebid-server/v3/util/jsonutil" +) + +type adapter struct { + endpoint string +} + +func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { + bidder := &adapter{ + endpoint: config.Endpoint, + } + return bidder, nil +} + +func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { + var impExt adapters.ExtImpBidder + if err := jsonutil.Unmarshal(request.Imp[0].Ext, &impExt); err != nil { + return nil, []error{&errortypes.BadInput{ + Message: fmt.Sprintf("Invalid imp.ext for impression index %d. Error Infomation: %s", 0, err.Error()), + }} + } + var impExtBidder openrtb_ext.ImpExtBlis + if err := jsonutil.Unmarshal(impExt.Bidder, &impExtBidder); err != nil { + return nil, []error{&errortypes.BadInput{ + Message: fmt.Sprintf("Invalid imp.ext.bidder for impression index %d. Error Infomation: %s", 0, err.Error()), + }} + } + + headers := http.Header{} + headers.Add("X-Supply-Partner-Id", impExtBidder.SupplyPartnerID) + + request.Ext = append(request.Ext) + + requestJSON, err := jsonutil.Marshal(request) + if err != nil { + return nil, []error{err} + } + + requestData := &adapters.RequestData{ + Method: "POST", + Uri: a.endpoint, + Headers: headers, + Body: requestJSON, + ImpIDs: openrtb_ext.GetImpIDs(request.Imp), + } + + return []*adapters.RequestData{requestData}, nil +} + +func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { + if adapters.IsResponseStatusCodeNoContent(responseData) { + return nil, nil + } + + if err := adapters.CheckResponseStatusCodeForErrors(responseData); err != nil { + return nil, []error{err} + } + + var response openrtb2.BidResponse + if err := jsonutil.Unmarshal(responseData.Body, &response); err != nil { + return nil, []error{err} + } + + bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) + bidResponse.Currency = response.Cur + var errors []error + for _, seatBid := range response.SeatBid { + for i := range seatBid.Bid { + bid := seatBid.Bid[i] + resolveMacros(&bid) + bidType, err := getMediaTypeForBid(&bid) + if err != nil { + errors = append(errors, err) + continue + } + bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ + Bid: &bid, + BidType: bidType, + }) + } + } + return bidResponse, nil +} + +func getMediaTypeForBid(bid *openrtb2.Bid) (openrtb_ext.BidType, error) { + switch bid.MType { + case openrtb2.MarkupBanner: + return openrtb_ext.BidTypeBanner, nil + case openrtb2.MarkupVideo: + return openrtb_ext.BidTypeVideo, nil + case openrtb2.MarkupNative: + return openrtb_ext.BidTypeNative, nil + } + + return "", &errortypes.BadServerResponse{ + Message: fmt.Sprintf("Failed to parse media type of impression ID \"%s\"", bid.ImpID), + } +} + +func resolveMacros(bid *openrtb2.Bid) { + if bid != nil { + price := strconv.FormatFloat(bid.Price, 'f', -1, 64) + bid.NURL = strings.Replace(bid.NURL, "${AUCTION_PRICE}", price, -1) + bid.AdM = strings.Replace(bid.AdM, "${AUCTION_PRICE}", price, -1) + bid.BURL = strings.Replace(bid.BURL, "${AUCTION_PRICE}", price, -1) + } +} diff --git a/adapters/blis/blis_test.go b/adapters/blis/blis_test.go new file mode 100644 index 00000000000..13cd44e7ede --- /dev/null +++ b/adapters/blis/blis_test.go @@ -0,0 +1,21 @@ +package blis + +import ( + "testing" + + "github.com/prebid/prebid-server/v3/adapters/adapterstest" + "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/openrtb_ext" +) + +func TestJsonSamples(t *testing.T) { + bidder, buildErr := Builder(openrtb_ext.BidderBlis, config.Adapter{ + Endpoint: "https://example.endpoint"}, + config.Server{ExternalUrl: "http://example.server", GvlID: 1, DataCenter: "2"}) + + if buildErr != nil { + t.Fatalf("Builder returned unexpected error %v", buildErr) + } + + adapterstest.RunJSONBidderTest(t, "blistest", bidder) +} diff --git a/adapters/blis/blistest/exemplary/valid.json b/adapters/blis/blistest/exemplary/valid.json new file mode 100644 index 00000000000..9d1e7233c8e --- /dev/null +++ b/adapters/blis/blistest/exemplary/valid.json @@ -0,0 +1,171 @@ +{ + "mockBidRequest": { + "id": "123456789", + "imp": [ + { + "ext": { + "bidder": { + "spid": "999" + } + }, + "id": "testimp", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + }, + { + "w": 728, + "h": 90 + } + ] + }, + "bidfloor": 0.98, + "bidfloorcur": "USD" + } + ], + "cur": [ + "USD" + ], + "site": { + "publisher": { + "domain": "example.com" + }, + "page": "http://lh.example.com/prebid_server_kitchen_sink.html?pbjs_debug=true", + "cat": [ + "site-cat" + ] + }, + "device": { + "w": 1434, + "h": 686, + "geo": { + "country": "USA" + }, + "ip": "8.8.8.8" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://example.endpoint", + "headers": { + "X-Supply-Partner-Id": [ + "999" + ] + }, + "impIDs": [ + "testimp" + ], + "body": { + "id": "123456789", + "imp": [ + { + "id": "testimp", + "banner": { + "format": [ + { + "w": 320, + "h": 50 + }, + { + "w": 728, + "h": 90 + } + ] + }, + "bidfloor": 0.98, + "bidfloorcur": "USD", + "ext": { + "bidder": { + "spid": "999" + } + } + } + ], + "site": { + "cat": [ + "site-cat" + ], + "page": "http://lh.example.com/prebid_server_kitchen_sink.html?pbjs_debug=true", + "publisher": { + "domain": "example.com" + } + }, + "device": { + "geo": { + "country": "USA" + }, + "ip": "8.8.8.8", + "h": 686, + "w": 1434 + }, + "cur": [ + "USD" + ] + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "123456789", + "seatbid": [ + { + "seat": "None", + "bid": [ + { + "id": "1", + "impid": "testimp", + "price": 1.2, + "crid": "9999999", + "w": 320, + "h": 50, + "adomain": [ + "example.com" + ], + "cid": "999999", + "iurl": "https://adserverexample.com/example.gif", + "adm": "\"\"", + "cat": [ + "IAB3-1" + ], + "burl": "https://trackingexample.com/pixel?wp=${AUCTION_PRICE}", + "mtype": 1 + } + ] + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "bids": [ + { + "bid": { + "id": "1", + "impid": "testimp", + "price": 1.2, + "crid": "9999999", + "w": 320, + "h": 50, + "adomain": [ + "example.com" + ], + "cid": "999999", + "iurl": "https://adserverexample.com/example.gif", + "adm": "\"\"", + "cat": [ + "IAB3-1" + ], + "burl": "https://trackingexample.com/pixel?wp=1.2", + "mtype": 1 + }, + "type": "banner" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/blis/blistest/supplemental/invalid-imp-ext-bidder.json b/adapters/blis/blistest/supplemental/invalid-imp-ext-bidder.json new file mode 100644 index 00000000000..2d0e1a270cd --- /dev/null +++ b/adapters/blis/blistest/supplemental/invalid-imp-ext-bidder.json @@ -0,0 +1,18 @@ +{ + "mockBidRequest": { + "id": "test-request", + "imp": [ + { + "id": "test-imp", + "ext": {} + } + ] + }, + + "expectedMakeRequestsErrors": [ + { + "value": "Invalid imp.ext.bidder for impression", + "comparison": "startswith" + } + ] +} \ No newline at end of file diff --git a/adapters/blis/blistest/supplemental/invalid-imp-ext.json b/adapters/blis/blistest/supplemental/invalid-imp-ext.json new file mode 100644 index 00000000000..31e261e6fa1 --- /dev/null +++ b/adapters/blis/blistest/supplemental/invalid-imp-ext.json @@ -0,0 +1,17 @@ +{ + "mockBidRequest": { + "id": "test-request", + "imp": [ + { + "id": "test-imp" + } + ] + }, + + "expectedMakeRequestsErrors": [ + { + "value": "Invalid imp.ext for impression", + "comparison": "startswith" + } + ] +} \ No newline at end of file diff --git a/adapters/blis/blistest/supplemental/response-http-204.json b/adapters/blis/blistest/supplemental/response-http-204.json new file mode 100644 index 00000000000..ef9bfee63be --- /dev/null +++ b/adapters/blis/blistest/supplemental/response-http-204.json @@ -0,0 +1,54 @@ +{ + "mockBidRequest": { + "id": "test-req", + "site": { + "page": "prebid.org" + }, + "imp": [{ + "id": "test-imp", + "banner": { + "format": [{ + "w": 300, + "h": 600 + }] + }, + "ext": { + "bidder": { + "spid": "999" + } + } + }] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://example.endpoint", + "body": { + "id": "test-req", + "site": { + "page": "prebid.org" + }, + "imp": [{ + "id": "test-imp", + "banner": { + "format": [{ + "w": 300, + "h": 600 + }] + }, + "ext": { + "bidder": { + "spid": "999" + } + } + }] + }, + "impIDs":["test-imp"] + }, + "mockResponse": { + "status": 204, + "body": {} + } + } + ] +} \ No newline at end of file diff --git a/adapters/blis/blistest/supplemental/response-http-500.json b/adapters/blis/blistest/supplemental/response-http-500.json new file mode 100644 index 00000000000..b3b3d3818b1 --- /dev/null +++ b/adapters/blis/blistest/supplemental/response-http-500.json @@ -0,0 +1,58 @@ +{ + "mockBidRequest": { + "id": "test-req", + "site": { + "page": "prebid.org" + }, + "imp": [{ + "id": "test-imp", + "banner": { + "format": [{ + "w": 300, + "h": 600 + }] + }, + "ext": { + "bidder": { + "spid": "999" + } + } + }] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://example.endpoint", + "body": { + "id": "test-req", + "site": { + "page": "prebid.org" + }, + "imp": [{ + "id": "test-imp", + "banner": { + "format": [{ + "w": 300, + "h": 600 + }] + }, + "ext": { + "bidder": { + "spid": "999" + } + } + }] + }, + "impIDs":["test-imp"] + }, + "mockResponse": { + "status": 500, + "body": {} + } + } + ], + "expectedMakeBidsErrors": [{ + "value": "Unexpected status code", + "comparison": "startswith" + }] +} \ No newline at end of file diff --git a/adapters/blis/blistest/supplemental/unsupported-media-type.json b/adapters/blis/blistest/supplemental/unsupported-media-type.json new file mode 100644 index 00000000000..a2fc2989d42 --- /dev/null +++ b/adapters/blis/blistest/supplemental/unsupported-media-type.json @@ -0,0 +1,84 @@ +{ + "mockBidRequest": { + "id": "test-req", + "site": { + "page": "prebid.org" + }, + "imp": [{ + "id": "test-imp", + "banner": { + "format": [{ + "w": 300, + "h": 600 + }] + }, + "ext": { + "bidder": { + "spid": "999" + } + } + }] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://example.endpoint", + "body": { + "id": "test-req", + "site": { + "page": "prebid.org" + }, + "imp": [{ + "id": "test-imp", + "banner": { + "format": [{ + "w": 300, + "h": 600 + }] + }, + "ext": { + "bidder": { + "spid": "999" + } + } + }] + }, + "impIDs":["test-imp"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-req", + "seatbid": [ + { + "seat": "None", + "bid": [ + { + "id": "1", + "impid": "testimp", + "price": 1.2, + "crid": "9999999", + "w": 320, + "h": 50, + "adomain": [ + "example.com" + ], + "cid": "999999", + "adm": "\"\"", + "burl": "https://trackingexample.com/pixel?wp=${AUCTION_PRICE}", + "mtype": 6 + } + ] + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "bids": [ + ] + } + ] +} \ No newline at end of file diff --git a/adapters/blis/params_test.go b/adapters/blis/params_test.go new file mode 100644 index 00000000000..376396693bf --- /dev/null +++ b/adapters/blis/params_test.go @@ -0,0 +1,44 @@ +package blis + +import ( + "encoding/json" + "testing" + + "github.com/prebid/prebid-server/v3/openrtb_ext" +) + +func TestValidParams(t *testing.T) { + validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") + if err != nil { + t.Fatalf("Failed to fetch the json schema. %v", err) + } + + for _, p := range validParams { + if err := validator.Validate(openrtb_ext.BidderBlis, json.RawMessage(p)); err != nil { + t.Errorf("Schema rejected valid params: %s", p) + } + } +} + +func TestInvalidParams(t *testing.T) { + validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") + if err != nil { + t.Fatalf("Failed to fetch the json schema. %v", err) + } + + for _, p := range invalidParams { + if err := validator.Validate(openrtb_ext.BidderBlis, json.RawMessage(p)); err == nil { + t.Errorf("Schema allowed invalid params: %s", p) + } + } +} + +var validParams = []string{ + `{"spid": "9999"}`, +} + +var invalidParams = []string{ + `{}`, + `{"spid": ""}`, + `{"spid": 9999}`, +} diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go index 07b607461f7..f81c245a8c8 100755 --- a/exchange/adapter_builders.go +++ b/exchange/adapter_builders.go @@ -63,6 +63,7 @@ import ( "github.com/prebid/prebid-server/v3/adapters/bigoad" "github.com/prebid/prebid-server/v3/adapters/blasto" "github.com/prebid/prebid-server/v3/adapters/bliink" + "github.com/prebid/prebid-server/v3/adapters/blis" "github.com/prebid/prebid-server/v3/adapters/blue" "github.com/prebid/prebid-server/v3/adapters/bluesea" "github.com/prebid/prebid-server/v3/adapters/bmtm" @@ -311,6 +312,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder { openrtb_ext.BidderBigoAd: bigoad.Builder, openrtb_ext.BidderBlasto: blasto.Builder, openrtb_ext.BidderBliink: bliink.Builder, + openrtb_ext.BidderBlis: blis.Builder, openrtb_ext.BidderBlue: blue.Builder, openrtb_ext.BidderBluesea: bluesea.Builder, openrtb_ext.BidderBmtm: bmtm.Builder, diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go index 1057a873987..6cfd07fdcbf 100644 --- a/openrtb_ext/bidders.go +++ b/openrtb_ext/bidders.go @@ -79,6 +79,7 @@ var coreBidderNames []BidderName = []BidderName{ BidderBigoAd, BidderBlasto, BidderBliink, + BidderBlis, BidderBlue, BidderBluesea, BidderBmtm, @@ -434,6 +435,7 @@ const ( BidderBigoAd BidderName = "bigoad" BidderBlasto BidderName = "blasto" BidderBliink BidderName = "bliink" + BidderBlis BidderName = "blis" BidderBlue BidderName = "blue" BidderBluesea BidderName = "bluesea" BidderBmtm BidderName = "bmtm" diff --git a/openrtb_ext/imp_blis.go b/openrtb_ext/imp_blis.go new file mode 100644 index 00000000000..937ed22f2b6 --- /dev/null +++ b/openrtb_ext/imp_blis.go @@ -0,0 +1,5 @@ +package openrtb_ext + +type ImpExtBlis struct { + SupplyPartnerID string `json:"spid"` +} diff --git a/static/bidder-info/blis.yaml b/static/bidder-info/blis.yaml new file mode 100644 index 00000000000..4316e952313 --- /dev/null +++ b/static/bidder-info/blis.yaml @@ -0,0 +1,21 @@ +endpoint: "http://10.67.0.52:8080/rtb?auth_token=30f2a2f62d69b71335ab34bad8022359" +endpointCompression: gzip +geoscope: + - global +maintainer: + email: engineering@blis.com +gvlVendorID: 94 +modifyingVastXmlAllowed: true +openrtb: + version: 2.6 +capabilities: + app: + mediaTypes: + - banner + - video + - native + site: + mediaTypes: + - banner + - video + - native \ No newline at end of file diff --git a/static/bidder-params/blis.json b/static/bidder-params/blis.json new file mode 100644 index 00000000000..df8c7aeddb7 --- /dev/null +++ b/static/bidder-params/blis.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Blis Adapter Params", + "description": "A schema which validates params accepted by the Blis adapter", + "type": "object", + + "properties": { + "spid": { + "type": "string", + "minLength": 1, + "description": "Unique supply partner ID provided by Blis" + } + }, + + "required": ["spid"] +} From 3a949451d7845ad8037390bbda171c1261ef0bf8 Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Wed, 16 Apr 2025 23:49:24 +0200 Subject: [PATCH 02/17] Blis: Add live endpoint --- static/bidder-info/blis.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/bidder-info/blis.yaml b/static/bidder-info/blis.yaml index 4316e952313..9373416af14 100644 --- a/static/bidder-info/blis.yaml +++ b/static/bidder-info/blis.yaml @@ -1,4 +1,4 @@ -endpoint: "http://10.67.0.52:8080/rtb?auth_token=30f2a2f62d69b71335ab34bad8022359" +endpoint: "https://us-east-1.lb.infinity.blismedia.com/rtb?auth_token=30f2a2f62d69b71335ab34bad8022359" endpointCompression: gzip geoscope: - global From ec6c07b512ed7a90dfc062b0038d700ce84676dd Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Fri, 25 Apr 2025 16:43:05 +0200 Subject: [PATCH 03/17] Blis: Fix tests --- adapters/blis/blis.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/adapters/blis/blis.go b/adapters/blis/blis.go index e1f49b92462..957c7940473 100644 --- a/adapters/blis/blis.go +++ b/adapters/blis/blis.go @@ -42,8 +42,6 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte headers := http.Header{} headers.Add("X-Supply-Partner-Id", impExtBidder.SupplyPartnerID) - request.Ext = append(request.Ext) - requestJSON, err := jsonutil.Marshal(request) if err != nil { return nil, []error{err} From 1ed96309b85735a0cf5c3717666dde4154647399 Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Wed, 7 May 2025 20:05:54 +0200 Subject: [PATCH 04/17] Blis: Use pointers as suggested --- adapters/blis/blis.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/adapters/blis/blis.go b/adapters/blis/blis.go index 957c7940473..5e93a28d5fb 100644 --- a/adapters/blis/blis.go +++ b/adapters/blis/blis.go @@ -75,17 +75,18 @@ func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.R bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) bidResponse.Currency = response.Cur var errors []error - for _, seatBid := range response.SeatBid { - for i := range seatBid.Bid { - bid := seatBid.Bid[i] - resolveMacros(&bid) - bidType, err := getMediaTypeForBid(&bid) + for i := range response.SeatBid { + seatBid := &response.SeatBid[i] + for j := range seatBid.Bid { + bid := &seatBid.Bid[j] + resolveMacros(bid) + bidType, err := getMediaTypeForBid(bid) if err != nil { errors = append(errors, err) continue } bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ - Bid: &bid, + Bid: bid, BidType: bidType, }) } From 4755c51933ca11c67a8ecee779ea6059a4b5877a Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Fri, 9 May 2025 16:29:00 +0200 Subject: [PATCH 05/17] Blis: Update endoint URL and maintainer email --- static/bidder-info/blis.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/bidder-info/blis.yaml b/static/bidder-info/blis.yaml index 9373416af14..f8d0e5c5668 100644 --- a/static/bidder-info/blis.yaml +++ b/static/bidder-info/blis.yaml @@ -1,9 +1,9 @@ -endpoint: "https://us-east-1.lb.infinity.blismedia.com/rtb?auth_token=30f2a2f62d69b71335ab34bad8022359" +endpoint: "https://prebid.lb.infinity.blismedia.com/rtb/213" endpointCompression: gzip geoscope: - global maintainer: - email: engineering@blis.com + email: prebid-support@blis.com gvlVendorID: 94 modifyingVastXmlAllowed: true openrtb: From 807e1c6c3986753e7231c5b5544663adf1d125a7 Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Thu, 22 May 2025 03:36:42 +0200 Subject: [PATCH 06/17] Blis: Add user sync config --- static/bidder-info/blis.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/static/bidder-info/blis.yaml b/static/bidder-info/blis.yaml index f8d0e5c5668..2560e30e4d2 100644 --- a/static/bidder-info/blis.yaml +++ b/static/bidder-info/blis.yaml @@ -18,4 +18,8 @@ capabilities: mediaTypes: - banner - video - - native \ No newline at end of file + - native +userSync: + redirect: + url: "https://tr.blismedia.com/v1/api/sync/prebid?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&r={{.RedirectURL}}" + userMacro: "%%BLIS_USER_TOKEN%%" \ No newline at end of file From 3ce7dba1aeab2615845068e5a80d4ca957c7bd43 Mon Sep 17 00:00:00 2001 From: tomaskoutny-blis <60094686+tomaskoutny-blis@users.noreply.github.com> Date: Mon, 9 Jun 2025 23:17:00 +0200 Subject: [PATCH 07/17] Apply suggestions from code review Co-authored-by: Sheridan C Rawlins <41922797+scr-oath@users.noreply.github.com> --- adapters/blis/blis.go | 6 ++---- adapters/blis/blis_test.go | 4 +--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/adapters/blis/blis.go b/adapters/blis/blis.go index 5e93a28d5fb..880beafdb12 100644 --- a/adapters/blis/blis.go +++ b/adapters/blis/blis.go @@ -75,10 +75,8 @@ func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.R bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) bidResponse.Currency = response.Cur var errors []error - for i := range response.SeatBid { - seatBid := &response.SeatBid[i] - for j := range seatBid.Bid { - bid := &seatBid.Bid[j] + for seatBid := range iterutil.SlicePointerValues(response.SeatBid) { + for bid := range iterutil.SlicePointerValues(seatBid.Bid) { resolveMacros(bid) bidType, err := getMediaTypeForBid(bid) if err != nil { diff --git a/adapters/blis/blis_test.go b/adapters/blis/blis_test.go index 13cd44e7ede..9b3b898749d 100644 --- a/adapters/blis/blis_test.go +++ b/adapters/blis/blis_test.go @@ -13,9 +13,7 @@ func TestJsonSamples(t *testing.T) { Endpoint: "https://example.endpoint"}, config.Server{ExternalUrl: "http://example.server", GvlID: 1, DataCenter: "2"}) - if buildErr != nil { - t.Fatalf("Builder returned unexpected error %v", buildErr) - } + require.NoError(t, buildErr) adapterstest.RunJSONBidderTest(t, "blistest", bidder) } From 1ad071156280508815f32ea470b74cea2977afbb Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Mon, 9 Jun 2025 23:40:59 +0200 Subject: [PATCH 08/17] Blis: Fix errors from the last commit --- adapters/blis/blis.go | 5 +++-- adapters/blis/blis_test.go | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/adapters/blis/blis.go b/adapters/blis/blis.go index 880beafdb12..a57176d8a57 100644 --- a/adapters/blis/blis.go +++ b/adapters/blis/blis.go @@ -11,6 +11,7 @@ import ( "github.com/prebid/prebid-server/v3/config" "github.com/prebid/prebid-server/v3/errortypes" "github.com/prebid/prebid-server/v3/openrtb_ext" + "github.com/prebid/prebid-server/v3/util/iterutil" "github.com/prebid/prebid-server/v3/util/jsonutil" ) @@ -75,8 +76,8 @@ func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.R bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) bidResponse.Currency = response.Cur var errors []error - for seatBid := range iterutil.SlicePointerValues(response.SeatBid) { - for bid := range iterutil.SlicePointerValues(seatBid.Bid) { + for seatBid := range iterators.SlicePointerValues(response.SeatBid) { + for bid := range iterators.SlicePointerValues(seatBid.Bid) { resolveMacros(bid) bidType, err := getMediaTypeForBid(bid) if err != nil { diff --git a/adapters/blis/blis_test.go b/adapters/blis/blis_test.go index 9b3b898749d..734e60faeff 100644 --- a/adapters/blis/blis_test.go +++ b/adapters/blis/blis_test.go @@ -6,6 +6,7 @@ import ( "github.com/prebid/prebid-server/v3/adapters/adapterstest" "github.com/prebid/prebid-server/v3/config" "github.com/prebid/prebid-server/v3/openrtb_ext" + "github.com/stretchr/testify/require" ) func TestJsonSamples(t *testing.T) { From 4476a856b0b78d88dc91de7f4f5281fc82cbe6a7 Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Tue, 17 Jun 2025 17:14:22 +0200 Subject: [PATCH 09/17] Blis: Address PR comments - add more JSON test files --- .../exemplary/{valid.json => banner.json} | 0 adapters/blis/blistest/exemplary/native.json | 129 +++++++++++++++ adapters/blis/blistest/exemplary/video.json | 153 ++++++++++++++++++ 3 files changed, 282 insertions(+) rename adapters/blis/blistest/exemplary/{valid.json => banner.json} (100%) create mode 100644 adapters/blis/blistest/exemplary/native.json create mode 100644 adapters/blis/blistest/exemplary/video.json diff --git a/adapters/blis/blistest/exemplary/valid.json b/adapters/blis/blistest/exemplary/banner.json similarity index 100% rename from adapters/blis/blistest/exemplary/valid.json rename to adapters/blis/blistest/exemplary/banner.json diff --git a/adapters/blis/blistest/exemplary/native.json b/adapters/blis/blistest/exemplary/native.json new file mode 100644 index 00000000000..53f82c5491c --- /dev/null +++ b/adapters/blis/blistest/exemplary/native.json @@ -0,0 +1,129 @@ +{ + "mockBidRequest": { + "id": "123456789", + "imp": [ + { + "id": "testimp", + "native": { + "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"img\":{\"type\":3,\"wmin\":100,\"hmin\":100}},{\"id\":3,\"data\":{\"type\":2}}]}", + "ver": "1.2" + }, + "bidfloor": 0.98, + "bidfloorcur": "USD", + "ext": { + "bidder": { + "spid": "999" + } + } + } + ], + "cur": ["USD"], + "site": { + "publisher": { + "domain": "example.com" + }, + "page": "http://lh.example.com/prebid_server_kitchen_sink.html?pbjs_debug=true", + "cat": ["site-cat"] + }, + "device": { + "w": 1434, + "h": 686, + "geo": { + "country": "USA" + }, + "ip": "8.8.8.8" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://example.endpoint", + "headers": { + "X-Supply-Partner-Id": ["999"] + }, + "impIDs": ["testimp"], + "body": { + "id": "123456789", + "imp": [ + { + "id": "testimp", + "native": { + "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"img\":{\"type\":3,\"wmin\":100,\"hmin\":100}},{\"id\":3,\"data\":{\"type\":2}}]}", + "ver": "1.2" + }, + "bidfloor": 0.98, + "bidfloorcur": "USD", + "ext": { + "bidder": { + "spid": "999" + } + } + } + ], + "site": { + "cat": ["site-cat"], + "page": "http://lh.example.com/prebid_server_kitchen_sink.html?pbjs_debug=true", + "publisher": { + "domain": "example.com" + } + }, + "device": { + "geo": { + "country": "USA" + }, + "ip": "8.8.8.8", + "h": 686, + "w": 1434 + }, + "cur": ["USD"] + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "123456789", + "seatbid": [ + { + "seat": "None", + "bid": [ + { + "id": "1", + "impid": "testimp", + "price": 1.3, + "crid": "9999999", + "adomain": ["example.com"], + "cid": "999999", + "adm": "{\"native\":{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{\"text\":\"Native Ad Title\"}},{\"id\":2,\"img\":{\"url\":\"https://adserverexample.com/image.jpg\",\"w\":1200,\"h\":627}},{\"id\":3,\"data\":{\"value\":\"Sponsored\"}}],\"link\":{\"url\":\"https://clickexample.com\"},\"imptrackers\":[\"https://trackingexample.com/pixel?wp=${AUCTION_PRICE}\"]}}", + "cat": ["IAB3-1"], + "burl": "https://trackingexample.com/pixel?wp=${AUCTION_PRICE}", + "mtype": 4 + } + ] + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "bids": [ + { + "bid": { + "id": "1", + "impid": "testimp", + "price": 1.3, + "crid": "9999999", + "adomain": ["example.com"], + "cid": "999999", + "adm": "{\"native\":{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{\"text\":\"Native Ad Title\"}},{\"id\":2,\"img\":{\"url\":\"https://adserverexample.com/image.jpg\",\"w\":1200,\"h\":627}},{\"id\":3,\"data\":{\"value\":\"Sponsored\"}}],\"link\":{\"url\":\"https://clickexample.com\"},\"imptrackers\":[\"https://trackingexample.com/pixel?wp=1.3\"]}}", + "cat": ["IAB3-1"], + "burl": "https://trackingexample.com/pixel?wp=1.3", + "mtype": 4 + }, + "type": "native" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/blis/blistest/exemplary/video.json b/adapters/blis/blistest/exemplary/video.json new file mode 100644 index 00000000000..3f1d4586a4d --- /dev/null +++ b/adapters/blis/blistest/exemplary/video.json @@ -0,0 +1,153 @@ +{ + "mockBidRequest": { + "id": "123456789", + "imp": [ + { + "ext": { + "bidder": { + "spid": "999" + } + }, + "id": "testimp", + "video": { + "mimes": ["video/mp4"], + "minduration": 5, + "maxduration": 30, + "protocols": [2, 3, 5, 6], + "w": 640, + "h": 480 + }, + "bidfloor": 0.98, + "bidfloorcur": "USD" + } + ], + "cur": [ + "USD" + ], + "site": { + "publisher": { + "domain": "example.com" + }, + "page": "http://lh.example.com/prebid_server_kitchen_sink.html?pbjs_debug=true", + "cat": [ + "site-cat" + ] + }, + "device": { + "w": 1434, + "h": 686, + "geo": { + "country": "USA" + }, + "ip": "8.8.8.8" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://example.endpoint", + "headers": { + "X-Supply-Partner-Id": [ + "999" + ] + }, + "impIDs": [ + "testimp" + ], + "body": { + "id": "123456789", + "imp": [ + { + "id": "testimp", + "video": { + "mimes": ["video/mp4"], + "minduration": 5, + "maxduration": 30, + "protocols": [2, 3, 5, 6], + "w": 640, + "h": 480 + }, + "bidfloor": 0.98, + "bidfloorcur": "USD", + "ext": { + "bidder": { + "spid": "999" + } + } + } + ], + "site": { + "cat": [ + "site-cat" + ], + "page": "http://lh.example.com/prebid_server_kitchen_sink.html?pbjs_debug=true", + "publisher": { + "domain": "example.com" + } + }, + "device": { + "geo": { + "country": "USA" + }, + "ip": "8.8.8.8", + "h": 686, + "w": 1434 + }, + "cur": [ + "USD" + ] + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "123456789", + "seatbid": [ + { + "seat": "None", + "bid": [ + { + "id": "1", + "impid": "testimp", + "price": 1.5, + "crid": "9999999", + "w": 640, + "h": 480, + "adomain": ["example.com"], + "cid": "999999", + "adm": "blistracker", + "cat": ["IAB3-1"], + "burl": "https://trackingexample.com/pixel?wp=${AUCTION_PRICE}", + "mtype": 2 + } + ] + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "bids": [ + { + "bid": { + "id": "1", + "impid": "testimp", + "price": 1.5, + "crid": "9999999", + "w": 640, + "h": 480, + "adomain": ["example.com"], + "cid": "999999", + "adm": "blistracker", + "cat": ["IAB3-1"], + "burl": "https://trackingexample.com/pixel?wp=1.5", + "mtype": 2 + }, + "type": "video" + } + ] + } + ] +} From e8bbc2686c25757e7d7032e3340f316d9a1c6b37 Mon Sep 17 00:00:00 2001 From: tomaskoutny-blis <60094686+tomaskoutny-blis@users.noreply.github.com> Date: Wed, 25 Jun 2025 18:51:40 +0200 Subject: [PATCH 10/17] Use %v for error sprintf Co-authored-by: Sheridan C Rawlins <41922797+scr-oath@users.noreply.github.com> --- adapters/blis/blis.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapters/blis/blis.go b/adapters/blis/blis.go index a57176d8a57..0d3365b5ca7 100644 --- a/adapters/blis/blis.go +++ b/adapters/blis/blis.go @@ -36,7 +36,7 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte var impExtBidder openrtb_ext.ImpExtBlis if err := jsonutil.Unmarshal(impExt.Bidder, &impExtBidder); err != nil { return nil, []error{&errortypes.BadInput{ - Message: fmt.Sprintf("Invalid imp.ext.bidder for impression index %d. Error Infomation: %s", 0, err.Error()), + Message: fmt.Sprintf("Invalid imp.ext.bidder for impression index %d. Error Infomation: %v", 0, err), }} } From 0f70dc881c42986fff807e829afa78d41167f654 Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Wed, 25 Jun 2025 20:02:40 +0200 Subject: [PATCH 11/17] Blis: Use strings.ReplaceAll --- adapters/blis/blis.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/adapters/blis/blis.go b/adapters/blis/blis.go index 0d3365b5ca7..2501b887788 100644 --- a/adapters/blis/blis.go +++ b/adapters/blis/blis.go @@ -111,8 +111,8 @@ func getMediaTypeForBid(bid *openrtb2.Bid) (openrtb_ext.BidType, error) { func resolveMacros(bid *openrtb2.Bid) { if bid != nil { price := strconv.FormatFloat(bid.Price, 'f', -1, 64) - bid.NURL = strings.Replace(bid.NURL, "${AUCTION_PRICE}", price, -1) - bid.AdM = strings.Replace(bid.AdM, "${AUCTION_PRICE}", price, -1) - bid.BURL = strings.Replace(bid.BURL, "${AUCTION_PRICE}", price, -1) + bid.NURL = strings.ReplaceAll(bid.NURL, "${AUCTION_PRICE}", price) + bid.AdM = strings.ReplaceAll(bid.AdM, "${AUCTION_PRICE}", price) + bid.BURL = strings.ReplaceAll(bid.BURL, "${AUCTION_PRICE}", price) } } From 6f14ec4b83f793bee20b29676aff16db93590307 Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Fri, 27 Jun 2025 14:52:20 +0200 Subject: [PATCH 12/17] Blis: Add SupplyId macro into the endpoint --- adapters/blis/blis.go | 23 ++++++++++++++++--- adapters/blis/blis_test.go | 11 ++++++++- adapters/blis/blistest/exemplary/banner.json | 2 +- adapters/blis/blistest/exemplary/native.json | 2 +- adapters/blis/blistest/exemplary/video.json | 2 +- .../supplemental/response-http-204.json | 2 +- .../supplemental/response-http-500.json | 2 +- .../supplemental/unsupported-media-type.json | 2 +- static/bidder-info/blis.yaml | 2 +- 9 files changed, 37 insertions(+), 11 deletions(-) diff --git a/adapters/blis/blis.go b/adapters/blis/blis.go index 2501b887788..ffbb2870078 100644 --- a/adapters/blis/blis.go +++ b/adapters/blis/blis.go @@ -5,23 +5,30 @@ import ( "net/http" "strconv" "strings" + "text/template" "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/prebid-server/v3/adapters" "github.com/prebid/prebid-server/v3/config" "github.com/prebid/prebid-server/v3/errortypes" + "github.com/prebid/prebid-server/v3/macros" "github.com/prebid/prebid-server/v3/openrtb_ext" "github.com/prebid/prebid-server/v3/util/iterutil" "github.com/prebid/prebid-server/v3/util/jsonutil" ) type adapter struct { - endpoint string + endpointTemplate *template.Template } func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { + endpointTemplate, err := template.New("endpointTemplate").Parse(config.Endpoint) + if err != nil { + return nil, fmt.Errorf("unable to parse endpoint url template: %v", err) + } + bidder := &adapter{ - endpoint: config.Endpoint, + endpointTemplate: endpointTemplate, } return bidder, nil } @@ -40,6 +47,11 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte }} } + endpoint, err := a.buildEndpointURL(&impExtBidder) + if err != nil { + return nil, []error{err} + } + headers := http.Header{} headers.Add("X-Supply-Partner-Id", impExtBidder.SupplyPartnerID) @@ -50,7 +62,7 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte requestData := &adapters.RequestData{ Method: "POST", - Uri: a.endpoint, + Uri: endpoint, Headers: headers, Body: requestJSON, ImpIDs: openrtb_ext.GetImpIDs(request.Imp), @@ -59,6 +71,11 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte return []*adapters.RequestData{requestData}, nil } +func (a *adapter) buildEndpointURL(impExtBidder *openrtb_ext.ImpExtBlis) (string, error) { + endpointParams := macros.EndpointTemplateParams{SupplyId: impExtBidder.SupplyPartnerID} + return macros.ResolveMacros(a.endpointTemplate, endpointParams) +} + func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { if adapters.IsResponseStatusCodeNoContent(responseData) { return nil, nil diff --git a/adapters/blis/blis_test.go b/adapters/blis/blis_test.go index 734e60faeff..b9fcc9836a2 100644 --- a/adapters/blis/blis_test.go +++ b/adapters/blis/blis_test.go @@ -1,6 +1,7 @@ package blis import ( + "github.com/stretchr/testify/assert" "testing" "github.com/prebid/prebid-server/v3/adapters/adapterstest" @@ -9,9 +10,17 @@ import ( "github.com/stretchr/testify/require" ) +func TestEndpointTemplateMalformed(t *testing.T) { + _, buildErr := Builder(openrtb_ext.BidderBlis, config.Adapter{ + Endpoint: "{{Malformed}}"}, + config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) + + assert.Error(t, buildErr) +} + func TestJsonSamples(t *testing.T) { bidder, buildErr := Builder(openrtb_ext.BidderBlis, config.Adapter{ - Endpoint: "https://example.endpoint"}, + Endpoint: "https://example.endpoint/{{.SupplyId}}"}, config.Server{ExternalUrl: "http://example.server", GvlID: 1, DataCenter: "2"}) require.NoError(t, buildErr) diff --git a/adapters/blis/blistest/exemplary/banner.json b/adapters/blis/blistest/exemplary/banner.json index 9d1e7233c8e..e793e8dd174 100644 --- a/adapters/blis/blistest/exemplary/banner.json +++ b/adapters/blis/blistest/exemplary/banner.json @@ -49,7 +49,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://example.endpoint", + "uri": "https://example.endpoint/999", "headers": { "X-Supply-Partner-Id": [ "999" diff --git a/adapters/blis/blistest/exemplary/native.json b/adapters/blis/blistest/exemplary/native.json index 53f82c5491c..b49914d9db3 100644 --- a/adapters/blis/blistest/exemplary/native.json +++ b/adapters/blis/blistest/exemplary/native.json @@ -37,7 +37,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://example.endpoint", + "uri": "https://example.endpoint/999", "headers": { "X-Supply-Partner-Id": ["999"] }, diff --git a/adapters/blis/blistest/exemplary/video.json b/adapters/blis/blistest/exemplary/video.json index 3f1d4586a4d..3eb743e1e7b 100644 --- a/adapters/blis/blistest/exemplary/video.json +++ b/adapters/blis/blistest/exemplary/video.json @@ -45,7 +45,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://example.endpoint", + "uri": "https://example.endpoint/999", "headers": { "X-Supply-Partner-Id": [ "999" diff --git a/adapters/blis/blistest/supplemental/response-http-204.json b/adapters/blis/blistest/supplemental/response-http-204.json index ef9bfee63be..2803abe9941 100644 --- a/adapters/blis/blistest/supplemental/response-http-204.json +++ b/adapters/blis/blistest/supplemental/response-http-204.json @@ -22,7 +22,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://example.endpoint", + "uri": "https://example.endpoint/999", "body": { "id": "test-req", "site": { diff --git a/adapters/blis/blistest/supplemental/response-http-500.json b/adapters/blis/blistest/supplemental/response-http-500.json index b3b3d3818b1..14f878d5f5d 100644 --- a/adapters/blis/blistest/supplemental/response-http-500.json +++ b/adapters/blis/blistest/supplemental/response-http-500.json @@ -22,7 +22,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://example.endpoint", + "uri": "https://example.endpoint/999", "body": { "id": "test-req", "site": { diff --git a/adapters/blis/blistest/supplemental/unsupported-media-type.json b/adapters/blis/blistest/supplemental/unsupported-media-type.json index a2fc2989d42..4a6a40f6a28 100644 --- a/adapters/blis/blistest/supplemental/unsupported-media-type.json +++ b/adapters/blis/blistest/supplemental/unsupported-media-type.json @@ -22,7 +22,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://example.endpoint", + "uri": "https://example.endpoint/999", "body": { "id": "test-req", "site": { diff --git a/static/bidder-info/blis.yaml b/static/bidder-info/blis.yaml index 2560e30e4d2..0c8164f5473 100644 --- a/static/bidder-info/blis.yaml +++ b/static/bidder-info/blis.yaml @@ -1,4 +1,4 @@ -endpoint: "https://prebid.lb.infinity.blismedia.com/rtb/213" +endpoint: "https://prebid.lb.infinity.blismedia.com/rtb/213/{{.SupplyId}}" endpointCompression: gzip geoscope: - global From 238d098d4a19bccc6744317bc836d7c28715f80f Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Tue, 15 Jul 2025 23:29:45 +0200 Subject: [PATCH 13/17] Blis: Alter switch statement --- adapters/blis/blis.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/adapters/blis/blis.go b/adapters/blis/blis.go index ffbb2870078..dcf3d226a3a 100644 --- a/adapters/blis/blis.go +++ b/adapters/blis/blis.go @@ -118,10 +118,10 @@ func getMediaTypeForBid(bid *openrtb2.Bid) (openrtb_ext.BidType, error) { return openrtb_ext.BidTypeVideo, nil case openrtb2.MarkupNative: return openrtb_ext.BidTypeNative, nil - } - - return "", &errortypes.BadServerResponse{ - Message: fmt.Sprintf("Failed to parse media type of impression ID \"%s\"", bid.ImpID), + default: + return "", &errortypes.BadServerResponse{ + Message: fmt.Sprintf("Failed to parse media type of impression ID \"%s\"", bid.ImpID), + } } } From 55ccc3a121bc6ff1841d537bb8308778daf7b376 Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Tue, 22 Jul 2025 17:46:15 +0200 Subject: [PATCH 14/17] Blis: Catch up to master - iterutil --- adapters/blis/blis.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adapters/blis/blis.go b/adapters/blis/blis.go index dcf3d226a3a..d3f2fb3c9ea 100644 --- a/adapters/blis/blis.go +++ b/adapters/blis/blis.go @@ -93,8 +93,8 @@ func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.R bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) bidResponse.Currency = response.Cur var errors []error - for seatBid := range iterators.SlicePointerValues(response.SeatBid) { - for bid := range iterators.SlicePointerValues(seatBid.Bid) { + for seatBid := range iterutil.SlicePointerValues(response.SeatBid) { + for bid := range iterutil.SlicePointerValues(seatBid.Bid) { resolveMacros(bid) bidType, err := getMediaTypeForBid(bid) if err != nil { From 56540db73f357acad2fa5011693d62033ca3d7a7 Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Tue, 22 Jul 2025 21:28:29 +0200 Subject: [PATCH 15/17] Blis: Format error with %w --- adapters/blis/blis.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapters/blis/blis.go b/adapters/blis/blis.go index d3f2fb3c9ea..d15f05fcf75 100644 --- a/adapters/blis/blis.go +++ b/adapters/blis/blis.go @@ -24,7 +24,7 @@ type adapter struct { func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { endpointTemplate, err := template.New("endpointTemplate").Parse(config.Endpoint) if err != nil { - return nil, fmt.Errorf("unable to parse endpoint url template: %v", err) + return nil, fmt.Errorf("unable to parse endpoint url template: %w", err) } bidder := &adapter{ From f172f95013c72632d417fbede1917c1d2d9645a9 Mon Sep 17 00:00:00 2001 From: Tomas Koutny Date: Wed, 23 Jul 2025 18:23:40 +0200 Subject: [PATCH 16/17] Blis: Change test structure as recommended --- adapters/blis/params_test.go | 69 ++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/adapters/blis/params_test.go b/adapters/blis/params_test.go index 376396693bf..2a62836a062 100644 --- a/adapters/blis/params_test.go +++ b/adapters/blis/params_test.go @@ -5,40 +5,57 @@ import ( "testing" "github.com/prebid/prebid-server/v3/openrtb_ext" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) -func TestValidParams(t *testing.T) { - validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") - if err != nil { - t.Fatalf("Failed to fetch the json schema. %v", err) - } - - for _, p := range validParams { - if err := validator.Validate(openrtb_ext.BidderBlis, json.RawMessage(p)); err != nil { - t.Errorf("Schema rejected valid params: %s", p) - } - } +type testSpec struct { + name string + json string + wantErr bool } -func TestInvalidParams(t *testing.T) { +func testParams(t *testing.T, specs []testSpec) { validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") - if err != nil { - t.Fatalf("Failed to fetch the json schema. %v", err) - } - - for _, p := range invalidParams { - if err := validator.Validate(openrtb_ext.BidderBlis, json.RawMessage(p)); err == nil { - t.Errorf("Schema allowed invalid params: %s", p) - } + require.NoError(t, err, "Failed to fetch the json schema") + + for _, spec := range specs { + t.Run(spec.name, func(t *testing.T) { + err := validator.Validate(openrtb_ext.BidderBlis, json.RawMessage(spec.json)) + if spec.wantErr { + assert.Error(t, err, "Expected error but got none for: %s", spec.json) + } else { + assert.NoError(t, err, "Unexpected error for: %s", spec.json) + } + }) } } -var validParams = []string{ - `{"spid": "9999"}`, +func TestValidParams(t *testing.T) { + testParams(t, []testSpec{ + { + name: "Valid params with spid", + json: `{"spid": "9999"}`, + }, + }) } -var invalidParams = []string{ - `{}`, - `{"spid": ""}`, - `{"spid": 9999}`, +func TestInvalidParams(t *testing.T) { + testParams(t, []testSpec{ + { + name: "Empty params", + json: `{}`, + wantErr: true, + }, + { + name: "Empty spid", + json: `{"spid": ""}`, + wantErr: true, + }, + { + name: "Invalid spid type", + json: `{"spid": 9999}`, + wantErr: true, + }, + }) } From a2b80aef7259450436fc7af1f12319ee4c173eed Mon Sep 17 00:00:00 2001 From: tomaskoutny-blis <60094686+tomaskoutny-blis@users.noreply.github.com> Date: Fri, 25 Jul 2025 12:28:25 +0200 Subject: [PATCH 17/17] Blis: Update error message Co-authored-by: Sheridan C Rawlins <41922797+scr-oath@users.noreply.github.com> --- adapters/blis/blis.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapters/blis/blis.go b/adapters/blis/blis.go index d15f05fcf75..ed701a2241f 100644 --- a/adapters/blis/blis.go +++ b/adapters/blis/blis.go @@ -37,7 +37,7 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte var impExt adapters.ExtImpBidder if err := jsonutil.Unmarshal(request.Imp[0].Ext, &impExt); err != nil { return nil, []error{&errortypes.BadInput{ - Message: fmt.Sprintf("Invalid imp.ext for impression index %d. Error Infomation: %s", 0, err.Error()), + Message: fmt.Sprintf("Invalid imp.ext for impression index %d. Error Infomation: %v", 0, err), }} } var impExtBidder openrtb_ext.ImpExtBlis