diff --git a/adapters/openx/openx.go b/adapters/openx/openx.go index 5ba3a2991cc..11b5268b9bf 100644 --- a/adapters/openx/openx.go +++ b/adapters/openx/openx.go @@ -34,15 +34,18 @@ type openxRespExt struct { func (a *OpenxAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { var errs []error - var bannerImps []openrtb2.Imp + var bannerAndNativeImps []openrtb2.Imp var videoImps []openrtb2.Imp for _, imp := range request.Imp { - // OpenX doesn't allow multi-type imp. Banner takes priority over video. + // OpenX doesn't allow multi-type imp. Banner takes priority over video and video takes priority over native + // Openx also wants to send banner and native imps in one request if imp.Banner != nil { - bannerImps = append(bannerImps, imp) + bannerAndNativeImps = append(bannerAndNativeImps, imp) } else if imp.Video != nil { videoImps = append(videoImps, imp) + } else if imp.Native != nil { + bannerAndNativeImps = append(bannerAndNativeImps, imp) } } @@ -50,7 +53,7 @@ func (a *OpenxAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapt // Make a copy as we don't want to change the original request reqCopy := *request - reqCopy.Imp = bannerImps + reqCopy.Imp = bannerAndNativeImps adapterReq, errors := a.makeRequest(&reqCopy) if adapterReq != nil { adapterRequests = append(adapterRequests, adapterReq) @@ -256,12 +259,17 @@ func getBidVideo(bid *openrtb2.Bid) *openrtb_ext.ExtBidPrebidVideo { // // OpenX doesn't support multi-type impressions. // If both banner and video exist, take banner as we do not want in-banner video. +// If both video and native exist and banner is nil, take video. +// If both banner and native exist, take banner. +// If all of the types (banner, video, native) exist, take banner. func getMediaTypeForImp(impId string, imps []openrtb2.Imp) openrtb_ext.BidType { mediaType := openrtb_ext.BidTypeBanner for _, imp := range imps { if imp.ID == impId { if imp.Banner == nil && imp.Video != nil { mediaType = openrtb_ext.BidTypeVideo + } else if imp.Banner == nil && imp.Native != nil { + mediaType = openrtb_ext.BidTypeNative } return mediaType } diff --git a/adapters/openx/openxtest/exemplary/simple-banner.json b/adapters/openx/openxtest/exemplary/simple-banner.json index 35b02878f38..aa9f9476dcf 100644 --- a/adapters/openx/openxtest/exemplary/simple-banner.json +++ b/adapters/openx/openxtest/exemplary/simple-banner.json @@ -50,7 +50,7 @@ "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", "impid": "test-imp-id", "price": 0.500000, - "adm": "some-test-ad", + "adm": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"required\": 1,\"title\": {\"text\": \"OpenX (Title)\"}}], \"link\": {\"url\": \"https://www.openx.com/\"}, \"eventtrackers\":[{\"event\":1,\"method\":1,\"url\":\"http://example.com/impression\"}]}", "crid": "crid_10", "h": 90, "w": 728 @@ -72,7 +72,7 @@ "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", "impid": "test-imp-id", "price": 0.5, - "adm": "some-test-ad", + "adm": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"required\": 1,\"title\": {\"text\": \"OpenX (Title)\"}}], \"link\": {\"url\": \"https://www.openx.com/\"}, \"eventtrackers\":[{\"event\":1,\"method\":1,\"url\":\"http://example.com/impression\"}]}", "crid": "crid_10", "w": 728, "h": 90 diff --git a/adapters/openx/openxtest/exemplary/simple-native.json b/adapters/openx/openxtest/exemplary/simple-native.json new file mode 100644 index 00000000000..e9975b0b182 --- /dev/null +++ b/adapters/openx/openxtest/exemplary/simple-native.json @@ -0,0 +1,87 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "native": { + "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "unit": "539439964", + "delDomain": "se-demo-d.openx.net" + } + } + } + ] + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://rtb.openx.net/prebid", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "native": { + "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}", + "ver": "1.2" + }, + "tagid": "539439964" + } + ], + "ext": { + "bc": "hb_pbs_1.0.0", + "delDomain": "se-demo-d.openx.net" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "seat": "openx", + "bid": [{ + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"required\": 1,\"title\": {\"text\": \"OpenX (Title)\"}}], \"link\": {\"url\": \"https://www.openx.com/\"}, \"eventtrackers\":[{\"event\":1,\"method\":1,\"url\":\"http://example.com/impression\"}]}", + "crid": "crid_10", + "w": 300, + "h": 200 + }] + } + ] + } + } + } + ], + + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"required\": 1,\"title\": {\"text\": \"OpenX (Title)\"}}], \"link\": {\"url\": \"https://www.openx.com/\"}, \"eventtrackers\":[{\"event\":1,\"method\":1,\"url\":\"http://example.com/impression\"}]}", + "crid": "crid_10", + "w": 300, + "h": 200 + }, + "type": "native" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/openx/openxtest/supplemental/multi-imp.json b/adapters/openx/openxtest/supplemental/multi-imp.json index d49660a1541..a8c9be59513 100644 --- a/adapters/openx/openxtest/supplemental/multi-imp.json +++ b/adapters/openx/openxtest/supplemental/multi-imp.json @@ -22,6 +22,19 @@ } } }, + { + "id": "native-imp-1", + "native": { + "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "unit": "666", + "delDomain": "se-demo-d.openx.net" + } + } + }, { "id": "banner-imp-2", "banner": {}, @@ -42,10 +55,42 @@ } } }, + { + "id": "banner-native-imp-1", + "banner": {}, + "native": { + "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "unit": "777", + "delDomain": "se-demo-d.openx.net" + } + } + }, + { + "id": "video-native-imp-1", + "video": {"mimes": ["video/mp4"]}, + "native": { + "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "unit": "888", + "delDomain": "se-demo-d.openx.net" + } + } + }, { "id": "multi-type-imp", "banner": {}, "video": {"mimes": ["video/mp4"]}, + "native": { + "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}", + "ver": "1.2" + }, "ext": { "bidder": { "unit": "555", @@ -68,15 +113,36 @@ "banner": {}, "tagid": "111" }, + { + "id": "native-imp-1", + "native": { + "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}", + "ver": "1.2" + }, + "tagid": "666" + }, { "id": "banner-imp-2", "banner": {}, "tagid": "222" }, + { + "id": "banner-native-imp-1", + "banner": {}, + "native": { + "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}", + "ver": "1.2" + }, + "tagid": "777" + }, { "id": "multi-type-imp", "banner": {}, "video": {"mimes": ["video/mp4"]}, + "native": { + "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}", + "ver": "1.2" + }, "tagid": "555" } ], @@ -85,7 +151,7 @@ "delDomain": "se-demo-d.openx.net" } }, - "impIDs":["banner-imp-1","banner-imp-2","multi-type-imp"] + "impIDs":["banner-imp-1","native-imp-1","banner-imp-2","banner-native-imp-1","multi-type-imp"] }, "mockResponse": { "status": 200, @@ -100,11 +166,21 @@ "impid": "banner-imp-1", "price": 0.1 }, + { + "id": "native-bid-1", + "impid": "native-imp-1", + "price": 0.1 + }, { "id": "banner-bid-2", "impid": "banner-imp-2", "price": 0.2 }, + { + "id": "banner-native-bid-1", + "impid": "banner-native-imp-1", + "price": 0 + }, { "id": "multi-type-bid", "impid": "multi-type-imp", @@ -162,7 +238,11 @@ "imp": [ { "id": "video-imp-2", - "video": {"mimes": ["video/mp4"]}, + "video": { + "mimes": [ + "video/mp4" + ] + }, "tagid": "444" } ], @@ -171,7 +251,9 @@ "delDomain": "se-demo-d.openx.net" } }, - "impIDs":["video-imp-2"] + "impIDs": [ + "video-imp-2" + ] }, "mockResponse": { "status": 200, @@ -191,6 +273,48 @@ ] } } + }, + { + "expectedRequest": { + "uri": "http://rtb.openx.net/prebid", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "video-native-imp-1", + "video": {"mimes": ["video/mp4"]}, + "native": { + "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":1200,\"hmin\":627}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1,2]}]}", + "ver": "1.2" + }, + "tagid": "888" + } + ], + "ext": { + "bc": "hb_pbs_1.0.0", + "delDomain": "se-demo-d.openx.net" + } + }, + "impIDs":["video-native-imp-1"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "openx", + "bid": [ + { + "id": "video-native-bid-1", + "impid": "video-native-imp-1", + "price": 0.0 + } + ] + } + ] + } + } } ], @@ -206,6 +330,14 @@ }, "type": "banner" }, + { + "bid": { + "id": "native-bid-1", + "impid": "native-imp-1", + "price": 0.1 + }, + "type": "native" + }, { "bid": { "id": "banner-bid-2", @@ -214,6 +346,14 @@ }, "type": "banner" }, + { + "bid": { + "id": "banner-native-bid-1", + "impid": "banner-native-imp-1", + "price": 0 + }, + "type": "banner" + }, { "bid": { "id": "multi-type-bid", @@ -249,6 +389,19 @@ "type": "video" } ] + }, + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "video-native-bid-1", + "impid": "video-native-imp-1", + "price": 0.0 + }, + "type": "video" + } + ] } ] } diff --git a/static/bidder-info/openx.yaml b/static/bidder-info/openx.yaml index d56ae466885..8678a654926 100644 --- a/static/bidder-info/openx.yaml +++ b/static/bidder-info/openx.yaml @@ -8,10 +8,12 @@ capabilities: mediaTypes: - banner - video + - native site: mediaTypes: - banner - video + - native modifyingVastXmlAllowed: true userSync: iframe: