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