github.com/prebid/prebid-server@v0.275.0/adapters/mobfoxpb/mobfoxpb.go (about) 1 package mobfoxpb 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "strings" 8 9 "github.com/buger/jsonparser" 10 "github.com/prebid/openrtb/v19/openrtb2" 11 "github.com/prebid/prebid-server/adapters" 12 "github.com/prebid/prebid-server/config" 13 "github.com/prebid/prebid-server/errortypes" 14 "github.com/prebid/prebid-server/openrtb_ext" 15 ) 16 17 const ( 18 ROUTE_NATIVE = "o" 19 ROUTE_RTB = "rtb" 20 METHOD_NATIVE = "ortb" 21 METHOD_RTB = "req" 22 MACROS_ROUTE = "__route__" 23 MACROS_METHOD = "__method__" 24 MACROS_KEY = "__key__" 25 ) 26 27 type adapter struct { 28 URI string 29 } 30 31 // Builder builds a new instance of the Mobfox adapter for the given bidder with the given config. 32 func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 33 bidder := &adapter{ 34 URI: config.Endpoint, 35 } 36 return bidder, nil 37 } 38 39 // MakeRequests create bid request for mobfoxpb demand 40 func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { 41 var errs []error 42 var route string 43 var method string 44 var adapterRequests []*adapters.RequestData 45 46 requestURI := a.URI 47 reqCopy := *request 48 imp := request.Imp[0] 49 tagID, errTag := jsonparser.GetString(imp.Ext, "bidder", "TagID") 50 key, errKey := jsonparser.GetString(imp.Ext, "bidder", "key") 51 if errTag != nil && errKey != nil { 52 errs = append(errs, &errortypes.BadInput{ 53 Message: fmt.Sprintf("Invalid or non existing key and tagId, atleast one should be present"), 54 }) 55 return nil, errs 56 } 57 58 if key != "" { 59 route = ROUTE_RTB 60 method = METHOD_RTB 61 requestURI = strings.Replace(requestURI, MACROS_KEY, key, 1) 62 } else if tagID != "" { 63 method = METHOD_NATIVE 64 route = ROUTE_NATIVE 65 } 66 67 requestURI = strings.Replace(requestURI, MACROS_ROUTE, route, 1) 68 requestURI = strings.Replace(requestURI, MACROS_METHOD, method, 1) 69 70 reqCopy.Imp = []openrtb2.Imp{imp} 71 adapterReq, err := a.makeRequest(&reqCopy, requestURI) 72 if err != nil { 73 errs = append(errs, err) 74 } 75 if adapterReq != nil { 76 adapterRequests = append(adapterRequests, adapterReq) 77 } 78 return adapterRequests, errs 79 } 80 81 func (a *adapter) makeRequest(request *openrtb2.BidRequest, requestURI string) (*adapters.RequestData, error) { 82 reqJSON, err := json.Marshal(request) 83 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: requestURI, 94 Body: reqJSON, 95 Headers: headers, 96 }, nil 97 } 98 99 // MakeBids makes the bids 100 func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) { 101 var errs []error 102 103 if response.StatusCode == http.StatusNoContent { 104 return nil, nil 105 } 106 107 if response.StatusCode != http.StatusOK { 108 return nil, []error{&errortypes.BadServerResponse{ 109 Message: fmt.Sprintf("Unexpected status code: %d. Run with request.debug = 1 for more info", response.StatusCode), 110 }} 111 } 112 113 var bidResp openrtb2.BidResponse 114 115 if err := json.Unmarshal(response.Body, &bidResp); err != nil { 116 return nil, []error{err} 117 } 118 119 bidResponse := adapters.NewBidderResponseWithBidsCapacity(1) 120 121 for _, sb := range bidResp.SeatBid { 122 for _, bid := range sb.Bid { 123 bidType, err := getMediaTypeForImp(bid.ImpID, internalRequest.Imp) 124 if err != nil { 125 errs = append(errs, err) 126 } else { 127 bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ 128 Bid: &bid, 129 BidType: bidType, 130 }) 131 } 132 } 133 } 134 return bidResponse, errs 135 } 136 137 func getMediaTypeForImp(impID string, imps []openrtb2.Imp) (openrtb_ext.BidType, error) { 138 mediaType := openrtb_ext.BidTypeBanner 139 for _, imp := range imps { 140 if imp.ID == impID { 141 if imp.Banner != nil { 142 mediaType = openrtb_ext.BidTypeBanner 143 } else if imp.Video != nil { 144 mediaType = openrtb_ext.BidTypeVideo 145 } else if imp.Native != nil { 146 mediaType = openrtb_ext.BidTypeNative 147 } 148 return mediaType, nil 149 } 150 } 151 152 // This shouldnt happen. Lets handle it just incase by returning an error. 153 return "", &errortypes.BadServerResponse{ 154 Message: fmt.Sprintf("Failed to find impression \"%s\"", impID), 155 } 156 }