Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

New Adapter: Zentotem #3866

Closed
wants to merge 89 commits into from
Closed
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
9aef1ae
zentotem: add adapter
GermanBogatov Jul 2, 2024
6fdcc11
zentotem: add adapter
GermanBogatov Jul 10, 2024
3edd765
zentotem: add adapter
GermanBogatov Jul 11, 2024
9ec095a
zentotem: add adapter
GermanBogatov Jul 12, 2024
a7d9462
zentotem: add adapter
GermanBogatov Jul 30, 2024
36a4b0f
zentotem: add adapter
GermanBogatov Jul 30, 2024
9c6b5e3
zentotem: add adapter
GermanBogatov Aug 1, 2024
b3caeaa
Merge branch 'prebid:master' into master
zentotem Aug 16, 2024
e4bd6d3
ADTS-455 remove video validations (#3842)
gg-natalia Aug 18, 2024
153ebf5
zentotem: add adapter
GermanBogatov Aug 20, 2024
f075a67
Merge remote-tracking branch 'origin/master'
GermanBogatov Aug 20, 2024
6f3f47c
zentotem: add adapter
GermanBogatov Aug 20, 2024
6be7244
Update Vidazoo bidder info for GPP support (#3869)
saar120 Aug 21, 2024
e8509e6
declare support for ORTB 2.6 (#3872)
bretg Aug 21, 2024
d161712
new adapter (#3833)
Pubrise Aug 21, 2024
a556e2d
Fix currency conversion bug. (#3867)
CTMBNara Aug 21, 2024
59a5b07
freewheel-adapter: support 2.6 (#3873)
mwang-sticky Aug 21, 2024
54f8759
Update mobilefuse.yaml to indicate support for OpenRTB 2.6 and GPP (#…
dtbarne Aug 21, 2024
bd85ba4
specifies ortb 2.6 support (#3) (#3876)
nickllerandi Aug 22, 2024
84a8162
PulsePoint: ortb 2.6 version and gpp support (#3874)
anand-venkatraman Aug 22, 2024
536f118
zentotem: fix after review
GermanBogatov Aug 22, 2024
b5cb591
zentotem: fix after review
GermanBogatov Aug 22, 2024
8d7117d
Revert "New Module: 51Degrees (#3650)" (#3888)
bsardo Aug 27, 2024
4ea0e33
New Adapter: Copper6SSP (#3755)
Copper6SSP Aug 30, 2024
2e2b49f
New Adapter: Escalax (#3798)
escalax Aug 30, 2024
e825553
New Adapter: Oraki (#3839)
BenOraki Aug 30, 2024
f7caea5
OpenX: indicate support for OpenRTB 2.6 (#3879)
bwschmidt Aug 30, 2024
8237f7f
Refactor Bid Splitter Privacy Functions (#3645)
SyntaxNode Sep 3, 2024
ec6a45d
Agma: Allow app.bundle to be used as selector for apps (#3780)
steffenmllr Sep 4, 2024
6a011ed
Update github.com/rs/cors to v1.11.0 (#3884)
ccorbo Sep 11, 2024
b920cca
Playdigo: Add tcfeu support (#3890)
Yanivplaydigo Sep 11, 2024
e0a21d0
QT: Add tcfeu support (#3892)
qt-io Sep 11, 2024
6cbedf0
Smartx: Declare OpenRTB 2.6 support (#3896)
schubert-sc Sep 11, 2024
7613ff5
Update adapter json test framework to validate BidVideo (#3835)
laurb9 Sep 12, 2024
c02ee8c
Update exchange json tests with correct hb_pb_cat_dur (#3836)
laurb9 Sep 12, 2024
ffdd75f
New Adapter: AdTonos (#3853)
rkaw92 Sep 12, 2024
3e24be7
New Adapter: TGM (#3848)
apykhteyev Sep 13, 2024
640b97c
LemmaDigital: change endpoint (#3862)
lm-ved Sep 16, 2024
3c4527e
Adnuntius: Return DSA in bid response (#3777)
mikael-lundin Sep 18, 2024
905b3a5
Log non bid reasons in bidder framework (#2891)
ShriprasadM Sep 19, 2024
93368cc
ConnectAd: String/int fix (#3925)
rtuschkany Sep 19, 2024
11b6546
Rubicon: Pass PBS host info to XAPI (#3903)
And1sS Sep 23, 2024
4462fce
51degrees module (#3893)
justadreamer Sep 25, 2024
8b1b96e
Add docs build readme (#3930)
bsardo Sep 25, 2024
c42fe53
InMobi: mtype support (#3921)
bkaneyama Sep 25, 2024
53f51a6
GPC: Set extension based on header (#3895)
przemkaczmarek Sep 25, 2024
6c154e0
New Adapter: Streamlyn (#3900)
apykhteyev Sep 25, 2024
f27bcef
New Adapter: Bidmatic (#3731)
dkornet-ad Oct 3, 2024
8689e0d
Sonobi: native and currency conversion support (#3889)
bansawbanchee Oct 7, 2024
d54c3ed
New Adapter: Missena (#3761)
ysfbsf Oct 8, 2024
64584f6
Refactor: Remove getAuctionBidderRequests (#3957)
bsardo Oct 8, 2024
87d4412
Refactor: Move privacy init up (#3958)
bsardo Oct 9, 2024
9bb9b3d
Unruly: Indicate Support for OpenRTB 2.6 (#3984)
bhainesnexxen Oct 15, 2024
c37951a
update yieldmo.yaml to indicate support for ortb 2.6 (#3968)
ym-winston Oct 15, 2024
5fcbbbf
Triplelift: Adding flag for 2.6 support (#3966)
patrickloughrey Oct 15, 2024
cbe9876
enable gzip (#3946)
ikagotso Oct 15, 2024
b56923c
RTB House: Resolve AUCTION_PRICE macro (#3901)
piotrj-rtbh Oct 15, 2024
8134328
Displayio: Make imp.bidfloor optional (#3959)
xdevel Oct 16, 2024
451bc44
BlueSea: Add site capability (#3910)
blueseasx Oct 16, 2024
bcf6491
GumGum: Declare ORTB 2.6 support (#3985)
sindhuja-sridharan Oct 17, 2024
18f6798
Bump Go version to 1.22 in dev containers config (#3983)
sebhtml Oct 22, 2024
03a4abd
Sample: Fix prebid js loading bug on sample html page (#3792)
And1sS Oct 22, 2024
a23380f
ImproveDigital: Remove placementKey & addtlconsent parsing (#3728)
ishihanvcs Oct 29, 2024
ddf897c
Update Cookie Sync Chooser Debug Message to match Java (#3558)
AlexBVolcy Oct 29, 2024
1419761
Rename Blacklisted Apps to Blocked Apps (#3620)
SyntaxNode Oct 29, 2024
db2a872
ORTB 2.6: Full support with down convert for 2.5 adapters (#4019)
bsardo Oct 29, 2024
df58baf
Cookie Sync: Use max when limit is 0 (#4022)
bsardo Oct 30, 2024
3907f1a
Remove Default Request Hardcoded Aliases (#4020)
SyntaxNode Oct 30, 2024
5b11f59
Adapters: Update to use jsonutil unmarshal (#4021)
bsardo Oct 30, 2024
6e150f3
Increment Package Version To v3 (#4029)
SyntaxNode Oct 31, 2024
a788661
GumGum: Override the default currency (#3928)
MartinGumGum Nov 4, 2024
3403544
PgamSSP: Add currency converter (#3907)
PGAMSSP Nov 4, 2024
106f6e4
IQzone: Add user sync (#3971)
IQZoneAdx Nov 4, 2024
181d523
Fix: Delete user.ext.prebid.buyeruids after extraction (#4049)
bsardo Nov 13, 2024
24ba83b
Krushmedia: Update user sync urls (#3979)
Krushmedia Nov 13, 2024
63af8af
New Adapter: Nativo (#3790)
rafataveira Nov 13, 2024
573c59e
zentotem: add adapter
GermanBogatov Jul 2, 2024
f8ee4ed
zentotem: add adapter
GermanBogatov Jul 10, 2024
4bee7d9
zentotem: add adapter
GermanBogatov Jul 11, 2024
5cb43d2
zentotem: add adapter
GermanBogatov Jul 12, 2024
b6bc533
zentotem: add adapter
GermanBogatov Jul 30, 2024
39567ab
zentotem: add adapter
GermanBogatov Jul 30, 2024
93e3969
zentotem: add adapter
GermanBogatov Aug 1, 2024
bd22820
zentotem: add adapter
GermanBogatov Aug 20, 2024
2b0b9b1
zentotem: add adapter
GermanBogatov Aug 20, 2024
7a2144a
zentotem: fix after review
GermanBogatov Aug 22, 2024
d4290d3
zentotem: fix after review
GermanBogatov Aug 22, 2024
764f48a
zentotem: replace v2 to v3
GermanBogatov Nov 13, 2024
dc73050
Merge remote-tracking branch 'origin/master'
GermanBogatov Nov 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions adapters/zentotem/params_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package zentotem

import (
"encoding/json"
"github.com/prebid/prebid-server/v2/openrtb_ext"
"testing"
)

//Zentotem doesn't currently require any custom fields. This file is included for conformity only
//We do include an unused, non-required custom param in static/bidder-params/zentotem.json, but only to hinder the prebid server from crashing by looking for at least 1 custom param

// This file actually intends to test static/bidder-params/zentotem.json
//
// These also validate the format of the external API: request.imp[i].ext.prebid.bidder.zentotem
// TestValidParams makes sure that the Zentotem schema accepts all imp.ext fields which we intend to support.
func TestValidParams(t *testing.T) {
validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
if err != nil {
t.Fatalf("Failed to fetch the json-schemas. %v", err)
}

for _, validParam := range validParams {
if err := validator.Validate(openrtb_ext.BidderZentotem, json.RawMessage(validParam)); err != nil {
t.Errorf("Schema rejected Zentotem params: %s", validParam)
}
}
}

// TestInvalidParams makes sure that the Zentotem schema rejects all the imp.ext fields we don't support.
func TestInvalidParams(t *testing.T) {
validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
if err != nil {
t.Fatalf("Failed to fetch the json-schemas. %v", err)
}

for _, invalidParam := range invalidParams {
if err := validator.Validate(openrtb_ext.BidderZentotem, json.RawMessage(invalidParam)); err == nil {
t.Errorf("Schema allowed unexpected params: %s", invalidParam)
}
}
}

var validParams = []string{}

var invalidParams = []string{}
113 changes: 113 additions & 0 deletions adapters/zentotem/zentotem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package zentotem

import (
"encoding/json"
"fmt"
"github.com/prebid/openrtb/v20/openrtb2"
"github.com/prebid/prebid-server/v2/adapters"
"github.com/prebid/prebid-server/v2/config"
"github.com/prebid/prebid-server/v2/errortypes"
"github.com/prebid/prebid-server/v2/openrtb_ext"
"net/http"
)

type adapter struct {
endpoint string
}

// Builder builds a new instance of the {bidder} adapter for the given bidder with the given config.
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) {
if request == nil {
return nil, []error{&errortypes.BadInput{Message: "empty request"}}
}
if len(request.Imp) == 0 {
return nil, []error{&errortypes.BadInput{Message: "empty request.Imp"}}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to perform these checks. These are covered by the core predid server code.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed


requests := make([]*adapters.RequestData, 0, len(request.Imp))
var errors []error

requestCopy := *request
for _, imp := range request.Imp {
requestCopy.Imp = []openrtb2.Imp{imp}

requestJSON, err := json.Marshal(request)
if err != nil {
errors = append(errors, err)
continue
}

requestData := &adapters.RequestData{
Method: "POST",
Uri: a.endpoint,
Body: requestJSON,
ImpIDs: []string{imp.ID},
}
requests = append(requests, requestData)
}
return requests, errors
}

func getMediaTypeForBid(bid openrtb2.Bid) (openrtb_ext.BidType, error) {
if bid.Ext != nil {
var bidExt openrtb_ext.ExtBid
err := json.Unmarshal(bid.Ext, &bidExt)
if err == nil && bidExt.Prebid != nil {
return openrtb_ext.ParseBidType(string(bidExt.Prebid.Type))

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider this as a suggestion. Prebid server expects the media type to be explicitly set in the adapter response. Therefore, recommends implementing a pattern where the adapter server sets the MType field in the response to accurately determine the media type for the impression.

}
}

return "", &errortypes.BadServerResponse{
Message: fmt.Sprintf("Failed to parse impression \"%s\" mediatype", bid.ImpID),
}
}

func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
if responseData.StatusCode == http.StatusNoContent {
return nil, nil
}

if responseData.StatusCode == http.StatusBadRequest {
err := &errortypes.BadInput{
Message: "Unexpected status code: 400. Bad request from publisher. Run with request.debug = 1 for more info.",
}
return nil, []error{err}
}

if responseData.StatusCode != http.StatusOK {
err := &errortypes.BadServerResponse{
Message: fmt.Sprintf("Unexpected status code: %d. Run with request.debug = 1 for more info.", responseData.StatusCode),
}
return nil, []error{err}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please reuse -

if adapters.IsResponseStatusCodeNoContent(responseData) {
		return nil, nil
	}

	if err := adapters.CheckResponseStatusCodeForErrors(responseData); err != nil {
		return nil, []error{err}
	}

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed


var response openrtb2.BidResponse
if err := json.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, bid := range seatBid.Bid {
bidType, err := getMediaTypeForBid(bid)
if err != nil {
errors = append(errors, err)
continue
}
bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{
Bid: &seatBid.Bid[i],
BidType: bidType,
})
}
}
return bidResponse, nil
}
19 changes: 19 additions & 0 deletions adapters/zentotem/zentotem_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package zentotem

import (
"github.com/prebid/prebid-server/v2/adapters/adapterstest"
"github.com/prebid/prebid-server/v2/config"
"github.com/prebid/prebid-server/v2/openrtb_ext"
"testing"
)

func TestJsonSamples(t *testing.T) {
bidder, buildErr := Builder(openrtb_ext.BidderZentotem, config.Adapter{
Endpoint: "https://rtb.zentotem.net/bid?sspuid=cqlnvfk00bhs0b6rci6g"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"})

if buildErr != nil {
t.Fatalf("Builder returned unexpected error %v", buildErr)
}

adapterstest.RunJSONBidderTest(t, "zentotemtest", bidder)
}
192 changes: 192 additions & 0 deletions adapters/zentotem/zentotemtest/exemplary/banner-200-212.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
{
"mockBidRequest": {
"id": "058e84c8-3684-4725-be57-6a211fb8abc3",
"at": 2,
"bcat": [ "IAB8-18", "IAB8-5", "IAB9-9" ],
"cur": [
"RUB"
],
"tmax": 250,
"imp": [
{
"id": "test-imp-id",
"bidfloor": 10,
"bidfloorcur": "RUB",
"tagid": "65f0c2a2feb788d7",
"displaymanager": "Fyber",
"displaymanagerver": "10.1.1",
"banner": {
"api": [
4,5
],
"mimes": [
"application/javascript",
"text/html",
"text/javascript",
"image/png",
"image/jpeg",
"image/gif"
]
},
"instl": 1
}
],
"app": {
"privacypolicy": 1,
"paid": 0,
"id": "1757830",
"name": "some-app-name",
"bundle": "some-app-bundle",
"storeurl": "some-store-url",
"cat": [

"IAB1-1"
],
"publisher": {
"id": "gambling"
}
},
"device": {
"dnt": 0,
"devicetype": 4,
"h": 980,
"w": 350,
"connectiontype": 2,
"ua": "Mozilla/5.0 (Linux; Android 10; YAL-L21 Build/HUAWEIYAL-L21; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.131 Mobile Safari/537.36",
"ip": "95.104.196.182",
"make": "Huawei",
"model": "YAL-L21",
"os": "Android",
"osv": "10.0",
"ifa": "6cecfc3c-de97-4861-ba6c-41a9dc94b391",
"geo": {
"country": "RUS"
}
},
"user": {
"id": "6cecfc3c-de97-4861-ba6c-41a9dc94b391"
}
},
"httpCalls": [
{
"expectedRequest": {
"uri": "https://rtb.zentotem.net/bid?sspuid=cqlnvfk00bhs0b6rci6g",
"body": {
"id": "058e84c8-3684-4725-be57-6a211fb8abc3",
"at": 2,
"bcat": [ "IAB8-18", "IAB8-5", "IAB9-9" ],
"cur": [
"RUB"
],
"tmax": 250,
"imp": [
{
"id": "test-imp-id",
"bidfloor": 10,
"bidfloorcur": "RUB",
"tagid": "65f0c2a2feb788d7",
"displaymanager": "Fyber",
"displaymanagerver": "10.1.1",
"banner": {
"api": [
4,5
],
"mimes": [
"application/javascript",
"text/html",
"text/javascript",
"image/png",
"image/jpeg",
"image/gif"
]
},
"instl": 1
}
],
"app": {
"privacypolicy": 1,
"paid": 0,
"id": "1757830",
"name": "some-app-name",
"bundle": "some-app-bundle",
"storeurl": "some-store-url",
"cat": [

"IAB1-1"
],
"publisher": {
"id": "gambling"
}
},
"device": {
"dnt": 0,
"devicetype": 4,
"h": 980,
"w": 350,
"connectiontype": 2,
"ua": "Mozilla/5.0 (Linux; Android 10; YAL-L21 Build/HUAWEIYAL-L21; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.131 Mobile Safari/537.36",
"ip": "95.104.196.182",
"make": "Huawei",
"model": "YAL-L21",
"os": "Android",
"osv": "10.0",
"ifa": "6cecfc3c-de97-4861-ba6c-41a9dc94b391",
"geo": {
"country": "RUS"
}
},
"user": {
"id": "6cecfc3c-de97-4861-ba6c-41a9dc94b391"
}
},
"impIDs":["test-imp-id"]
},
"mockResponse": {
"status": 200,
"body": {
"id": "test-request-id",
"seatbid": [
{
"bid": [
{
"id": "36",
"impid": "1",
"price": 150,
"nurl": "some-test-nurl",
"burl": "some-test-burl",
"adm": "some-test-adm",
"adid": "36",
"adomain": [
"app.apple.com"
],
"crid": "36"
}
],
"seat": "boldwin"
}
],
"cur": "USD"
}
}
}
],
"expectedBidResponses": [
{
"bid": [
{
"id": "36",
"impid": "1",
"price": 150,
"nurl": "some-test-nurl",
"burl": "some-test-burl",
"adm": "some-test-adm",
"adid": "36",
"adomain": [
"app.apple.com"
],
"crid": "36"
}
]
}
]
}
Loading
Loading