github.com/prebid/prebid-server@v0.275.0/adapters/smilewanted/smilewanted.go (about) 1 package smilewanted 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 URI string 17 } 18 19 func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { 20 21 request.AT = 1 //Defaulting to first price auction for all prebid requests 22 23 reqJSON, err := json.Marshal(request) 24 if err != nil { 25 return nil, []error{&errortypes.BadInput{ 26 Message: fmt.Sprintf("Json not encoded. err: %s", err), 27 }} 28 } 29 30 headers := http.Header{} 31 headers.Add("Content-Type", "application/json;charset=utf-8") 32 headers.Add("Accept", "application/json") 33 headers.Add("x-openrtb-version", "2.5") 34 headers.Add("sw-integration-type", "prebid_server") 35 36 return []*adapters.RequestData{{ 37 Method: "POST", 38 Uri: a.URI, 39 Body: reqJSON, 40 Headers: headers, 41 }}, []error{} 42 } 43 44 func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) { 45 46 if response.StatusCode == http.StatusNoContent { 47 return nil, nil 48 } 49 50 if response.StatusCode == http.StatusBadRequest { 51 return nil, []error{&errortypes.BadInput{ 52 Message: fmt.Sprintf("Unexpected status code: %d.", response.StatusCode), 53 }} 54 } 55 56 if response.StatusCode != http.StatusOK { 57 return nil, []error{&errortypes.BadServerResponse{ 58 Message: fmt.Sprintf("Unexpected status code: %d. Run with request.debug = 1 for more info.", response.StatusCode), 59 }} 60 } 61 62 var bidResp openrtb2.BidResponse 63 if err := json.Unmarshal(response.Body, &bidResp); err != nil { 64 return nil, []error{&errortypes.BadServerResponse{ 65 Message: fmt.Sprintf("Bad server response: %s.", err), 66 }} 67 } 68 69 var bidReq openrtb2.BidRequest 70 if err := json.Unmarshal(externalRequest.Body, &bidReq); err != nil { 71 return nil, []error{err} 72 } 73 74 bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(bidResp.SeatBid[0].Bid)) 75 sb := bidResp.SeatBid[0] 76 for i := 0; i < len(sb.Bid); i++ { 77 bid := sb.Bid[i] 78 bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ 79 Bid: &bid, 80 BidType: getMediaTypeForImp(bid.ImpID, internalRequest.Imp), 81 }) 82 } 83 return bidResponse, nil 84 } 85 86 // getMediaTypeForImp figures out which media type this bid is for. 87 func getMediaTypeForImp(impId string, imps []openrtb2.Imp) openrtb_ext.BidType { 88 mediaType := openrtb_ext.BidTypeBanner //default type 89 for _, imp := range imps { 90 if imp.ID == impId { 91 if imp.Video != nil { 92 mediaType = openrtb_ext.BidTypeVideo 93 } 94 return mediaType 95 } 96 } 97 return mediaType 98 } 99 100 // Builder builds a new instance of the SmileWanted adapter for the given bidder with the given config. 101 func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 102 bidder := &adapter{ 103 URI: config.Endpoint, 104 } 105 return bidder, nil 106 }