github.com/prebid/prebid-server@v0.275.0/adapters/pgamssp/pgamssp.go (about) 1 package pgamssp 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/openrtb_ext" 12 ) 13 14 type adapter struct { 15 endpoint string 16 } 17 18 type reqBodyExt struct { 19 PGAMSspBidderExt reqBodyExtBidder `json:"bidder"` 20 } 21 22 type reqBodyExtBidder struct { 23 Type string `json:"type"` 24 PlacementID string `json:"placementId,omitempty"` 25 EndpointID string `json:"endpointId,omitempty"` 26 } 27 28 func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 29 bidder := &adapter{ 30 endpoint: config.Endpoint, 31 } 32 return bidder, nil 33 } 34 35 func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { 36 var err error 37 var adapterRequests []*adapters.RequestData 38 39 reqCopy := *request 40 for _, imp := range request.Imp { 41 reqCopy.Imp = []openrtb2.Imp{imp} 42 43 var bidderExt adapters.ExtImpBidder 44 var pgamExt openrtb_ext.ImpExtPgamSsp 45 46 if err = json.Unmarshal(reqCopy.Imp[0].Ext, &bidderExt); err != nil { 47 return nil, []error{err} 48 } 49 if err = json.Unmarshal(bidderExt.Bidder, &pgamExt); err != nil { 50 return nil, []error{err} 51 } 52 53 temp := reqBodyExt{PGAMSspBidderExt: reqBodyExtBidder{}} 54 55 if pgamExt.PlacementID != "" { 56 temp.PGAMSspBidderExt.PlacementID = pgamExt.PlacementID 57 temp.PGAMSspBidderExt.Type = "publisher" 58 } else if pgamExt.EndpointID != "" { 59 temp.PGAMSspBidderExt.EndpointID = pgamExt.EndpointID 60 temp.PGAMSspBidderExt.Type = "network" 61 } 62 63 finalyImpExt, err := json.Marshal(temp) 64 if err != nil { 65 return nil, []error{err} 66 } 67 68 reqCopy.Imp[0].Ext = finalyImpExt 69 70 adapterReq, err := a.makeRequest(&reqCopy) 71 if err != nil { 72 return nil, []error{err} 73 } 74 75 if adapterReq != nil { 76 adapterRequests = append(adapterRequests, adapterReq) 77 } 78 } 79 return adapterRequests, nil 80 } 81 82 func (a *adapter) makeRequest(request *openrtb2.BidRequest) (*adapters.RequestData, error) { 83 reqJSON, err := json.Marshal(request) 84 if err != nil { 85 return nil, err 86 } 87 88 headers := http.Header{} 89 headers.Add("Content-Type", "application/json;charset=utf-8") 90 headers.Add("Accept", "application/json") 91 return &adapters.RequestData{ 92 Method: "POST", 93 Uri: a.endpoint, 94 Body: reqJSON, 95 Headers: headers, 96 }, err 97 } 98 99 func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { 100 if adapters.IsResponseStatusCodeNoContent(responseData) { 101 return nil, nil 102 } 103 104 if err := adapters.CheckResponseStatusCodeForErrors(responseData); err != nil { 105 return nil, []error{err} 106 } 107 108 var response openrtb2.BidResponse 109 if err := json.Unmarshal(responseData.Body, &response); err != nil { 110 return nil, []error{err} 111 } 112 113 bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) 114 bidResponse.Currency = response.Cur 115 for _, seatBid := range response.SeatBid { 116 for i := range seatBid.Bid { 117 bidType, err := getBidMediaType(&seatBid.Bid[i]) 118 if err != nil { 119 return nil, []error{err} 120 } 121 122 b := &adapters.TypedBid{ 123 Bid: &seatBid.Bid[i], 124 BidType: bidType, 125 } 126 bidResponse.Bids = append(bidResponse.Bids, b) 127 } 128 } 129 return bidResponse, nil 130 } 131 132 func getBidMediaType(bid *openrtb2.Bid) (openrtb_ext.BidType, error) { 133 switch bid.MType { 134 case openrtb2.MarkupBanner: 135 return openrtb_ext.BidTypeBanner, nil 136 case openrtb2.MarkupVideo: 137 return openrtb_ext.BidTypeVideo, nil 138 case openrtb2.MarkupAudio: 139 return openrtb_ext.BidTypeAudio, nil 140 case openrtb2.MarkupNative: 141 return openrtb_ext.BidTypeNative, nil 142 default: 143 return "", fmt.Errorf("Unable to fetch mediaType in multi-format: %s", bid.ImpID) 144 } 145 }