diff --git a/adapters/ownadx/ownadx.go b/adapters/ownadx/ownadx.go index 136cdd07e7a..396fc7a8510 100644 --- a/adapters/ownadx/ownadx.go +++ b/adapters/ownadx/ownadx.go @@ -20,20 +20,47 @@ type bidExt struct { MediaType string `json:"mediaType"` } -func getRequestData(reqJSON []byte, url string) []*adapters.RequestData { +func (adapter *adapter) getRequestData(bidRequest *openrtb2.BidRequest, impExt *openrtb_ext.ExtImpOwnAdx, imps []openrtb2.Imp) (*adapters.RequestData, error) { + pbidRequest := createBidRequest(bidRequest, imps) + reqJSON, err := json.Marshal(pbidRequest) + if err != nil { + return nil, err + } + adapter.buildEndpointURL(impExt) + url, err := adapter.buildEndpointURL(impExt) + if err != nil { + return nil, err + } + headers := http.Header{} headers.Add("Content-Type", "application/json;charset=utf-8") headers.Add("Accept", "application/json") headers.Add("x-openrtb-version", "2.5") - return []*adapters.RequestData{{ - Method: http.MethodPost, - Body: reqJSON, + return &adapters.RequestData{ + Method: "POST", Uri: url, - Headers: headers, - }} -} + Body: reqJSON, + Headers: headers}, nil +} +func createBidRequest(rtbBidRequest *openrtb2.BidRequest, imps []openrtb2.Imp) *openrtb2.BidRequest { + bidRequest := *rtbBidRequest + bidRequest.Imp = imps + return &bidRequest +} +func getExtImps(imps []openrtb2.Imp, impsExt []openrtb_ext.ExtImpOwnAdx) map[openrtb_ext.ExtImpOwnAdx][]openrtb2.Imp { + respExt := make(map[openrtb_ext.ExtImpOwnAdx][]openrtb2.Imp) + for idx := range imps { + imp := imps[idx] + impExt := impsExt[idx] + if respExt[impExt] == nil { + respExt[impExt] = make([]openrtb2.Imp, 0) + } + respExt[impExt] = append(respExt[impExt], imp) + } + return respExt +} func (adapter *adapter) buildEndpointURL(params *openrtb_ext.ExtImpOwnAdx) (string, error) { endpointParams := macros.EndpointTemplateParams{ ZoneID: params.SspId, @@ -62,30 +89,55 @@ func getImpressionExt(imp *openrtb2.Imp) (*openrtb_ext.ExtImpOwnAdx, error) { } func (adapter *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { - var ownAdxExt *openrtb_ext.ExtImpOwnAdx - ownAdxExt, err := getImpressionExt(&(request.Imp[0])) - if err != nil { - return nil, []error{ - httpBadResponseError(fmt.Sprintf("Bidder extension not valid or can't be unmarshalled")), - } - } - endPoint, err := adapter.buildEndpointURL(ownAdxExt) - if err != nil { - return nil, []error{err} + errs := make([]error, 0, len(request.Imp)) + if len(request.Imp) == 0 { + errs = append(errs, &errortypes.BadInput{ + Message: "No impression in the bid request"}, + ) + return nil, errs } - reqJSON, err := json.Marshal(request) - if err != nil { - return nil, []error{err} + imps, impExts, err := getImpressionsAndImpExt(request.Imp) + if len(imps) == 0 { + return nil, err + } + errs = append(errs, err...) + if len(imps) == 0 { + return nil, err } - return getRequestData(reqJSON, endPoint), nil + extImps := getExtImps(imps, impExts) + + reqDetail := make([]*adapters.RequestData, 0, len(extImps)) + for k, imps := range extImps { + bidRequest, err := adapter.getRequestData(request, &k, imps) + if err != nil { + errs = append(errs, err) + } else { + reqDetail = append(reqDetail, bidRequest) + } + } + return reqDetail, errs } -func httpBadResponseError(message string) error { - return &errortypes.BadServerResponse{ - Message: message, + +func getImpressionsAndImpExt(imps []openrtb2.Imp) ([]openrtb2.Imp, []openrtb_ext.ExtImpOwnAdx, []error) { + impLen := len(imps) + errors := make([]error, 0, impLen) + rsImpExts := make([]openrtb_ext.ExtImpOwnAdx, 0, impLen) + rsImps := make([]openrtb2.Imp, 0, impLen) + + for _, imp := range imps { + ownAdxExt, err := getImpressionExt(&(imp)) + if err != nil { + errors = append(errors, err) + continue + } + + rsImps = append(rsImps, imp) + rsImpExts = append(rsImpExts, *ownAdxExt) } + return rsImps, rsImpExts, errors } func getBidType(ext bidExt) (openrtb_ext.BidType, error) { @@ -98,55 +150,66 @@ func (adapter *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalR } if response.StatusCode == http.StatusBadRequest { return nil, []error{ - httpBadResponseError(fmt.Sprintf("Bad request: %d", response.StatusCode)), + &errortypes.BadServerResponse{ + Message: fmt.Sprintf("Bad request: %d", response.StatusCode), + }, } } if response.StatusCode != http.StatusOK { return nil, []error{ - httpBadResponseError(fmt.Sprintf("Unexpected http status code: %d", response.StatusCode)), + &errortypes.BadServerResponse{ + Message: fmt.Sprintf("Unexpected status code: %d. Run with request.test = 1 for more info.", response.StatusCode), + }, } } var bidResp openrtb2.BidResponse if err := json.Unmarshal(response.Body, &bidResp); err != nil { return nil, []error{ - httpBadResponseError(fmt.Sprintf("Bad server response ")), + &errortypes.BadServerResponse{ + Message: fmt.Sprintf("Bad server response "), + }, } } if len(bidResp.SeatBid) == 0 { return nil, []error{ - httpBadResponseError(fmt.Sprintf("Array SeatBid cannot be empty ")), + &errortypes.BadServerResponse{ + Message: fmt.Sprintf("Array SeatBid cannot be empty "), + }, } } - bidResponse := adapters.NewBidderResponseWithBidsCapacity(1) - - if len(bidResp.SeatBid[0].Bid) == 0 { + seatBid := bidResp.SeatBid[0] + bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(bidResp.SeatBid[0].Bid)) + if len(seatBid.Bid) == 0 { return nil, []error{ - httpBadResponseError(fmt.Sprintf("Bid cannot be empty ")), + &errortypes.BadServerResponse{ + Message: fmt.Sprintf("Bid cannot be empty "), + }, } } + for i := 0; i < len(seatBid.Bid); i++ { + var bidExt bidExt + var bidType openrtb_ext.BidType + bid := seatBid.Bid[i] + if err := json.Unmarshal(bid.Ext, &bidExt); err != nil { + return nil, []error{&errortypes.BadServerResponse{ + Message: "BidExt is required", + }} + } - bid := bidResp.SeatBid[0].Bid[0] - var bidExt bidExt - var bidType openrtb_ext.BidType + bidType, err := getBidType(bidExt) - if err := json.Unmarshal(bid.Ext, &bidExt); err != nil { - return nil, []error{&errortypes.BadServerResponse{ - Message: "BidExt is required", - }} + if err != nil { + return nil, []error{&errortypes.BadServerResponse{ + Message: "Bid type is invalid", + }} + } + bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ + Bid: &bid, + BidType: bidType, + }) } - bidType, err := getBidType(bidExt) - - if err != nil { - return nil, []error{&errortypes.BadServerResponse{ - Message: "Bid type is invalid", - }} - } - bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ - Bid: &bid, - BidType: bidType, - }) return bidResponse, nil } diff --git a/adapters/ownadx/ownadx_test.go b/adapters/ownadx/ownadx_test.go index ca3d8e02489..9bd7ba70353 100644 --- a/adapters/ownadx/ownadx_test.go +++ b/adapters/ownadx/ownadx_test.go @@ -10,7 +10,7 @@ import ( func TestJsonSamples(t *testing.T) { bidder, buildErr := Builder(openrtb_ext.BidderOwnAdx, config.Adapter{ - Endpoint: "http://{{.Host}}/bidder/bid/{{.AccountID}}/000?token={{.SourceId}}"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) + Endpoint: "https://pbs.prebid-ownadx.com/bidder/bid/{{.AccountID}}/{{.ZoneID}}?token={{.SourceId}}"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) assert.NoError(t, buildErr) adapterstest.RunJSONBidderTest(t, "ownadxtest", bidder) diff --git a/adapters/ownadx/ownadxtest/exemplary/banner.json b/adapters/ownadx/ownadxtest/exemplary/banner.json index 7bd958b3d79..2aeca804f4e 100644 --- a/adapters/ownadx/ownadxtest/exemplary/banner.json +++ b/adapters/ownadx/ownadxtest/exemplary/banner.json @@ -14,7 +14,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } @@ -46,7 +46,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "http://abc.com/bidder/bid/2/000?token=126151698247", + "uri": "https://pbs.prebid-ownadx.com/bidder/bid/2/11?token=126151698247", "body": { "id": "id", "imp": [ @@ -62,7 +62,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } diff --git a/adapters/ownadx/ownadxtest/exemplary/video.json b/adapters/ownadx/ownadxtest/exemplary/video.json index 9a4740d9094..657e1c0a210 100644 --- a/adapters/ownadx/ownadxtest/exemplary/video.json +++ b/adapters/ownadx/ownadxtest/exemplary/video.json @@ -34,7 +34,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } @@ -66,7 +66,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "http://abc.com/bidder/bid/2/000?token=126151698247", + "uri": "https://pbs.prebid-ownadx.com/bidder/bid/2/11?token=126151698247", "body": { "id": "id", "imp": [ @@ -102,7 +102,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } diff --git a/adapters/ownadx/ownadxtest/supplemental/bad-server-response.json b/adapters/ownadx/ownadxtest/supplemental/bad-server-response.json index e74763a4741..61b6da04fa8 100644 --- a/adapters/ownadx/ownadxtest/supplemental/bad-server-response.json +++ b/adapters/ownadx/ownadxtest/supplemental/bad-server-response.json @@ -14,7 +14,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } @@ -46,7 +46,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "http://abc.com/bidder/bid/2/000?token=126151698247", + "uri": "https://pbs.prebid-ownadx.com/bidder/bid/2/11?token=126151698247", "body": { "id": "id", "imp": [ @@ -62,7 +62,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } diff --git a/adapters/ownadx/ownadxtest/supplemental/bid-empty-.json b/adapters/ownadx/ownadxtest/supplemental/bid-empty-.json index 36e5140f4c6..8d40e878925 100644 --- a/adapters/ownadx/ownadxtest/supplemental/bid-empty-.json +++ b/adapters/ownadx/ownadxtest/supplemental/bid-empty-.json @@ -14,7 +14,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } @@ -46,7 +46,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "http://abc.com/bidder/bid/2/000?token=126151698247", + "uri": "https://pbs.prebid-ownadx.com/bidder/bid/2/11?token=126151698247", "body": { "id": "id", "imp": [ @@ -62,7 +62,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } diff --git a/adapters/ownadx/ownadxtest/supplemental/bidext-empty-.json b/adapters/ownadx/ownadxtest/supplemental/bidext-empty-.json index 4b2eb6f4f0d..2ca3b639389 100644 --- a/adapters/ownadx/ownadxtest/supplemental/bidext-empty-.json +++ b/adapters/ownadx/ownadxtest/supplemental/bidext-empty-.json @@ -14,7 +14,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } @@ -46,7 +46,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "http://abc.com/bidder/bid/2/000?token=126151698247", + "uri": "https://pbs.prebid-ownadx.com/bidder/bid/2/11?token=126151698247", "body": { "id": "id", "imp": [ @@ -62,7 +62,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } diff --git a/adapters/ownadx/ownadxtest/supplemental/bidext-type.json b/adapters/ownadx/ownadxtest/supplemental/bidext-type.json index fc6fdce6351..b1d634287d7 100644 --- a/adapters/ownadx/ownadxtest/supplemental/bidext-type.json +++ b/adapters/ownadx/ownadxtest/supplemental/bidext-type.json @@ -14,7 +14,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } @@ -46,7 +46,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "http://abc.com/bidder/bid/2/000?token=126151698247", + "uri": "https://pbs.prebid-ownadx.com/bidder/bid/2/11?token=126151698247", "body": { "id": "id", "imp": [ @@ -62,7 +62,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } diff --git a/adapters/ownadx/ownadxtest/supplemental/http-status-204.json b/adapters/ownadx/ownadxtest/supplemental/http-status-204.json index 2928d8953b7..4b7f8663f02 100644 --- a/adapters/ownadx/ownadxtest/supplemental/http-status-204.json +++ b/adapters/ownadx/ownadxtest/supplemental/http-status-204.json @@ -11,7 +11,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } @@ -21,7 +21,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "http://abc.com/bidder/bid/2/000?token=126151698247", + "uri": "https://pbs.prebid-ownadx.com/bidder/bid/2/11?token=126151698247", "body": { "id": "test-request-id", "imp": [ @@ -34,7 +34,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } diff --git a/adapters/ownadx/ownadxtest/supplemental/http-status-400.json b/adapters/ownadx/ownadxtest/supplemental/http-status-400.json index 92e480105fc..035bc323e38 100644 --- a/adapters/ownadx/ownadxtest/supplemental/http-status-400.json +++ b/adapters/ownadx/ownadxtest/supplemental/http-status-400.json @@ -11,7 +11,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } @@ -21,7 +21,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "http://abc.com/bidder/bid/2/000?token=126151698247", + "uri": "https://pbs.prebid-ownadx.com/bidder/bid/2/11?token=126151698247", "body": { "id": "test-request-id", "imp": [ @@ -34,7 +34,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } diff --git a/adapters/ownadx/ownadxtest/supplemental/invalid-req-extimp.json b/adapters/ownadx/ownadxtest/supplemental/invalid-req-extimp.json index 40ec90c7e77..b04e037d0a2 100644 --- a/adapters/ownadx/ownadxtest/supplemental/invalid-req-extimp.json +++ b/adapters/ownadx/ownadxtest/supplemental/invalid-req-extimp.json @@ -1,7 +1,7 @@ { "expectedMakeRequestsErrors": [ { - "value": "Bidder extension not valid or can't be unmarshalled", + "value": "Error while unmarshaling bidder extension", "comparison": "literal" } ], diff --git a/adapters/ownadx/ownadxtest/supplemental/seatbid-empty-.json b/adapters/ownadx/ownadxtest/supplemental/seatbid-empty-.json index fd4f3a8f2d8..f49ece3ea2f 100644 --- a/adapters/ownadx/ownadxtest/supplemental/seatbid-empty-.json +++ b/adapters/ownadx/ownadxtest/supplemental/seatbid-empty-.json @@ -14,7 +14,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } @@ -46,7 +46,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "http://abc.com/bidder/bid/2/000?token=126151698247", + "uri": "https://pbs.prebid-ownadx.com/bidder/bid/2/11?token=126151698247", "body": { "id": "id", "imp": [ @@ -62,7 +62,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } diff --git a/adapters/ownadx/ownadxtest/supplemental/unexpected-status.json b/adapters/ownadx/ownadxtest/supplemental/unexpected-status.json index 297b397c9a6..f501a11064e 100644 --- a/adapters/ownadx/ownadxtest/supplemental/unexpected-status.json +++ b/adapters/ownadx/ownadxtest/supplemental/unexpected-status.json @@ -14,7 +14,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } @@ -46,7 +46,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "http://abc.com/bidder/bid/2/000?token=126151698247", + "uri": "https://pbs.prebid-ownadx.com/bidder/bid/2/11?token=126151698247", "body": { "id": "id", "imp": [ @@ -62,7 +62,7 @@ "ext": { "bidder": { "tokenId": "126151698247", - "host": "abc.com", + "sspId": "11", "seatId": "2" } } @@ -99,7 +99,7 @@ ], "expectedMakeBidsErrors": [ { - "value": "Unexpected http status code: 403", + "value": "Unexpected status code: 403. Run with request.test = 1 for more info.", "comparison": "literal" } ],