github.com/prebid/prebid-server@v0.275.0/adapters/revcontent/revcontent.go (about)

     1  package revcontent
     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  // Builder builds a new instance of the Revcontent adapter for the given bidder with the given config.
    20  func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
    21  	bidder := &adapter{
    22  		endpoint: config.Endpoint,
    23  	}
    24  	return bidder, nil
    25  }
    26  
    27  func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
    28  	reqBody, err := json.Marshal(request)
    29  
    30  	if err != nil {
    31  		return nil, []error{err}
    32  	}
    33  
    34  	if err := checkRequest(request); err != nil {
    35  		return nil, []error{err}
    36  	}
    37  
    38  	headers := http.Header{}
    39  	headers.Add("Content-Type", "application/json;charset=utf-8")
    40  
    41  	req := &adapters.RequestData{
    42  		Method:  "POST",
    43  		Uri:     a.endpoint,
    44  		Body:    reqBody,
    45  		Headers: headers,
    46  	}
    47  	return []*adapters.RequestData{req}, nil
    48  }
    49  
    50  func checkRequest(request *openrtb2.BidRequest) error {
    51  	if (request.App == nil || len(request.App.Name) == 0) && (request.Site == nil || len(request.Site.Domain) == 0) {
    52  		return &errortypes.BadInput{
    53  			Message: "Impression is missing app name or site domain, and must contain one.",
    54  		}
    55  	}
    56  
    57  	return nil
    58  }
    59  
    60  // MakeBids make the bids for the bid response.
    61  func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) {
    62  	if response.StatusCode == http.StatusNoContent {
    63  		return nil, nil
    64  	}
    65  
    66  	if response.StatusCode == http.StatusBadRequest {
    67  		return nil, []error{&errortypes.BadInput{
    68  			Message: fmt.Sprintf("unexpected status code: %d.", response.StatusCode),
    69  		}}
    70  	}
    71  
    72  	if response.StatusCode != http.StatusOK {
    73  		return nil, []error{&errortypes.BadServerResponse{
    74  			Message: fmt.Sprintf("unexpected status code: %d.", response.StatusCode),
    75  		}}
    76  	}
    77  
    78  	var bidResp openrtb2.BidResponse
    79  
    80  	if err := json.Unmarshal(response.Body, &bidResp); err != nil {
    81  		return nil, []error{err}
    82  	}
    83  
    84  	bidResponse := adapters.NewBidderResponseWithBidsCapacity(5)
    85  
    86  	for _, sb := range bidResp.SeatBid {
    87  		for i := range sb.Bid {
    88  			var mediaType = getBidType(sb.Bid[i].AdM)
    89  			bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{
    90  				Bid:     &sb.Bid[i],
    91  				BidType: mediaType,
    92  			})
    93  		}
    94  	}
    95  	return bidResponse, nil
    96  
    97  }
    98  
    99  func getBidType(bidAdm string) openrtb_ext.BidType {
   100  	// native: {"ver":"1.1","assets":...
   101  	// banner: <div id='rtb-widget...
   102  	if bidAdm != "" && bidAdm[:1] == "<" {
   103  		return openrtb_ext.BidTypeBanner
   104  	}
   105  	return openrtb_ext.BidTypeNative
   106  }