github.com/prebid/prebid-server@v0.275.0/adapters/applogy/applogy.go (about) 1 package applogy 2 3 import ( 4 "encoding/json" 5 "errors" 6 "net/http" 7 "strconv" 8 9 "github.com/prebid/openrtb/v19/openrtb2" 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 ApplogyAdapter struct { 17 endpoint string 18 } 19 20 func (a *ApplogyAdapter) MakeRequests(request *openrtb2.BidRequest, _ *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { 21 headers := http.Header{} 22 headers.Add("Content-Type", "application/json;charset=utf-8") 23 headers.Add("Accept", "application/json") 24 impressions := request.Imp 25 result := make([]*adapters.RequestData, 0, len(impressions)) 26 errs := make([]error, 0, len(impressions)) 27 28 for _, impression := range impressions { 29 if impression.Banner == nil && impression.Video == nil && impression.Native == nil { 30 errs = append(errs, &errortypes.BadInput{ 31 Message: "Applogy only supports banner, video or native ads", 32 }) 33 continue 34 } 35 if impression.Banner != nil { 36 if impression.Banner.W == nil || impression.Banner.H == nil || *impression.Banner.W == 0 || *impression.Banner.H == 0 { 37 if len(impression.Banner.Format) == 0 { 38 errs = append(errs, &errortypes.BadInput{ 39 Message: "banner size information missing", 40 }) 41 continue 42 } 43 banner := *impression.Banner 44 banner.W = openrtb2.Int64Ptr(banner.Format[0].W) 45 banner.H = openrtb2.Int64Ptr(banner.Format[0].H) 46 impression.Banner = &banner 47 } 48 } 49 if len(impression.Ext) == 0 { 50 errs = append(errs, errors.New("impression extensions required")) 51 continue 52 } 53 var bidderExt adapters.ExtImpBidder 54 err := json.Unmarshal(impression.Ext, &bidderExt) 55 if err != nil { 56 errs = append(errs, err) 57 continue 58 } 59 if len(bidderExt.Bidder) == 0 { 60 errs = append(errs, errors.New("bidder required")) 61 continue 62 } 63 var impressionExt openrtb_ext.ExtImpApplogy 64 err = json.Unmarshal(bidderExt.Bidder, &impressionExt) 65 if err != nil { 66 errs = append(errs, err) 67 continue 68 } 69 if impressionExt.Token == "" { 70 errs = append(errs, errors.New("Applogy token required")) 71 continue 72 } 73 request.Imp = []openrtb2.Imp{impression} 74 body, err := json.Marshal(request) 75 if err != nil { 76 errs = append(errs, err) 77 continue 78 } 79 result = append(result, &adapters.RequestData{ 80 Method: "POST", 81 Uri: a.endpoint + "/" + impressionExt.Token, 82 Body: body, 83 Headers: headers, 84 }) 85 } 86 87 request.Imp = impressions 88 89 if len(result) == 0 { 90 return nil, errs 91 } 92 return result, errs 93 } 94 95 func (a *ApplogyAdapter) MakeBids(request *openrtb2.BidRequest, _ *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { 96 var errs []error 97 98 switch responseData.StatusCode { 99 case http.StatusNoContent: 100 return nil, nil 101 case http.StatusBadRequest: 102 return nil, []error{&errortypes.BadInput{ 103 Message: "unexpected status code: " + strconv.Itoa(responseData.StatusCode), 104 }} 105 case http.StatusOK: 106 break 107 default: 108 return nil, []error{&errortypes.BadServerResponse{ 109 Message: "unexpected status code: " + strconv.Itoa(responseData.StatusCode), 110 }} 111 } 112 113 var bidResponse openrtb2.BidResponse 114 err := json.Unmarshal(responseData.Body, &bidResponse) 115 if err != nil { 116 return nil, []error{&errortypes.BadServerResponse{ 117 Message: err.Error(), 118 }} 119 } 120 121 response := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) 122 123 for _, seatBid := range bidResponse.SeatBid { 124 for _, bid := range seatBid.Bid { 125 bid := bid // pin https://github.com/kyoh86/scopelint#whats-this 126 var bidType openrtb_ext.BidType 127 for _, impression := range request.Imp { 128 if impression.ID != bid.ImpID { 129 continue 130 } 131 switch { 132 case impression.Banner != nil: 133 bidType = openrtb_ext.BidTypeBanner 134 case impression.Video != nil: 135 bidType = openrtb_ext.BidTypeVideo 136 case impression.Native != nil: 137 bidType = openrtb_ext.BidTypeNative 138 } 139 break 140 } 141 if bidType == "" { 142 errs = append(errs, &errortypes.BadServerResponse{ 143 Message: "ignoring bid id=" + bid.ID + ", request doesn't contain any valid impression with id=" + bid.ImpID, 144 }) 145 continue 146 } 147 response.Bids = append(response.Bids, &adapters.TypedBid{ 148 Bid: &bid, 149 BidType: bidType, 150 }) 151 } 152 } 153 154 return response, errs 155 } 156 157 // Builder builds a new instance of the Applogy adapter for the given bidder with the given config. 158 func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 159 bidder := &ApplogyAdapter{ 160 endpoint: config.Endpoint, 161 } 162 return bidder, nil 163 }