github.com/prebid/prebid-server@v0.275.0/adapters/mgid/mgid.go (about) 1 package mgid 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "net/http" 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 MgidAdapter struct { 17 endpoint string 18 } 19 20 type ReqExt struct { 21 PlacementId string `json:"placementId"` 22 AccountId string `json:"accountId"` 23 } 24 25 type RespBidExt struct { 26 CreativeType openrtb_ext.BidType `json:"crtype"` 27 } 28 29 func (a *MgidAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) (adapterRequests []*adapters.RequestData, errs []error) { 30 31 adapterReq, errs := a.makeRequest(request) 32 if adapterReq != nil && len(errs) == 0 { 33 adapterRequests = append(adapterRequests, adapterReq) 34 } 35 36 return 37 } 38 39 func (a *MgidAdapter) makeRequest(request *openrtb2.BidRequest) (*adapters.RequestData, []error) { 40 var errs []error 41 42 path, err := preprocess(request) 43 if err != nil { 44 errs = append(errs, err) 45 return nil, errs 46 } 47 48 // Last Step 49 reqJSON, err := json.Marshal(request) 50 if err != nil { 51 errs = append(errs, err) 52 return nil, errs 53 } 54 55 headers := http.Header{} 56 headers.Add("Content-Type", "application/json;charset=utf-8") 57 headers.Add("Accept", "application/json") 58 59 return &adapters.RequestData{ 60 Method: "POST", 61 Uri: a.endpoint + path, 62 Body: reqJSON, 63 Headers: headers, 64 }, errs 65 } 66 67 // Mutate the request to get it ready to send to yieldmo. 68 func preprocess(request *openrtb2.BidRequest) (path string, err error) { 69 if request.TMax == 0 { 70 request.TMax = 200 71 } 72 for i := 0; i < len(request.Imp); i++ { 73 var imp = request.Imp[i] 74 var bidderExt adapters.ExtImpBidder 75 76 if err := json.Unmarshal(imp.Ext, &bidderExt); err != nil { 77 return "", &errortypes.BadInput{ 78 Message: err.Error(), 79 } 80 } 81 82 var mgidExt openrtb_ext.ExtImpMgid 83 84 if err := json.Unmarshal(bidderExt.Bidder, &mgidExt); err != nil { 85 return "", &errortypes.BadInput{ 86 Message: err.Error(), 87 } 88 } 89 90 if path == "" { 91 path = mgidExt.AccountId 92 } 93 if mgidExt.PlacementId == "" { 94 request.Imp[i].TagID = imp.ID 95 } else { 96 request.Imp[i].TagID = mgidExt.PlacementId + "/" + imp.ID 97 } 98 99 cur := "" 100 if mgidExt.Currency != "" && mgidExt.Currency != "USD" { 101 cur = mgidExt.Currency 102 } 103 if cur == "" && mgidExt.Cur != "" && mgidExt.Cur != "USD" { 104 cur = mgidExt.Cur 105 } 106 bidfloor := mgidExt.BidFloor 107 if bidfloor <= 0 { 108 bidfloor = mgidExt.BidFloor2 109 } 110 if bidfloor > 0 { 111 request.Imp[i].BidFloor = bidfloor 112 } 113 if cur != "" { 114 request.Imp[i].BidFloorCur = cur 115 } 116 } 117 if path == "" { 118 return "", &errortypes.BadInput{ 119 Message: "accountId is not set", 120 } 121 } 122 123 return 124 } 125 126 func (a *MgidAdapter) MakeBids(bidReq *openrtb2.BidRequest, unused *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) { 127 if response.StatusCode == http.StatusNoContent { 128 return nil, nil 129 } 130 131 if response.StatusCode == http.StatusBadRequest { 132 return nil, []error{&errortypes.BadInput{ 133 Message: fmt.Sprintf("Unexpected status code: %d. Run with request.debug = 1 for more info", response.StatusCode), 134 }} 135 } 136 137 if response.StatusCode != http.StatusOK { 138 return nil, []error{&errortypes.BadServerResponse{ 139 Message: fmt.Sprintf("Unexpected status code: %d. Run with request.debug = 1 for more info", response.StatusCode), 140 }} 141 } 142 143 var bidResp openrtb2.BidResponse 144 145 if err := json.Unmarshal(response.Body, &bidResp); err != nil { 146 return nil, []error{err} 147 } 148 149 bidResponse := adapters.NewBidderResponseWithBidsCapacity(1) 150 151 bidResponse.Currency = bidResp.Cur 152 153 for _, sb := range bidResp.SeatBid { 154 for i := range sb.Bid { 155 bidType := openrtb_ext.BidTypeBanner 156 if len(sb.Bid[i].Ext) > 0 && bytes.Contains(sb.Bid[i].Ext, []byte("crtype")) { 157 ext := RespBidExt{} 158 if err := json.Unmarshal(sb.Bid[i].Ext, &ext); err == nil && len(ext.CreativeType) > 0 { 159 bidType = ext.CreativeType 160 } 161 } 162 bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ 163 Bid: &sb.Bid[i], 164 BidType: bidType, 165 }) 166 } 167 } 168 return bidResponse, nil 169 } 170 171 // Builder builds a new instance of the Mgid adapter for the given bidder with the given config. 172 func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 173 bidder := &MgidAdapter{ 174 endpoint: config.Endpoint, 175 } 176 return bidder, nil 177 }