github.com/prebid/prebid-server@v0.275.0/adapters/adxcg/adxcg.go (about) 1 package adxcg 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 8 "github.com/prebid/openrtb/v19/openrtb2" 9 "github.com/prebid/prebid-server/adapters" 10 "github.com/prebid/prebid-server/config" 11 "github.com/prebid/prebid-server/errortypes" 12 "github.com/prebid/prebid-server/openrtb_ext" 13 ) 14 15 // Builder builds a new instance of the Adxcg adapter for the given bidder with the given config. 16 func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 17 bidder := &adapter{ 18 endpoint: config.Endpoint, 19 } 20 return bidder, nil 21 } 22 23 type adapter struct { 24 endpoint string 25 } 26 27 // MakeRequests prepares the HTTP requests which should be made to fetch bids. 28 func (adapter *adapter) MakeRequests( 29 openRTBRequest *openrtb2.BidRequest, 30 reqInfo *adapters.ExtraRequestInfo, 31 ) ( 32 requestsToBidder []*adapters.RequestData, 33 errs []error, 34 ) { 35 openRTBRequestJSON, err := json.Marshal(openRTBRequest) 36 if err != nil { 37 errs = append(errs, err) 38 return nil, errs 39 } 40 41 headers := http.Header{} 42 headers.Add("Content-Type", "application/json;charset=utf-8") 43 requestToBidder := &adapters.RequestData{ 44 Method: "POST", 45 Uri: adapter.endpoint, 46 Body: openRTBRequestJSON, 47 Headers: headers, 48 } 49 requestsToBidder = append(requestsToBidder, requestToBidder) 50 51 return requestsToBidder, errs 52 } 53 54 const unexpectedStatusCodeFormat = "Unexpected status code: %d. Run with request.debug = 1 for more info" 55 56 // MakeBids unpacks the server's response into Bids. 57 func (adapter *adapter) MakeBids( 58 openRTBRequest *openrtb2.BidRequest, 59 requestToBidder *adapters.RequestData, 60 bidderRawResponse *adapters.ResponseData, 61 ) ( 62 bidderResponse *adapters.BidderResponse, 63 errs []error, 64 ) { 65 switch bidderRawResponse.StatusCode { 66 case http.StatusOK: 67 break 68 case http.StatusNoContent: 69 return nil, nil 70 case http.StatusBadRequest: 71 err := &errortypes.BadInput{ 72 Message: fmt.Sprintf(unexpectedStatusCodeFormat, bidderRawResponse.StatusCode), 73 } 74 return nil, []error{err} 75 default: 76 err := &errortypes.BadServerResponse{ 77 Message: fmt.Sprintf(unexpectedStatusCodeFormat, bidderRawResponse.StatusCode), 78 } 79 return nil, []error{err} 80 } 81 82 var openRTBBidderResponse openrtb2.BidResponse 83 if err := json.Unmarshal(bidderRawResponse.Body, &openRTBBidderResponse); err != nil { 84 return nil, []error{err} 85 } 86 87 bidderResponse = adapters.NewBidderResponseWithBidsCapacity(len(openRTBRequest.Imp)) 88 bidderResponse.Currency = openRTBBidderResponse.Cur 89 var typedBid *adapters.TypedBid 90 for _, seatBid := range openRTBBidderResponse.SeatBid { 91 for _, bid := range seatBid.Bid { 92 activeBid := bid 93 bidType, err := getReturnTypeFromMtypeForImp(activeBid.MType) 94 if err != nil { 95 errs = append(errs, err) 96 continue 97 } 98 99 typedBid = &adapters.TypedBid{Bid: &activeBid, BidType: bidType} 100 bidderResponse.Bids = append(bidderResponse.Bids, typedBid) 101 } 102 } 103 104 return bidderResponse, nil 105 106 } 107 108 func getReturnTypeFromMtypeForImp(mType openrtb2.MarkupType) (openrtb_ext.BidType, error) { 109 switch mType { 110 case openrtb2.MarkupBanner: 111 return openrtb_ext.BidTypeBanner, nil 112 case openrtb2.MarkupVideo: 113 return openrtb_ext.BidTypeVideo, nil 114 case openrtb2.MarkupNative: 115 return openrtb_ext.BidTypeNative, nil 116 case openrtb2.MarkupAudio: 117 return openrtb_ext.BidTypeAudio, nil 118 default: 119 return "", &errortypes.BadServerResponse{Message: "Unsupported return type"} 120 } 121 }