-
Notifications
You must be signed in to change notification settings - Fork 769
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: MadSense #4169
base: master
Are you sure you want to change the base?
New Adapter: MadSense #4169
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
package madsense | ||
|
||
import ( | ||
"encoding/json" | ||
"net/http" | ||
"net/url" | ||
|
||
"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 | ||
} | ||
|
||
// Builder builds a new instance of the MadSense 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, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { | ||
reqs := make([]*adapters.RequestData, 0, len(request.Imp)) | ||
var errs []error | ||
|
||
appendReq := func(imps []openrtb2.Imp) { | ||
req, err := a.makeRequest(request, imps) | ||
if err != nil { | ||
errs = append(errs, err) | ||
return | ||
} | ||
if req != nil { | ||
reqs = append(reqs, req) | ||
} | ||
} | ||
|
||
var videoImps, bannerImps []openrtb2.Imp | ||
for _, imp := range request.Imp { | ||
if imp.Banner != nil { | ||
bannerImps = append(bannerImps, imp) | ||
} else if imp.Video != nil { | ||
videoImps = append(videoImps, imp) | ||
} | ||
} | ||
|
||
// we support video podding, so we want to send all video impressions in a single request | ||
appendReq(videoImps) | ||
for _, bannerImp := range bannerImps { | ||
appendReq([]openrtb2.Imp{bannerImp}) | ||
} | ||
|
||
return reqs, errs | ||
} | ||
|
||
func (a *adapter) makeRequest(request *openrtb2.BidRequest, imps []openrtb2.Imp) (*adapters.RequestData, error) { | ||
if len(imps) == 0 { | ||
return nil, nil | ||
} | ||
ext, err := parseImpExt(&imps[0]) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
request.Imp = imps | ||
body, err := json.Marshal(request) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please use jsonutil for marshaling |
||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
if request.Test == 1 { | ||
ext.CompanyId = "test" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add test coverage for this line. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. tested in new supplemental test |
||
} | ||
Comment on lines
+76
to
+78
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When |
||
|
||
return &adapters.RequestData{ | ||
Method: http.MethodPost, | ||
Uri: a.getEndpointURL(ext), | ||
Body: body, | ||
Headers: getHeaders(request), | ||
ImpIDs: openrtb_ext.GetImpIDs(request.Imp), | ||
}, nil | ||
} | ||
|
||
func (a *adapter) getEndpointURL(ext *openrtb_ext.ExtImpMadSense) string { | ||
params := url.Values{} | ||
params.Add("company_id", ext.CompanyId) | ||
return a.endpoint + "?" + params.Encode() | ||
} | ||
|
||
func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) { | ||
if adapters.IsResponseStatusCodeNoContent(response) { | ||
return nil, nil | ||
} | ||
|
||
if err := adapters.CheckResponseStatusCodeForErrors(response); err != nil { | ||
return nil, []error{err} | ||
} | ||
|
||
var resp openrtb2.BidResponse | ||
if err := jsonutil.Unmarshal(response.Body, &resp); err != nil { | ||
return nil, []error{&errortypes.BadServerResponse{ | ||
Message: "Bad Server Response", | ||
}} | ||
Comment on lines
+106
to
+108
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add a supplemental test case where the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. tested in new supplemental test |
||
} | ||
|
||
var bidErrors []error | ||
bidderResponse := adapters.NewBidderResponseWithBidsCapacity(1) | ||
for _, seatBid := range resp.SeatBid { | ||
for i := range seatBid.Bid { | ||
bid := &seatBid.Bid[i] | ||
typedBid, err := getTypedBidFromBid(bid) | ||
if err != nil { | ||
bidErrors = append(bidErrors, err) | ||
continue | ||
} | ||
bidderResponse.Bids = append(bidderResponse.Bids, typedBid) | ||
} | ||
} | ||
|
||
return bidderResponse, bidErrors | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package madsense | ||
|
||
import ( | ||
"github.com/prebid/prebid-server/v3/adapters/adapterstest" | ||
"github.com/prebid/prebid-server/v3/config" | ||
"github.com/prebid/prebid-server/v3/openrtb_ext" | ||
"testing" | ||
) | ||
|
||
func TestJsonSamples(t *testing.T) { | ||
bidder, buildErr := Builder(openrtb_ext.BidderMadSense, config.Adapter{ | ||
Endpoint: "https://test.localhost.com"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) | ||
|
||
if buildErr != nil { | ||
t.Fatalf("Builder returned unexpected error %v", buildErr) | ||
} | ||
adapterstest.RunJSONBidderTest(t, "madsensetest", bidder) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
{ | ||
"mockBidRequest": { | ||
"id": "test-request-id", | ||
"imp": [ | ||
{ | ||
"id": "test-imp-id", | ||
"banner": { | ||
"w": 300, | ||
"h": 250 | ||
}, | ||
"ext": { | ||
"bidder": { | ||
"company_id": "9876543" | ||
} | ||
} | ||
} | ||
], | ||
"device": { | ||
"ua": "user-agent", | ||
"ip": "1.2.3.4" | ||
}, | ||
"app": { | ||
"bundle": "54321" | ||
} | ||
}, | ||
"httpCalls": [ | ||
{ | ||
"expectedRequest": { | ||
"method": "POST", | ||
"headers": { | ||
"Accept": [ | ||
"application/json" | ||
], | ||
"Content-Type": [ | ||
"application/json;charset=utf-8" | ||
], | ||
"X-Openrtb-Version": [ | ||
"2.6" | ||
], | ||
"User-Agent": [ | ||
"user-agent" | ||
], | ||
"X-Forwarded-For": [ | ||
"1.2.3.4" | ||
] | ||
}, | ||
"uri": "https://test.localhost.com?company_id=9876543", | ||
"body": { | ||
"id": "test-request-id", | ||
"imp": [ | ||
{ | ||
"id": "test-imp-id", | ||
"banner": { | ||
"w": 300, | ||
"h": 250 | ||
}, | ||
"ext": { | ||
"bidder": { | ||
"company_id": "9876543" | ||
} | ||
} | ||
} | ||
], | ||
"device": { | ||
"ua": "user-agent", | ||
"ip": "1.2.3.4" | ||
}, | ||
"app": { | ||
"bundle": "54321" | ||
} | ||
}, | ||
"impIDs":["test-imp-id"] | ||
}, | ||
"mockResponse": { | ||
"status": 200, | ||
"body": { | ||
"cur": "USD", | ||
"seatbid": [ | ||
{ | ||
"bid": [ | ||
{ | ||
"id": "884f46aa-25ab-488a-bd7e-90e3a31a03e0", | ||
"crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547", | ||
"price": 10, | ||
"impid": "test-imp-id", | ||
"adm": "<img src=\"demo ad\" width=\"300\" height=\"250\">", | ||
"mtype": 1 | ||
} | ||
] | ||
} | ||
], | ||
"seat": "madsense" | ||
} | ||
} | ||
} | ||
], | ||
"expectedBidResponses": [ | ||
{ | ||
"currency": "USD", | ||
"bids": [ | ||
{ | ||
"bid": { | ||
"id": "884f46aa-25ab-488a-bd7e-90e3a31a03e0", | ||
"crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547", | ||
"price": 10, | ||
"impid": "test-imp-id", | ||
"adm": "<img src=\"demo ad\" width=\"300\" height=\"250\">", | ||
"mtype": 1 | ||
}, | ||
"type": "banner" | ||
} | ||
], | ||
"seat": "madsense" | ||
} | ||
] | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
{ | ||
"mockBidRequest": { | ||
"id": "test-request-id", | ||
"imp": [ | ||
{ | ||
"id": "test-imp-id", | ||
"banner": { | ||
"w": 300, | ||
"h": 250 | ||
}, | ||
"ext": { | ||
"bidder": { | ||
"company_id": "9876543" | ||
} | ||
} | ||
} | ||
], | ||
"device": { | ||
"ua": "user-agent", | ||
"ipv6": "2001:db8:3333:4444:5555:6666:7777:8888" | ||
}, | ||
"site": { | ||
"domain": "domain.com", | ||
"page": "http://domain.com/page", | ||
"ref": "https://example.com/page" | ||
} | ||
}, | ||
"httpCalls": [ | ||
{ | ||
"expectedRequest": { | ||
"method": "POST", | ||
"headers": { | ||
"Accept": [ | ||
"application/json" | ||
], | ||
"Content-Type": [ | ||
"application/json;charset=utf-8" | ||
], | ||
"Origin": [ | ||
"domain.com" | ||
], | ||
"X-Openrtb-Version": [ | ||
"2.6" | ||
], | ||
"User-Agent": [ | ||
"user-agent" | ||
], | ||
"X-Forwarded-For": [ | ||
"2001:db8:3333:4444:5555:6666:7777:8888" | ||
], | ||
"Referer": [ | ||
"https://example.com/page" | ||
] | ||
}, | ||
"uri": "https://test.localhost.com?company_id=9876543", | ||
"body": { | ||
"id": "test-request-id", | ||
"imp": [ | ||
{ | ||
"id": "test-imp-id", | ||
"banner": { | ||
"w": 300, | ||
"h": 250 | ||
}, | ||
"ext": { | ||
"bidder": { | ||
"company_id": "9876543" | ||
} | ||
} | ||
} | ||
], | ||
"device": { | ||
"ua": "user-agent", | ||
"ipv6": "2001:db8:3333:4444:5555:6666:7777:8888" | ||
}, | ||
"site": { | ||
"domain": "domain.com", | ||
"page": "http://domain.com/page", | ||
"ref": "https://example.com/page" | ||
} | ||
}, | ||
"impIDs":["test-imp-id"] | ||
}, | ||
"mockResponse": { | ||
"status": 200, | ||
"body": { | ||
"cur": "USD", | ||
"seatbid": [ | ||
{ | ||
"bid": [ | ||
{ | ||
"id": "884f46aa-25ab-488a-bd7e-90e3a31a03e0", | ||
"crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547", | ||
"price": 10, | ||
"impid": "test-imp-id", | ||
"adm": "<iframe width=\"300\" height=\"250\"></iframe>", | ||
"mtype": 1 | ||
} | ||
] | ||
} | ||
], | ||
"seat": "madsense" | ||
} | ||
} | ||
} | ||
], | ||
"expectedBidResponses": [ | ||
{ | ||
"currency": "USD", | ||
"bids": [ | ||
{ | ||
"bid": { | ||
"id": "884f46aa-25ab-488a-bd7e-90e3a31a03e0", | ||
"crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547", | ||
"price": 10, | ||
"impid": "test-imp-id", | ||
"adm": "<iframe width=\"300\" height=\"250\"></iframe>", | ||
"mtype": 1 | ||
}, | ||
"type": "banner" | ||
} | ||
], | ||
"seat": "madsense" | ||
} | ||
] | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's an issue here because you're mixing named returns with local variable declarations. I suggest deleting the named returns
requests
anderrors
and always using the local variablesreqs
anderrs
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
agreed, I switched to only using local variables