-
Notifications
You must be signed in to change notification settings - Fork 719
/
bidmyadz.go
160 lines (129 loc) · 3.7 KB
/
bidmyadz.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package bidmyadz
import (
"encoding/json"
"fmt"
"net/http"
"github.com/prebid/openrtb/v20/openrtb2"
"github.com/prebid/prebid-server/v2/adapters"
"github.com/prebid/prebid-server/v2/config"
"github.com/prebid/prebid-server/v2/errortypes"
"github.com/prebid/prebid-server/v2/openrtb_ext"
)
type adapter struct {
endpoint string
}
type bidExt struct {
MediaType string `json:"mediaType"`
}
func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
bidder := &adapter{
endpoint: config.Endpoint,
}
return bidder, nil
}
func (a *adapter) MakeRequests(
openRTBRequest *openrtb2.BidRequest,
reqInfo *adapters.ExtraRequestInfo,
) (
requestsToBidder []*adapters.RequestData,
errs []error,
) {
var errors []error
if len(openRTBRequest.Imp) > 1 {
errors = append(errors, &errortypes.BadInput{
Message: "Bidder does not support multi impression",
})
}
if openRTBRequest.Device.IP == "" && openRTBRequest.Device.IPv6 == "" {
errors = append(errors, &errortypes.BadInput{
Message: "IP/IPv6 is a required field",
})
}
if openRTBRequest.Device.UA == "" {
errors = append(errors, &errortypes.BadInput{
Message: "User-Agent is a required field",
})
}
if len(errors) != 0 {
return nil, errors
}
reqJSON, err := json.Marshal(openRTBRequest)
if err != nil {
return nil, []error{err}
}
headers := http.Header{}
headers.Add("Content-Type", "application/json;charset=utf-8")
headers.Add("Accept", "application/json")
headers.Add("X-Openrtb-Version", "2.5")
return []*adapters.RequestData{{
Method: http.MethodPost,
Body: reqJSON,
Uri: a.endpoint,
Headers: headers,
ImpIDs: openrtb_ext.GetImpIDs(openRTBRequest.Imp),
}}, nil
}
func (a *adapter) MakeBids(
openRTBRequest *openrtb2.BidRequest,
requestToBidder *adapters.RequestData,
bidderRawResponse *adapters.ResponseData,
) (
bidderResponse *adapters.BidderResponse,
errs []error,
) {
if bidderRawResponse.StatusCode == http.StatusNoContent {
return nil, nil
}
if bidderRawResponse.StatusCode == http.StatusBadRequest {
return nil, []error{&errortypes.BadInput{
Message: fmt.Sprintf("Bad Request. %s", string(bidderRawResponse.Body)),
}}
}
if bidderRawResponse.StatusCode == http.StatusServiceUnavailable {
return nil, []error{&errortypes.BadServerResponse{
Message: "Bidder is unavailable. Please contact your account manager.",
}}
}
if bidderRawResponse.StatusCode != http.StatusOK {
return nil, []error{&errortypes.BadServerResponse{
Message: fmt.Sprintf("Something went wrong. Status Code: [ %d ] %s", bidderRawResponse.StatusCode, string(bidderRawResponse.Body)),
}}
}
responseBody := bidderRawResponse.Body
var bidResp openrtb2.BidResponse
if err := json.Unmarshal(responseBody, &bidResp); err != nil {
return nil, []error{err}
}
if len(bidResp.SeatBid) == 0 {
return nil, []error{&errortypes.BadServerResponse{
Message: "Empty SeatBid",
}}
}
bidResponse := adapters.NewBidderResponseWithBidsCapacity(1)
bids := bidResp.SeatBid[0].Bid
if len(bids) == 0 {
return nil, []error{&errortypes.BadServerResponse{
Message: "Empty SeatBid.Bids",
}}
}
bid := bids[0]
var bidExt bidExt
var bidType openrtb_ext.BidType
if err := json.Unmarshal(bid.Ext, &bidExt); err != nil {
return nil, []error{&errortypes.BadServerResponse{
Message: fmt.Sprintf("BidExt parsing error. %s", err.Error()),
}}
}
bidType, err := getBidType(bidExt)
if err != nil {
return nil, []error{err}
}
bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{
Bid: &bid,
BidType: bidType,
})
return bidResponse, nil
}
func getBidType(ext bidExt) (openrtb_ext.BidType, error) {
return openrtb_ext.ParseBidType(ext.MediaType)
}