Skip to content

Commit f54d374

Browse files
authored
Bidder Info Endpoint: Base Adapter Only Filter (prebid#3088)
* Base Adapters Only * Fix Tpyo
1 parent 8cc0b09 commit f54d374

File tree

2 files changed

+433
-128
lines changed

2 files changed

+433
-128
lines changed

endpoints/info/bidders.go

Lines changed: 93 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import (
1111
"github.com/prebid/prebid-server/config"
1212
)
1313

14-
var invalidEnabledOnly = []byte(`Invalid value for 'enabledonly' query param, must be of boolean type`)
14+
var invalidEnabledOnlyMsg = []byte(`Invalid value for 'enabledonly' query param, must be of boolean type`)
15+
var invalidBaseAdaptersOnlyMsg = []byte(`Invalid value for 'baseadaptersonly' query param, must be of boolean type`)
1516

1617
// NewBiddersEndpoint builds a handler for the /info/bidders endpoint.
1718
func NewBiddersEndpoint(bidders config.BidderInfos, aliases map[string]string) httprouter.Handle {
@@ -20,43 +21,74 @@ func NewBiddersEndpoint(bidders config.BidderInfos, aliases map[string]string) h
2021
glog.Fatalf("error creating /info/bidders endpoint all bidders response: %v", err)
2122
}
2223

24+
responseAllBaseOnly, err := prepareBiddersResponseAllBaseOnly(bidders)
25+
if err != nil {
26+
glog.Fatalf("error creating /info/bidders endpoint all bidders (base adapters only) response: %v", err)
27+
}
28+
2329
responseEnabledOnly, err := prepareBiddersResponseEnabledOnly(bidders, aliases)
2430
if err != nil {
2531
glog.Fatalf("error creating /info/bidders endpoint enabled only response: %v", err)
2632
}
2733

34+
responseEnabledOnlyBaseOnly, err := prepareBiddersResponseEnabledOnlyBaseOnly(bidders)
35+
if err != nil {
36+
glog.Fatalf("error creating /info/bidders endpoint enabled only (base adapters only) response: %v", err)
37+
}
38+
2839
return func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
29-
var writeErr error
30-
switch readEnabledOnly(r) {
31-
case "true":
32-
w.Header().Set("Content-Type", "application/json")
33-
_, writeErr = w.Write(responseEnabledOnly)
34-
case "false":
35-
w.Header().Set("Content-Type", "application/json")
36-
_, writeErr = w.Write(responseAll)
37-
default:
38-
w.WriteHeader(http.StatusBadRequest)
39-
_, writeErr = w.Write(invalidEnabledOnly)
40+
enabledOnly, baseAdaptersOnly, errMsg := readQueryFlags(r)
41+
if errMsg != nil {
42+
writeBadRequest(w, errMsg)
43+
return
4044
}
4145

42-
if writeErr != nil {
43-
glog.Errorf("error writing response to /info/bidders: %v", writeErr)
46+
var response []byte
47+
switch {
48+
case !enabledOnly && !baseAdaptersOnly:
49+
response = responseAll
50+
case !enabledOnly && baseAdaptersOnly:
51+
response = responseAllBaseOnly
52+
case enabledOnly && !baseAdaptersOnly:
53+
response = responseEnabledOnly
54+
case enabledOnly && baseAdaptersOnly:
55+
response = responseEnabledOnlyBaseOnly
4456
}
57+
writeResponse(w, response)
58+
}
59+
}
60+
61+
func readQueryFlags(r *http.Request) (enabledOnly, baseAdaptersOnly bool, errMsg []byte) {
62+
enabledOnly, ok := readQueryFlag(r, "enabledonly")
63+
if !ok {
64+
return false, false, invalidEnabledOnlyMsg
65+
}
66+
67+
baseAdapterOnly, ok := readQueryFlag(r, "baseadaptersonly")
68+
if !ok {
69+
return false, false, invalidBaseAdaptersOnlyMsg
4570
}
71+
72+
return enabledOnly, baseAdapterOnly, nil
4673
}
4774

48-
func readEnabledOnly(r *http.Request) string {
75+
func readQueryFlag(r *http.Request, queryParam string) (flag, ok bool) {
4976
q := r.URL.Query()
5077

51-
v, exists := q["enabledonly"]
78+
v, exists := q[queryParam]
5279

5380
if !exists || len(v) == 0 {
54-
// if the enabledOnly query parameter is not specified, default to false to match
55-
// previous behavior of returning all adapters regardless of their enabled status.
56-
return "false"
81+
return false, true
5782
}
5883

59-
return strings.ToLower(v[0])
84+
switch strings.ToLower(v[0]) {
85+
case "true":
86+
return true, true
87+
case "false":
88+
return false, true
89+
default:
90+
return false, false
91+
}
6092
}
6193

6294
func prepareBiddersResponseAll(bidders config.BidderInfos, aliases map[string]string) ([]byte, error) {
@@ -71,7 +103,19 @@ func prepareBiddersResponseAll(bidders config.BidderInfos, aliases map[string]st
71103
}
72104

73105
sort.Strings(bidderNames)
106+
return json.Marshal(bidderNames)
107+
}
74108

109+
func prepareBiddersResponseAllBaseOnly(bidders config.BidderInfos) ([]byte, error) {
110+
bidderNames := make([]string, 0, len(bidders))
111+
112+
for name, info := range bidders {
113+
if len(info.AliasOf) == 0 {
114+
bidderNames = append(bidderNames, name)
115+
}
116+
}
117+
118+
sort.Strings(bidderNames)
75119
return json.Marshal(bidderNames)
76120
}
77121

@@ -94,3 +138,32 @@ func prepareBiddersResponseEnabledOnly(bidders config.BidderInfos, aliases map[s
94138

95139
return json.Marshal(bidderNames)
96140
}
141+
142+
func prepareBiddersResponseEnabledOnlyBaseOnly(bidders config.BidderInfos) ([]byte, error) {
143+
bidderNames := make([]string, 0, len(bidders))
144+
145+
for name, info := range bidders {
146+
if info.IsEnabled() && len(info.AliasOf) == 0 {
147+
bidderNames = append(bidderNames, name)
148+
}
149+
}
150+
151+
sort.Strings(bidderNames)
152+
return json.Marshal(bidderNames)
153+
}
154+
155+
func writeBadRequest(w http.ResponseWriter, data []byte) {
156+
w.WriteHeader(http.StatusBadRequest)
157+
writeWithErrorHandling(w, data)
158+
}
159+
160+
func writeResponse(w http.ResponseWriter, data []byte) {
161+
w.Header().Set("Content-Type", "application/json")
162+
writeWithErrorHandling(w, data)
163+
}
164+
165+
func writeWithErrorHandling(w http.ResponseWriter, data []byte) {
166+
if _, err := w.Write(data); err != nil {
167+
glog.Errorf("error writing response to /info/bidders: %v", err)
168+
}
169+
}

0 commit comments

Comments
 (0)