github.com/prebid/prebid-server@v0.275.0/adapters/axis/axis.go (about) 1 package axis 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 type adapter struct { 16 endpoint string 17 } 18 19 type reqBodyExt struct { 20 AxisBidderExt openrtb_ext.ImpExtAxis `json:"bidder"` 21 } 22 23 func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 24 bidder := &adapter{ 25 endpoint: config.Endpoint, 26 } 27 28 return bidder, nil 29 } 30 31 func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { 32 var adapterRequests []*adapters.RequestData 33 34 originalImpSlice := request.Imp 35 36 for i := range request.Imp { 37 currImp := originalImpSlice[i] 38 request.Imp = []openrtb2.Imp{currImp} 39 40 var bidderExt reqBodyExt 41 if err := json.Unmarshal(currImp.Ext, &bidderExt); err != nil { 42 continue 43 } 44 45 extJson, err := json.Marshal(bidderExt) 46 if err != nil { 47 return nil, []error{err} 48 } 49 50 request.Imp[0].Ext = extJson 51 52 adapterReq, err := a.buildRequest(request) 53 if err != nil { 54 return nil, []error{err} 55 } 56 57 if adapterReq != nil { 58 adapterRequests = append(adapterRequests, adapterReq) 59 } 60 } 61 request.Imp = originalImpSlice 62 return adapterRequests, nil 63 } 64 65 func (a *adapter) buildRequest(request *openrtb2.BidRequest) (*adapters.RequestData, error) { 66 reqJSON, err := json.Marshal(request) 67 if err != nil { 68 return nil, err 69 } 70 71 headers := http.Header{} 72 headers.Add("Content-Type", "application/json;charset=utf-8") 73 headers.Add("Accept", "application/json") 74 75 return &adapters.RequestData{ 76 Method: "POST", 77 Uri: a.endpoint, 78 Body: reqJSON, 79 Headers: headers, 80 }, nil 81 } 82 83 func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { 84 if responseData.StatusCode == http.StatusNoContent { 85 return nil, nil 86 } 87 88 if responseData.StatusCode != http.StatusOK { 89 err := &errortypes.BadServerResponse{ 90 Message: fmt.Sprintf("Unexpected status code: %d. Run with request.debug = 1 for more info.", responseData.StatusCode), 91 } 92 return nil, []error{err} 93 } 94 95 var response openrtb2.BidResponse 96 if err := json.Unmarshal(responseData.Body, &response); err != nil { 97 return nil, []error{err} 98 } 99 100 bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) 101 bidResponse.Currency = response.Cur 102 103 impsMappedByID := make(map[string]openrtb2.Imp, len(request.Imp)) 104 for i, imp := range request.Imp { 105 impsMappedByID[request.Imp[i].ID] = imp 106 } 107 108 for _, seatBid := range response.SeatBid { 109 for i := range seatBid.Bid { 110 bidType, err := getMediaTypeForImp(seatBid.Bid[i].ImpID, impsMappedByID) 111 if err != nil { 112 return nil, []error{err} 113 } 114 115 b := &adapters.TypedBid{ 116 Bid: &seatBid.Bid[i], 117 BidType: bidType, 118 } 119 bidResponse.Bids = append(bidResponse.Bids, b) 120 } 121 } 122 return bidResponse, nil 123 } 124 125 func getMediaTypeForImp(impID string, impMap map[string]openrtb2.Imp) (openrtb_ext.BidType, error) { 126 if index, found := impMap[impID]; found { 127 if index.Banner != nil { 128 return openrtb_ext.BidTypeBanner, nil 129 } 130 if index.Video != nil { 131 return openrtb_ext.BidTypeVideo, nil 132 } 133 if index.Native != nil { 134 return openrtb_ext.BidTypeNative, nil 135 } 136 } 137 138 return "", &errortypes.BadInput{ 139 Message: fmt.Sprintf("Failed to find impression \"%s\"", impID), 140 } 141 }