Skip to content

Commit 76901fc

Browse files
Merge branch 'master' into attekmi_update_root_domain
2 parents 787f5c2 + 4898ef0 commit 76901fc

82 files changed

Lines changed: 3716 additions & 1526 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
package alliance_gravity
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"net/http"
7+
8+
"github.com/prebid/openrtb/v20/openrtb2"
9+
"github.com/prebid/prebid-server/v3/adapters"
10+
"github.com/prebid/prebid-server/v3/config"
11+
"github.com/prebid/prebid-server/v3/errortypes"
12+
"github.com/prebid/prebid-server/v3/openrtb_ext"
13+
"github.com/prebid/prebid-server/v3/util/jsonutil"
14+
)
15+
16+
type adapter struct {
17+
endpoint string
18+
}
19+
20+
func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
21+
bidder := &adapter{
22+
endpoint: config.Endpoint,
23+
}
24+
return bidder, nil
25+
}
26+
27+
func generateImps(imps []openrtb2.Imp) ([]openrtb2.Imp, error) {
28+
var generatedImps []openrtb2.Imp
29+
for _, imp := range imps {
30+
var bidderExt adapters.ExtImpBidder
31+
if err := jsonutil.Unmarshal(imp.Ext, &bidderExt); err != nil {
32+
return nil, &errortypes.BadInput{
33+
Message: err.Error(),
34+
}
35+
}
36+
37+
var allianceGravityExt openrtb_ext.ExtImpAllianceGravity
38+
if err := jsonutil.Unmarshal(bidderExt.Bidder, &allianceGravityExt); err != nil {
39+
return nil, &errortypes.BadInput{
40+
Message: err.Error(),
41+
}
42+
}
43+
44+
bidderExt.Bidder = json.RawMessage(`{}`)
45+
bidderExt.Prebid = &openrtb_ext.ExtImpPrebid{
46+
StoredRequest: &openrtb_ext.ExtStoredRequest{
47+
ID: allianceGravityExt.SrId,
48+
},
49+
}
50+
51+
bidderExtJSON, err := jsonutil.Marshal(bidderExt)
52+
if err != nil {
53+
return nil, &errortypes.BadInput{
54+
Message: err.Error(),
55+
}
56+
}
57+
58+
impCopy := imp
59+
impCopy.Ext = bidderExtJSON
60+
61+
generatedImps = append(generatedImps, impCopy)
62+
}
63+
return generatedImps, nil
64+
}
65+
66+
func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
67+
var generatedImps, err = generateImps(request.Imp)
68+
if err != nil {
69+
return nil, []error{err}
70+
}
71+
72+
request.Imp = generatedImps
73+
74+
requestJSON, err := jsonutil.Marshal(request)
75+
76+
if err != nil {
77+
return nil, []error{err}
78+
}
79+
80+
headers := http.Header{}
81+
headers.Add("Content-Type", "application/json;charset=utf-8")
82+
headers.Add("Accept", "application/json")
83+
84+
if request.Device != nil {
85+
if request.Device.UA != "" {
86+
headers.Add("User-Agent", request.Device.UA)
87+
}
88+
if request.Device.IP != "" {
89+
headers.Add("X-Forwarded-For", request.Device.IP)
90+
} else if request.Device.IPv6 != "" {
91+
headers.Add("X-Forwarded-For", request.Device.IPv6)
92+
}
93+
}
94+
if request.Site != nil {
95+
if request.Site.Page != "" {
96+
headers.Add("Referer", request.Site.Page)
97+
}
98+
}
99+
100+
if request.User != nil && request.User.BuyerUID != "" {
101+
headers.Add("Cookie", "uids="+request.User.BuyerUID)
102+
}
103+
104+
requestData := &adapters.RequestData{
105+
Method: "POST",
106+
Uri: a.endpoint,
107+
Body: requestJSON,
108+
Headers: headers,
109+
ImpIDs: openrtb_ext.GetImpIDs(request.Imp),
110+
}
111+
112+
return []*adapters.RequestData{requestData}, nil
113+
}
114+
115+
func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
116+
if responseData.StatusCode == http.StatusNoContent {
117+
return nil, nil
118+
}
119+
120+
if responseData.StatusCode == http.StatusBadRequest {
121+
err := &errortypes.BadInput{
122+
Message: "Unexpected status code: 400. Bad request from publisher. Run with request.debug = 1 for more info.",
123+
}
124+
return nil, []error{err}
125+
}
126+
127+
if responseData.StatusCode != http.StatusOK {
128+
err := &errortypes.BadServerResponse{
129+
Message: fmt.Sprintf("Unexpected status code: %d. Run with request.debug = 1 for more info.", responseData.StatusCode),
130+
}
131+
return nil, []error{err}
132+
}
133+
134+
var response openrtb2.BidResponse
135+
if err := jsonutil.Unmarshal(responseData.Body, &response); err != nil {
136+
return nil, []error{err}
137+
}
138+
139+
var bids []*adapters.TypedBid
140+
var errors []error
141+
for _, seatBid := range response.SeatBid {
142+
for i, bid := range seatBid.Bid {
143+
bidType, err := getMediaTypeForBid(bid)
144+
if err != nil {
145+
errors = append(errors, err)
146+
continue
147+
}
148+
bids = append(bids, &adapters.TypedBid{
149+
Bid: &seatBid.Bid[i],
150+
BidType: bidType,
151+
})
152+
}
153+
}
154+
155+
if len(bids) == 0 {
156+
return nil, nil
157+
}
158+
159+
bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(bids))
160+
161+
if response.Cur != "" {
162+
bidResponse.Currency = response.Cur
163+
}
164+
bidResponse.Bids = bids
165+
166+
return bidResponse, errors
167+
}
168+
169+
func getMediaTypeForBid(bid openrtb2.Bid) (openrtb_ext.BidType, error) {
170+
if bid.Ext != nil {
171+
var bidExt openrtb_ext.ExtBid
172+
err := jsonutil.Unmarshal(bid.Ext, &bidExt)
173+
if err == nil && bidExt.Prebid != nil {
174+
return openrtb_ext.ParseBidType(string(bidExt.Prebid.Type))
175+
}
176+
}
177+
178+
return "", &errortypes.BadServerResponse{
179+
Message: fmt.Sprintf("Failed to parse impression \"%s\" mediatype", bid.ImpID),
180+
}
181+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package alliance_gravity
2+
3+
import (
4+
"testing"
5+
6+
"github.com/prebid/prebid-server/v3/adapters/adapterstest"
7+
"github.com/prebid/prebid-server/v3/config"
8+
"github.com/prebid/prebid-server/v3/openrtb_ext"
9+
)
10+
11+
func TestJsonSamples(t *testing.T) {
12+
bidder, buildErr := Builder(openrtb_ext.BidderAllianceGravity, config.Adapter{
13+
Endpoint: "http://endpoint"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"})
14+
15+
if buildErr != nil {
16+
t.Fatalf("Builder returned unexpected error %v", buildErr)
17+
}
18+
19+
adapterstest.RunJSONBidderTest(t, "alliance_gravitytest", bidder)
20+
}
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
{
2+
"mockBidRequest": {
3+
"id": "test-request-id",
4+
"site": {
5+
"id": "site-id",
6+
"page": "criteo.com"
7+
},
8+
"device": {
9+
"os": "android",
10+
"ip": "1.2.3.4",
11+
"ua": "random user agent"
12+
},
13+
"imp": [
14+
{
15+
"id": "imp-id-123",
16+
"audio": {
17+
"mimes": ["audio/mp3"],
18+
"protocols": [2, 5],
19+
"minduration": 10,
20+
"maxduration": 30
21+
},
22+
"ext": {
23+
"bidder": {
24+
"srid": "12341234"
25+
}
26+
}
27+
}
28+
]
29+
},
30+
"httpCalls": [
31+
{
32+
"expectedRequest": {
33+
"uri": "http://endpoint",
34+
"headers": {
35+
"Accept": [
36+
"application/json"
37+
],
38+
"Content-Type": [
39+
"application/json;charset=utf-8"
40+
],
41+
"Referer": [
42+
"criteo.com"
43+
],
44+
"User-Agent": [
45+
"random user agent"
46+
],
47+
"X-Forwarded-For": [
48+
"1.2.3.4"
49+
]
50+
},
51+
"body": {
52+
"id": "test-request-id",
53+
"site": {
54+
"id": "site-id",
55+
"page": "criteo.com"
56+
},
57+
"device": {
58+
"os": "android",
59+
"ip": "1.2.3.4",
60+
"ua": "random user agent"
61+
},
62+
"imp": [
63+
{
64+
"id": "imp-id-123",
65+
"audio": {
66+
"mimes": ["audio/mp3"],
67+
"protocols": [2, 5],
68+
"minduration": 10,
69+
"maxduration": 30
70+
},
71+
"ext": {
72+
"bidder": {},
73+
"prebid": {
74+
"storedrequest": {
75+
"id": "12341234"
76+
}
77+
}
78+
}
79+
}
80+
]
81+
},
82+
"impIDs": ["imp-id-123"]
83+
},
84+
"mockResponse": {
85+
"status": 200,
86+
"body": {
87+
"cur": "EUR",
88+
"seatbid": [
89+
{
90+
"bid": [
91+
{
92+
"id": "test-slot-id",
93+
"impid": "imp-id-123",
94+
"price": 0.1,
95+
"crid": "creative-123",
96+
"adm": "some-test-ad-vast",
97+
"ext": {
98+
"prebid": {
99+
"type": "audio"
100+
}
101+
}
102+
}
103+
]
104+
}
105+
]
106+
}
107+
}
108+
}
109+
],
110+
"expectedBidResponses": [
111+
{
112+
"currency": "EUR",
113+
"bids": [
114+
{
115+
"bid": {
116+
"id": "test-slot-id",
117+
"impid": "imp-id-123",
118+
"price": 0.1,
119+
"crid": "creative-123",
120+
"adm": "some-test-ad-vast",
121+
"ext": {
122+
"prebid": {
123+
"type": "audio"
124+
}
125+
}
126+
},
127+
"type": "audio"
128+
}
129+
]
130+
}
131+
]
132+
}
133+

0 commit comments

Comments
 (0)