github.com/prebid/prebid-server@v0.275.0/adapters/rise/rise.go (about) 1 package rise 2 3 import ( 4 "encoding/json" 5 "errors" 6 "fmt" 7 "net/http" 8 "strings" 9 10 "github.com/prebid/openrtb/v19/openrtb2" 11 12 "github.com/prebid/prebid-server/adapters" 13 "github.com/prebid/prebid-server/config" 14 "github.com/prebid/prebid-server/openrtb_ext" 15 ) 16 17 // adapter is a Rise implementation of the adapters.Bidder interface. 18 type adapter struct { 19 endpointURL string 20 } 21 22 func Builder(_ openrtb_ext.BidderName, config config.Adapter, _ config.Server) (adapters.Bidder, error) { 23 return &adapter{ 24 endpointURL: config.Endpoint, 25 }, nil 26 } 27 28 // MakeRequests prepares the HTTP requests which should be made to fetch bids. 29 func (a *adapter) MakeRequests(openRTBRequest *openrtb2.BidRequest, _ *adapters.ExtraRequestInfo) (requestsToBidder []*adapters.RequestData, errs []error) { 30 org, err := extractOrg(openRTBRequest) 31 if err != nil { 32 errs = append(errs, fmt.Errorf("extractOrg: %w", err)) 33 return nil, errs 34 } 35 36 openRTBRequestJSON, err := json.Marshal(openRTBRequest) 37 if err != nil { 38 errs = append(errs, fmt.Errorf("marshal bidRequest: %w", err)) 39 return nil, errs 40 } 41 42 headers := http.Header{} 43 headers.Add("Content-Type", "application/json;charset=utf-8") 44 45 return append(requestsToBidder, &adapters.RequestData{ 46 Method: http.MethodPost, 47 Uri: a.endpointURL + "?publisher_id=" + org, 48 Body: openRTBRequestJSON, 49 Headers: headers, 50 }), nil 51 } 52 53 // MakeBids unpacks the server's response into Bids. 54 func (a *adapter) MakeBids(request *openrtb2.BidRequest, _ *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { 55 if adapters.IsResponseStatusCodeNoContent(responseData) { 56 return nil, nil 57 } 58 59 if err := adapters.CheckResponseStatusCodeForErrors(responseData); err != nil { 60 return nil, []error{err} 61 } 62 63 var response openrtb2.BidResponse 64 if err := json.Unmarshal(responseData.Body, &response); err != nil { 65 return nil, []error{err} 66 } 67 68 bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) 69 bidResponse.Currency = response.Cur 70 71 var errs []error 72 73 for _, seatBid := range response.SeatBid { 74 for i, bid := range seatBid.Bid { 75 bidType, err := getMediaTypeForBid(bid) 76 if err != nil { 77 errs = append(errs, err) 78 continue 79 } 80 81 bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ 82 Bid: &seatBid.Bid[i], 83 BidType: bidType, 84 }) 85 } 86 } 87 88 return bidResponse, errs 89 } 90 91 func extractOrg(openRTBRequest *openrtb2.BidRequest) (string, error) { 92 var err error 93 for _, imp := range openRTBRequest.Imp { 94 var bidderExt adapters.ExtImpBidder 95 if err = json.Unmarshal(imp.Ext, &bidderExt); err != nil { 96 return "", fmt.Errorf("unmarshal bidderExt: %w", err) 97 } 98 99 var impExt openrtb_ext.ImpExtRise 100 if err = json.Unmarshal(bidderExt.Bidder, &impExt); err != nil { 101 return "", fmt.Errorf("unmarshal ImpExtRise: %w", err) 102 } 103 104 if impExt.Org != "" { 105 return strings.TrimSpace(impExt.Org), nil 106 } 107 if impExt.PublisherID != "" { 108 return strings.TrimSpace(impExt.PublisherID), nil 109 } 110 } 111 112 return "", errors.New("no org or publisher_id supplied") 113 } 114 115 func getMediaTypeForBid(bid openrtb2.Bid) (openrtb_ext.BidType, error) { 116 switch bid.MType { 117 case openrtb2.MarkupBanner: 118 return openrtb_ext.BidTypeBanner, nil 119 case openrtb2.MarkupVideo: 120 return openrtb_ext.BidTypeVideo, nil 121 default: 122 return "", fmt.Errorf("unsupported MType %d", bid.MType) 123 } 124 }