github.com/prebid/prebid-server@v0.275.0/adapters/bliink/bliink.go (about) 1 package bliink 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 8 "github.com/prebid/openrtb/v19/openrtb2" 9 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/openrtb_ext" 14 ) 15 16 type adapter struct { 17 endpoint string 18 } 19 20 // Builder builds a new instance of the Bliink adapter for the given bidder with the given config. 21 func Builder(_ openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 22 bidder := &adapter{ 23 endpoint: config.Endpoint, 24 } 25 26 return bidder, nil 27 } 28 29 func (a *adapter) MakeRequests(request *openrtb2.BidRequest, _ *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { 30 requestJSON, err := json.Marshal(request) 31 if err != nil { 32 return nil, []error{err} 33 } 34 35 headers := http.Header{} 36 headers.Add("Content-Type", "application/json;charset=utf-8") 37 headers.Add("Accept", "application/json") 38 headers.Add("x-openrtb-version", "2.5") 39 40 requestData := &adapters.RequestData{ 41 Method: "POST", 42 Uri: a.endpoint, 43 Body: requestJSON, 44 Headers: headers, 45 } 46 47 return []*adapters.RequestData{requestData}, nil 48 } 49 50 func (a *adapter) MakeBids(request *openrtb2.BidRequest, _ *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { 51 if responseData.StatusCode == http.StatusNoContent { 52 return nil, nil 53 } 54 55 if responseData.StatusCode == http.StatusBadRequest { 56 err := &errortypes.BadInput{ 57 Message: "Unexpected status code: 400. Bad request from publisher. Run with request.debug = 1 for more info.", 58 } 59 return nil, []error{err} 60 } 61 62 if responseData.StatusCode != http.StatusOK { 63 err := &errortypes.BadServerResponse{ 64 Message: fmt.Sprintf("Unexpected status code: %d. Run with request.debug = 1 for more info.", responseData.StatusCode), 65 } 66 return nil, []error{err} 67 } 68 69 var response openrtb2.BidResponse 70 if err := json.Unmarshal(responseData.Body, &response); err != nil { 71 return nil, []error{err} 72 } 73 74 if len(response.SeatBid) == 0 { 75 return nil, []error{&errortypes.BadServerResponse{ 76 Message: "Empty SeatBid array", 77 }} 78 } 79 80 bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) 81 bidResponse.Currency = response.Cur 82 var errs []error 83 for _, seatBid := range response.SeatBid { 84 for i, bid := range seatBid.Bid { 85 mediaType, err := getMediaTypeForImp(bid.ImpID, request.Imp) 86 if err != nil { 87 errs = append(errs, err) 88 continue 89 } 90 bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ 91 Bid: &seatBid.Bid[i], 92 BidType: mediaType, 93 }) 94 } 95 } 96 97 return bidResponse, errs 98 } 99 100 func getMediaTypeForImp(impId string, imps []openrtb2.Imp) (openrtb_ext.BidType, error) { 101 var mediaType openrtb_ext.BidType 102 var typeCnt = 0 103 for _, imp := range imps { 104 if imp.ID == impId { 105 if imp.Banner != nil { 106 typeCnt += 1 107 mediaType = openrtb_ext.BidTypeBanner 108 } 109 if imp.Native != nil { 110 typeCnt += 1 111 mediaType = openrtb_ext.BidTypeNative 112 } 113 if imp.Video != nil { 114 typeCnt += 1 115 mediaType = openrtb_ext.BidTypeVideo 116 } 117 } 118 } 119 if typeCnt == 1 { 120 return mediaType, nil 121 } 122 return mediaType, fmt.Errorf("unable to fetch mediaType in multi-format: %s", impId) 123 }