github.com/prebid/prebid-server@v0.275.0/adapters/bidscube/bidscube.go (about) 1 package bidscube 2 3 import ( 4 "encoding/json" 5 "errors" 6 "fmt" 7 "net/http" 8 "strconv" 9 10 "github.com/buger/jsonparser" 11 "github.com/prebid/openrtb/v19/openrtb2" 12 "github.com/prebid/prebid-server/adapters" 13 "github.com/prebid/prebid-server/config" 14 "github.com/prebid/prebid-server/errortypes" 15 "github.com/prebid/prebid-server/openrtb_ext" 16 ) 17 18 type adapter struct { 19 endpoint string 20 } 21 22 func (a *adapter) MakeRequests(request *openrtb2.BidRequest, _ *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { 23 headers := http.Header{} 24 headers.Add("Content-Type", "application/json;charset=utf-8") 25 headers.Add("Accept", "application/json") 26 impressions := request.Imp 27 result := make([]*adapters.RequestData, 0, len(impressions)) 28 var errs []error 29 30 for _, impression := range impressions { 31 var impExt map[string]json.RawMessage 32 if err := json.Unmarshal(impression.Ext, &impExt); err != nil { 33 errs = append(errs, err) 34 continue 35 } 36 37 bidderExt, bidderExtExists := impExt["bidder"] 38 if !bidderExtExists || len(bidderExt) == 0 { 39 errs = append(errs, errors.New("bidder parameters required")) 40 continue 41 } 42 43 impression.Ext = bidderExt 44 request.Imp = []openrtb2.Imp{impression} 45 body, err := json.Marshal(request) 46 if err != nil { 47 errs = append(errs, err) 48 continue 49 } 50 result = append(result, &adapters.RequestData{ 51 Method: "POST", 52 Uri: a.endpoint, 53 Body: body, 54 Headers: headers, 55 }) 56 } 57 58 request.Imp = impressions 59 return result, errs 60 } 61 62 func (a *adapter) MakeBids(request *openrtb2.BidRequest, _ *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { 63 var errs []error 64 65 switch responseData.StatusCode { 66 case http.StatusNoContent: 67 return nil, nil 68 case http.StatusBadRequest: 69 return nil, []error{&errortypes.BadInput{ 70 Message: "unexpected status code: " + strconv.Itoa(responseData.StatusCode), 71 }} 72 case http.StatusOK: 73 break 74 default: 75 return nil, []error{&errortypes.BadServerResponse{ 76 Message: "unexpected status code: " + strconv.Itoa(responseData.StatusCode), 77 }} 78 } 79 80 var bidResponse openrtb2.BidResponse 81 err := json.Unmarshal(responseData.Body, &bidResponse) 82 if err != nil { 83 return nil, []error{&errortypes.BadServerResponse{ 84 Message: err.Error(), 85 }} 86 } 87 88 response := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) 89 90 for _, seatBid := range bidResponse.SeatBid { 91 for i := range seatBid.Bid { 92 bidType, err := jsonparser.GetString(seatBid.Bid[i].Ext, "prebid", "type") 93 if err != nil { 94 errs = append(errs, fmt.Errorf("unable to read bid.ext.prebid.type: %v", err)) 95 continue 96 } 97 response.Bids = append(response.Bids, &adapters.TypedBid{ 98 Bid: &seatBid.Bid[i], 99 BidType: getMediaTypeForImp(bidType), 100 }) 101 } 102 } 103 104 return response, errs 105 } 106 107 func getMediaTypeForImp(bidType string) openrtb_ext.BidType { 108 switch bidType { 109 case "banner": 110 return openrtb_ext.BidTypeBanner 111 case "video": 112 return openrtb_ext.BidTypeVideo 113 case "native": 114 return openrtb_ext.BidTypeNative 115 } 116 return openrtb_ext.BidTypeBanner 117 } 118 119 // Builder builds a new instance of the BidsCube adapter for the given bidder with the given config. 120 func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 121 bidder := &adapter{ 122 endpoint: config.Endpoint, 123 } 124 return bidder, nil 125 }