@@ -11,7 +11,8 @@ import (
11
11
"github.com/prebid/prebid-server/config"
12
12
)
13
13
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` )
15
16
16
17
// NewBiddersEndpoint builds a handler for the /info/bidders endpoint.
17
18
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
20
21
glog .Fatalf ("error creating /info/bidders endpoint all bidders response: %v" , err )
21
22
}
22
23
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
+
23
29
responseEnabledOnly , err := prepareBiddersResponseEnabledOnly (bidders , aliases )
24
30
if err != nil {
25
31
glog .Fatalf ("error creating /info/bidders endpoint enabled only response: %v" , err )
26
32
}
27
33
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
+
28
39
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
40
44
}
41
45
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
44
56
}
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
45
70
}
71
+
72
+ return enabledOnly , baseAdapterOnly , nil
46
73
}
47
74
48
- func readEnabledOnly (r * http.Request ) string {
75
+ func readQueryFlag (r * http.Request , queryParam string ) ( flag , ok bool ) {
49
76
q := r .URL .Query ()
50
77
51
- v , exists := q ["enabledonly" ]
78
+ v , exists := q [queryParam ]
52
79
53
80
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
57
82
}
58
83
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
+ }
60
92
}
61
93
62
94
func prepareBiddersResponseAll (bidders config.BidderInfos , aliases map [string ]string ) ([]byte , error ) {
@@ -71,7 +103,19 @@ func prepareBiddersResponseAll(bidders config.BidderInfos, aliases map[string]st
71
103
}
72
104
73
105
sort .Strings (bidderNames )
106
+ return json .Marshal (bidderNames )
107
+ }
74
108
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 )
75
119
return json .Marshal (bidderNames )
76
120
}
77
121
@@ -94,3 +138,32 @@ func prepareBiddersResponseEnabledOnly(bidders config.BidderInfos, aliases map[s
94
138
95
139
return json .Marshal (bidderNames )
96
140
}
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