Skip to content

Commit 15861e7

Browse files
madsenseopsshunj-nb
authored andcommitted
New Adapter: MadSense (prebid#4169)
1 parent efa94fb commit 15861e7

23 files changed

+2082
-0
lines changed

adapters/madsense/madsense.go

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package madsense
2+
3+
import (
4+
"net/http"
5+
"net/url"
6+
7+
"github.com/prebid/openrtb/v20/openrtb2"
8+
"github.com/prebid/prebid-server/v3/adapters"
9+
"github.com/prebid/prebid-server/v3/config"
10+
"github.com/prebid/prebid-server/v3/errortypes"
11+
"github.com/prebid/prebid-server/v3/openrtb_ext"
12+
"github.com/prebid/prebid-server/v3/util/jsonutil"
13+
)
14+
15+
type adapter struct {
16+
endpoint string
17+
}
18+
19+
// Builder builds a new instance of the MadSense adapter for the given bidder with the given config.
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 (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
28+
reqs := make([]*adapters.RequestData, 0, len(request.Imp))
29+
var errs []error
30+
31+
appendReq := func(imps []openrtb2.Imp) {
32+
req, err := a.makeRequest(request, imps)
33+
if err != nil {
34+
errs = append(errs, err)
35+
return
36+
}
37+
if req != nil {
38+
reqs = append(reqs, req)
39+
}
40+
}
41+
42+
var videoImps []openrtb2.Imp
43+
for i := range request.Imp {
44+
imp := &request.Imp[i]
45+
if imp.Banner != nil {
46+
appendReq(request.Imp[i : i+1])
47+
} else if imp.Video != nil {
48+
videoImps = append(videoImps, request.Imp[i])
49+
}
50+
}
51+
52+
// we support video podding, so we want to send all video impressions in a single request
53+
appendReq(videoImps)
54+
55+
return reqs, errs
56+
}
57+
58+
func (a *adapter) makeRequest(request *openrtb2.BidRequest, imps []openrtb2.Imp) (*adapters.RequestData, error) {
59+
if len(imps) == 0 {
60+
return nil, nil
61+
}
62+
ext, err := parseImpExt(&imps[0])
63+
if err != nil {
64+
return nil, err
65+
}
66+
67+
request.Imp = imps
68+
body, err := jsonutil.Marshal(request)
69+
if err != nil {
70+
return nil, err
71+
}
72+
73+
companyId := ext.CompanyId
74+
if request.Test == 1 {
75+
companyId = "test"
76+
}
77+
78+
return &adapters.RequestData{
79+
Method: http.MethodPost,
80+
Uri: a.getEndpointURL(companyId),
81+
Body: body,
82+
Headers: getHeaders(request),
83+
ImpIDs: openrtb_ext.GetImpIDs(request.Imp),
84+
}, nil
85+
}
86+
87+
func (a *adapter) getEndpointURL(companyId string) string {
88+
params := url.Values{}
89+
params.Add("company_id", companyId)
90+
return a.endpoint + "?" + params.Encode()
91+
}
92+
93+
func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) {
94+
if adapters.IsResponseStatusCodeNoContent(response) {
95+
return nil, nil
96+
}
97+
98+
if err := adapters.CheckResponseStatusCodeForErrors(response); err != nil {
99+
return nil, []error{err}
100+
}
101+
102+
var resp openrtb2.BidResponse
103+
if err := jsonutil.Unmarshal(response.Body, &resp); err != nil {
104+
return nil, []error{&errortypes.BadServerResponse{
105+
Message: "Bad Server Response",
106+
}}
107+
}
108+
109+
var bidErrors []error
110+
bidderResponse := adapters.NewBidderResponseWithBidsCapacity(1)
111+
for i := range resp.SeatBid {
112+
seatBid := &resp.SeatBid[i]
113+
for j := range seatBid.Bid {
114+
bid := &seatBid.Bid[j]
115+
typedBid, err := getTypedBidFromBid(bid)
116+
if err != nil {
117+
bidErrors = append(bidErrors, err)
118+
continue
119+
}
120+
bidderResponse.Bids = append(bidderResponse.Bids, typedBid)
121+
}
122+
}
123+
124+
return bidderResponse, bidErrors
125+
}

adapters/madsense/madsense_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package madsense
2+
3+
import (
4+
"github.com/prebid/prebid-server/v3/adapters/adapterstest"
5+
"github.com/prebid/prebid-server/v3/config"
6+
"github.com/prebid/prebid-server/v3/openrtb_ext"
7+
"github.com/stretchr/testify/require"
8+
"testing"
9+
)
10+
11+
func TestJsonSamples(t *testing.T) {
12+
bidder, buildErr := Builder(openrtb_ext.BidderMadSense, config.Adapter{
13+
Endpoint: "https://test.localhost.com"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"})
14+
15+
require.NoError(t, buildErr, "Builder returned unexpected error")
16+
adapterstest.RunJSONBidderTest(t, "madsensetest", bidder)
17+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
{
2+
"mockBidRequest": {
3+
"id": "test-request-id",
4+
"imp": [
5+
{
6+
"id": "test-imp-id",
7+
"banner": {
8+
"w": 300,
9+
"h": 250
10+
},
11+
"ext": {
12+
"bidder": {
13+
"company_id": "9876543"
14+
}
15+
}
16+
}
17+
],
18+
"device": {
19+
"ua": "user-agent",
20+
"ip": "1.2.3.4"
21+
},
22+
"app": {
23+
"bundle": "54321"
24+
}
25+
},
26+
"httpCalls": [
27+
{
28+
"expectedRequest": {
29+
"method": "POST",
30+
"headers": {
31+
"Accept": [
32+
"application/json"
33+
],
34+
"Content-Type": [
35+
"application/json;charset=utf-8"
36+
],
37+
"X-Openrtb-Version": [
38+
"2.6"
39+
],
40+
"User-Agent": [
41+
"user-agent"
42+
],
43+
"X-Forwarded-For": [
44+
"1.2.3.4"
45+
]
46+
},
47+
"uri": "https://test.localhost.com?company_id=9876543",
48+
"body": {
49+
"id": "test-request-id",
50+
"imp": [
51+
{
52+
"id": "test-imp-id",
53+
"banner": {
54+
"w": 300,
55+
"h": 250
56+
},
57+
"ext": {
58+
"bidder": {
59+
"company_id": "9876543"
60+
}
61+
}
62+
}
63+
],
64+
"device": {
65+
"ua": "user-agent",
66+
"ip": "1.2.3.4"
67+
},
68+
"app": {
69+
"bundle": "54321"
70+
}
71+
},
72+
"impIDs":["test-imp-id"]
73+
},
74+
"mockResponse": {
75+
"status": 200,
76+
"body": {
77+
"cur": "USD",
78+
"seatbid": [
79+
{
80+
"bid": [
81+
{
82+
"id": "884f46aa-25ab-488a-bd7e-90e3a31a03e0",
83+
"crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547",
84+
"price": 10,
85+
"impid": "test-imp-id",
86+
"adm": "<img src=\"demo ad\" width=\"300\" height=\"250\">",
87+
"mtype": 1
88+
}
89+
]
90+
}
91+
],
92+
"seat": "madsense"
93+
}
94+
}
95+
}
96+
],
97+
"expectedBidResponses": [
98+
{
99+
"currency": "USD",
100+
"bids": [
101+
{
102+
"bid": {
103+
"id": "884f46aa-25ab-488a-bd7e-90e3a31a03e0",
104+
"crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547",
105+
"price": 10,
106+
"impid": "test-imp-id",
107+
"adm": "<img src=\"demo ad\" width=\"300\" height=\"250\">",
108+
"mtype": 1
109+
},
110+
"type": "banner"
111+
}
112+
],
113+
"seat": "madsense"
114+
}
115+
]
116+
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
{
2+
"mockBidRequest": {
3+
"id": "test-request-id",
4+
"imp": [
5+
{
6+
"id": "test-imp-id",
7+
"banner": {
8+
"w": 300,
9+
"h": 250
10+
},
11+
"ext": {
12+
"bidder": {
13+
"company_id": "9876543"
14+
}
15+
}
16+
}
17+
],
18+
"device": {
19+
"ua": "user-agent",
20+
"ipv6": "2001:db8:3333:4444:5555:6666:7777:8888"
21+
},
22+
"site": {
23+
"domain": "domain.com",
24+
"page": "http://domain.com/page",
25+
"ref": "https://example.com/page"
26+
}
27+
},
28+
"httpCalls": [
29+
{
30+
"expectedRequest": {
31+
"method": "POST",
32+
"headers": {
33+
"Accept": [
34+
"application/json"
35+
],
36+
"Content-Type": [
37+
"application/json;charset=utf-8"
38+
],
39+
"Origin": [
40+
"domain.com"
41+
],
42+
"X-Openrtb-Version": [
43+
"2.6"
44+
],
45+
"User-Agent": [
46+
"user-agent"
47+
],
48+
"X-Forwarded-For": [
49+
"2001:db8:3333:4444:5555:6666:7777:8888"
50+
],
51+
"Referer": [
52+
"https://example.com/page"
53+
]
54+
},
55+
"uri": "https://test.localhost.com?company_id=9876543",
56+
"body": {
57+
"id": "test-request-id",
58+
"imp": [
59+
{
60+
"id": "test-imp-id",
61+
"banner": {
62+
"w": 300,
63+
"h": 250
64+
},
65+
"ext": {
66+
"bidder": {
67+
"company_id": "9876543"
68+
}
69+
}
70+
}
71+
],
72+
"device": {
73+
"ua": "user-agent",
74+
"ipv6": "2001:db8:3333:4444:5555:6666:7777:8888"
75+
},
76+
"site": {
77+
"domain": "domain.com",
78+
"page": "http://domain.com/page",
79+
"ref": "https://example.com/page"
80+
}
81+
},
82+
"impIDs":["test-imp-id"]
83+
},
84+
"mockResponse": {
85+
"status": 200,
86+
"body": {
87+
"cur": "USD",
88+
"seatbid": [
89+
{
90+
"bid": [
91+
{
92+
"id": "884f46aa-25ab-488a-bd7e-90e3a31a03e0",
93+
"crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547",
94+
"price": 10,
95+
"impid": "test-imp-id",
96+
"adm": "<iframe width=\"300\" height=\"250\"></iframe>",
97+
"mtype": 1
98+
}
99+
]
100+
}
101+
],
102+
"seat": "madsense"
103+
}
104+
}
105+
}
106+
],
107+
"expectedBidResponses": [
108+
{
109+
"currency": "USD",
110+
"bids": [
111+
{
112+
"bid": {
113+
"id": "884f46aa-25ab-488a-bd7e-90e3a31a03e0",
114+
"crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547",
115+
"price": 10,
116+
"impid": "test-imp-id",
117+
"adm": "<iframe width=\"300\" height=\"250\"></iframe>",
118+
"mtype": 1
119+
},
120+
"type": "banner"
121+
}
122+
],
123+
"seat": "madsense"
124+
}
125+
]
126+
}

0 commit comments

Comments
 (0)