github.com/prebid/prebid-server@v0.275.0/adapters/apacdex/apacdex.go (about) 1 package apacdex 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 // Builder builds a new instance of the Apacdex adapter for the given bidder with the given config. 20 func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 21 bidder := &adapter{ 22 endpoint: config.Endpoint, 23 } 24 return bidder, nil 25 } 26 27 func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { 28 var errs []error 29 var adapterRequests []*adapters.RequestData 30 31 if err := preprocess(request); err != nil { 32 errs = append(errs, err) 33 return nil, errs 34 } 35 36 adapterReq, err := a.makeRequest(request) 37 if err != nil { 38 errs = append(errs, err) 39 return nil, errs 40 } 41 42 adapterRequests = append(adapterRequests, adapterReq) 43 44 return adapterRequests, errs 45 } 46 47 func (a *adapter) makeRequest(request *openrtb2.BidRequest) (*adapters.RequestData, error) { 48 var err error 49 50 jsonBody, err := json.Marshal(request) 51 if err != nil { 52 return nil, err 53 } 54 55 headers := http.Header{} 56 headers.Add("Content-Type", "application/json;charset=utf-8") 57 headers.Add("Accept", "application/json") 58 headers.Add("x-openrtb-version", "2.5") 59 60 return &adapters.RequestData{ 61 Method: "POST", 62 Uri: a.endpoint, 63 Body: jsonBody, 64 Headers: headers, 65 }, nil 66 } 67 68 func preprocess(request *openrtb2.BidRequest) error { 69 if len(request.Imp) == 0 { 70 return &errortypes.BadInput{ 71 Message: "No Imps in Bid Request", 72 } 73 } 74 for i := 0; i < len(request.Imp); i++ { 75 var imp = &request.Imp[i] 76 var bidderExt adapters.ExtImpBidder 77 78 if err := json.Unmarshal(imp.Ext, &bidderExt); err != nil { 79 return &errortypes.BadInput{ 80 Message: err.Error(), 81 } 82 } 83 84 var extImp openrtb_ext.ExtImpApacdex 85 if err := json.Unmarshal(bidderExt.Bidder, &extImp); err != nil { 86 return &errortypes.BadInput{ 87 Message: err.Error(), 88 } 89 } 90 91 imp.Ext = bidderExt.Bidder 92 } 93 94 return nil 95 } 96 97 func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { 98 if responseData.StatusCode == http.StatusNoContent { 99 return nil, nil 100 } 101 102 if responseData.StatusCode == http.StatusBadRequest { 103 err := &errortypes.BadInput{ 104 Message: "Unexpected status code: 400. Bad request from publisher. Run with request.debug = 1 for more info.", 105 } 106 return nil, []error{err} 107 } 108 109 if responseData.StatusCode != http.StatusOK { 110 err := &errortypes.BadServerResponse{ 111 Message: fmt.Sprintf("Unexpected status code: %d. Run with request.debug = 1 for more info.", responseData.StatusCode), 112 } 113 return nil, []error{err} 114 } 115 116 var response openrtb2.BidResponse 117 118 if err := json.Unmarshal(responseData.Body, &response); err != nil { 119 return nil, []error{&errortypes.BadServerResponse{ 120 Message: err.Error(), 121 }} 122 } 123 124 if len(response.SeatBid) == 0 { 125 return nil, nil 126 } 127 128 bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) 129 bidResponse.Currency = response.Cur 130 var errors []error 131 132 for _, seatbid := range response.SeatBid { 133 for _, bid := range seatbid.Bid { 134 bidType, err := getMediaTypeForBid(bid) 135 if err != nil { 136 errors = append(errors, err) 137 continue 138 } 139 bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ 140 Bid: &bid, 141 BidType: bidType, 142 }) 143 } 144 } 145 return bidResponse, errors 146 } 147 148 // getMediaTypeForBid determines which type of bid. 149 func getMediaTypeForBid(bid openrtb2.Bid) (openrtb_ext.BidType, error) { 150 if bid.Ext != nil { 151 var bidExt openrtb_ext.ExtBid 152 err := json.Unmarshal(bid.Ext, &bidExt) 153 if err == nil && bidExt.Prebid != nil { 154 return openrtb_ext.ParseBidType(string(bidExt.Prebid.Type)) 155 } 156 } 157 158 return "", &errortypes.BadServerResponse{ 159 Message: fmt.Sprintf("Failed to parse bid mediatype for impression \"%s\"", bid.ImpID), 160 } 161 }