github.com/prebid/prebid-server@v0.275.0/adapters/videoheroes/videoheroes.go (about) 1 package videoheroes 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "text/template" 8 9 "github.com/prebid/openrtb/v19/openrtb2" 10 "github.com/prebid/prebid-server/adapters" 11 "github.com/prebid/prebid-server/config" 12 "github.com/prebid/prebid-server/errortypes" 13 "github.com/prebid/prebid-server/macros" 14 "github.com/prebid/prebid-server/openrtb_ext" 15 ) 16 17 type adapter struct { 18 endpoint *template.Template 19 } 20 21 // Builder builds a new instance of the VideoHeroes adapter for the given bidder with the given config. 22 func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 23 uri, err := template.New("endpointTemplate").Parse(config.Endpoint) 24 if err != nil { 25 return nil, fmt.Errorf("unable to parse endpoint url template: %v", err) 26 } 27 28 bidder := &adapter{ 29 endpoint: uri, 30 } 31 return bidder, nil 32 } 33 34 func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { 35 var videoHeroesExt *openrtb_ext.ExtImpVideoHeroes 36 var err error 37 38 videoHeroesExt, err = a.getImpressionExt(&request.Imp[0]) 39 if err != nil { 40 return nil, []error{err} 41 } 42 43 request.Imp[0].Ext = nil 44 45 reqJSON, err := json.Marshal(request) 46 if err != nil { 47 return nil, []error{err} 48 } 49 50 headers := http.Header{} 51 headers.Add("Content-Type", "application/json;charset=utf-8") 52 headers.Add("Accept", "application/json") 53 54 url, err := a.buildEndpointURL(videoHeroesExt) 55 if err != nil { 56 return nil, []error{err} 57 } 58 59 return []*adapters.RequestData{{ 60 Method: http.MethodPost, 61 Body: reqJSON, 62 Uri: url, 63 Headers: headers, 64 }}, nil 65 } 66 67 func (a *adapter) getImpressionExt(imp *openrtb2.Imp) (*openrtb_ext.ExtImpVideoHeroes, error) { 68 var bidderExt adapters.ExtImpBidder 69 if err := json.Unmarshal(imp.Ext, &bidderExt); err != nil { 70 return nil, &errortypes.BadInput{ 71 Message: "ext.bidder not provided", 72 } 73 } 74 var videoHeroesExt openrtb_ext.ExtImpVideoHeroes 75 if err := json.Unmarshal(bidderExt.Bidder, &videoHeroesExt); err != nil { 76 return nil, &errortypes.BadInput{ 77 Message: "ext.bidder not provided", 78 } 79 } 80 return &videoHeroesExt, nil 81 } 82 83 func (a *adapter) buildEndpointURL(params *openrtb_ext.ExtImpVideoHeroes) (string, error) { 84 endpointParams := macros.EndpointTemplateParams{PublisherID: params.PlacementID} 85 return macros.ResolveMacros(a.endpoint, endpointParams) 86 } 87 88 func (a *adapter) MakeBids( 89 receivedRequest *openrtb2.BidRequest, 90 bidderRequest *adapters.RequestData, 91 bidderResponse *adapters.ResponseData, 92 ) ( 93 *adapters.BidderResponse, 94 []error, 95 ) { 96 97 if bidderResponse.StatusCode == http.StatusNoContent { 98 return nil, []error{&errortypes.BadInput{Message: "No bid"}} 99 } 100 101 if bidderResponse.StatusCode == http.StatusBadRequest { 102 return nil, []error{&errortypes.BadInput{ 103 Message: fmt.Sprintf("Unexpected status code: %d. Run with request.debug = 1 for more info", bidderResponse.StatusCode), 104 }} 105 } 106 107 if bidderResponse.StatusCode == http.StatusServiceUnavailable { 108 return nil, []error{&errortypes.BadInput{ 109 Message: fmt.Sprintf("Service Unavailable. Status Code: [ %d ] ", bidderResponse.StatusCode), 110 }} 111 } 112 113 if bidderResponse.StatusCode != http.StatusOK { 114 return nil, []error{&errortypes.BadServerResponse{ 115 Message: fmt.Sprintf("Something went wrong, please contact your Account Manager. Status Code: [ %d ] ", bidderResponse.StatusCode), 116 }} 117 } 118 119 var bidResponse openrtb2.BidResponse 120 if err := json.Unmarshal(bidderResponse.Body, &bidResponse); err != nil { 121 return nil, []error{&errortypes.BadServerResponse{ 122 Message: "Bad Server Response", 123 }} 124 } 125 126 if len(bidResponse.SeatBid) == 0 { 127 return nil, []error{&errortypes.BadServerResponse{ 128 Message: "Empty SeatBid array", 129 }} 130 } 131 132 bidResponseFinal := adapters.NewBidderResponseWithBidsCapacity(len(bidResponse.SeatBid[0].Bid)) 133 sb := bidResponse.SeatBid[0] 134 135 for _, bid := range sb.Bid { 136 bidResponseFinal.Bids = append(bidResponseFinal.Bids, &adapters.TypedBid{ 137 Bid: &bid, 138 BidType: getMediaTypeForImp(bid.ImpID, receivedRequest.Imp), 139 }) 140 } 141 return bidResponseFinal, nil 142 } 143 144 func getMediaTypeForImp(impId string, imps []openrtb2.Imp) openrtb_ext.BidType { 145 mediaType := openrtb_ext.BidTypeBanner 146 for _, imp := range imps { 147 if imp.ID == impId { 148 if imp.Video != nil { 149 mediaType = openrtb_ext.BidTypeVideo 150 } else if imp.Native != nil { 151 mediaType = openrtb_ext.BidTypeNative 152 } 153 return mediaType 154 } 155 } 156 return mediaType 157 }