Skip to content

Commit e254d40

Browse files
author
zhoubing01
committed
New Adapter: iqiyi
remove go.mod and go.sum files add go.mod go.sum format json file
1 parent 8070000 commit e254d40

File tree

15 files changed

+1237
-0
lines changed

15 files changed

+1237
-0
lines changed

adapters/iqiyi/iqiyi.go

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package iqiyi
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"github.com/prebid/openrtb/v20/openrtb2"
7+
"github.com/prebid/prebid-server/v3/adapters"
8+
"github.com/prebid/prebid-server/v3/config"
9+
"github.com/prebid/prebid-server/v3/errortypes"
10+
"github.com/prebid/prebid-server/v3/macros"
11+
"github.com/prebid/prebid-server/v3/openrtb_ext"
12+
"github.com/prebid/prebid-server/v3/util/jsonutil"
13+
"net/http"
14+
"text/template"
15+
)
16+
17+
type adapter struct {
18+
endpoint *template.Template
19+
}
20+
21+
func pickCurrency(req *openrtb2.BidRequest, resp *openrtb2.BidResponse) string {
22+
if resp.Cur != "" {
23+
return resp.Cur
24+
}
25+
26+
if len(req.Cur) > 0 && req.Cur[0] != "" {
27+
return req.Cur[0]
28+
}
29+
30+
return "USD"
31+
}
32+
33+
func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
34+
template, err := template.New("endpointTemplate").Parse(config.Endpoint)
35+
if err == nil {
36+
_, err = macros.ResolveMacros(template, macros.EndpointTemplateParams{})
37+
}
38+
39+
if err != nil {
40+
return nil, fmt.Errorf("unable to parse endpoint url template: %w", err)
41+
}
42+
43+
bidder := &adapter{
44+
endpoint: template,
45+
}
46+
return bidder, nil
47+
}
48+
49+
func (a *adapter) buildEndpointURL(params *openrtb_ext.ExtImpIqiyi) (string, error) {
50+
endpointParams := macros.EndpointTemplateParams{AccountID: params.AccountID}
51+
return macros.ResolveMacros(a.endpoint, endpointParams)
52+
}
53+
54+
func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
55+
var errs []error
56+
if len(request.Imp) == 0 {
57+
errs = append(errs, &errortypes.BadInput{Message: "No impression in the request"})
58+
return nil, errs
59+
}
60+
61+
var bidderExt adapters.ExtImpBidder
62+
if err := jsonutil.Unmarshal(request.Imp[0].Ext, &bidderExt); err != nil {
63+
errs = append(errs, &errortypes.BadInput{Message: "bad Iqiyi bidder ext"})
64+
return nil, errs
65+
}
66+
67+
var iqiyiExt openrtb_ext.ExtImpIqiyi
68+
if err := jsonutil.Unmarshal(bidderExt.Bidder, &iqiyiExt); err != nil {
69+
errs = append(errs, &errortypes.BadInput{Message: "bad Iqiyi bidder ext"})
70+
return nil, errs
71+
}
72+
73+
for i := range request.Imp {
74+
imp := &request.Imp[i]
75+
if imp.Banner != nil {
76+
b := *imp.Banner
77+
if (b.W == nil || b.H == nil || *b.W == 0 || *b.H == 0) && len(b.Format) > 0 {
78+
first := b.Format[0]
79+
b.W = &first.W
80+
b.H = &first.H
81+
imp.Banner = &b
82+
}
83+
}
84+
if imp.BidFloorCur == "" && imp.BidFloor > 0 {
85+
imp.BidFloorCur = "USD"
86+
}
87+
}
88+
89+
url, err := a.buildEndpointURL(&iqiyiExt)
90+
if err != nil {
91+
errs = append(errs, err)
92+
return nil, errs
93+
}
94+
95+
reqJson, err := json.Marshal(request)
96+
if err != nil {
97+
errs = append(errs, err)
98+
return nil, errs
99+
}
100+
101+
headers := http.Header{}
102+
headers.Add("Content-Type", "application/json;charset=utf-8")
103+
headers.Add("Accept", "application/json")
104+
105+
return []*adapters.RequestData{{
106+
Method: "POST",
107+
Uri: url,
108+
Body: reqJson,
109+
Headers: headers,
110+
ImpIDs: openrtb_ext.GetImpIDs(request.Imp),
111+
}}, nil
112+
}
113+
114+
func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) {
115+
if response.StatusCode == http.StatusNoContent {
116+
return nil, nil
117+
}
118+
119+
if response.StatusCode != http.StatusOK {
120+
return nil, []error{&errortypes.BadServerResponse{
121+
Message: fmt.Sprintf("Unexpected http status code: %d", response.StatusCode),
122+
}}
123+
}
124+
125+
var serverBidResponse openrtb2.BidResponse
126+
if err := jsonutil.Unmarshal(response.Body, &serverBidResponse); err != nil {
127+
return nil, []error{err}
128+
}
129+
130+
bidResponse := adapters.NewBidderResponseWithBidsCapacity(1)
131+
bidResponse.Currency = pickCurrency(internalRequest, &serverBidResponse)
132+
133+
for _, seatbid := range serverBidResponse.SeatBid {
134+
for i := range seatbid.Bid {
135+
mediaType, err := getMediaTypeForImp(seatbid.Bid[i])
136+
if err != nil {
137+
return nil, []error{err}
138+
}
139+
bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{
140+
Bid: &seatbid.Bid[i],
141+
BidType: mediaType,
142+
})
143+
}
144+
}
145+
146+
return bidResponse, nil
147+
}
148+
149+
func getMediaTypeForImp(bid openrtb2.Bid) (openrtb_ext.BidType, error) {
150+
switch bid.MType {
151+
case openrtb2.MarkupBanner:
152+
return openrtb_ext.BidTypeBanner, nil
153+
case openrtb2.MarkupVideo:
154+
return openrtb_ext.BidTypeVideo, nil
155+
case openrtb2.MarkupNative:
156+
return openrtb_ext.BidTypeNative, nil
157+
default:
158+
return "", &errortypes.BadServerResponse{
159+
Message: fmt.Sprintf("Unsupported mtype %d for bid %s", bid.MType, bid.ID),
160+
}
161+
}
162+
}

0 commit comments

Comments
 (0)