3030import org .prebid .server .proto .openrtb .ext .response .ExtBidPrebid ;
3131import org .prebid .server .util .BidderUtil ;
3232import org .prebid .server .util .HttpUtil ;
33+ import org .apache .http .client .utils .URIBuilder ;
3334
3435import java .net .URI ;
3536import java .net .URISyntaxException ;
4344public class SparteoBidder implements Bidder <BidRequest > {
4445
4546 private static final String NETWORK_ID_MACRO = "{{NetworkId}}" ;
46- private static final String SITE_DOMAIN_QUERY_MACRO = "{{SiteDomainQuery}}" ;
47- private static final String APP_DOMAIN_QUERY_MACRO = "{{AppDomainQuery}}" ;
48- private static final String BUNDLE_QUERY_MACRO = "{{BundleQuery}}" ;
4947 private static final String UNKNOWN_VALUE = "unknown" ;
5048
5149 private static final TypeReference <ExtPrebid <?, ExtImpSparteo >> TYPE_REFERENCE =
@@ -83,18 +81,14 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request
8381 return Result .withErrors (errors );
8482 }
8583
86- final BidRequest .BidRequestBuilder builder = request .toBuilder ().imp (modifiedImps );
87-
8884 final Site site = request .getSite ();
8985 final App app = request .getApp ();
9086
91- if (site != null ) {
92- builder .site (modifySite (site , networkId , mapper ));
93- } else if (app != null ) {
94- builder .app (modifyApp (app , networkId , mapper ));
95- }
96-
97- final BidRequest outgoingRequest = builder .build ();
87+ final BidRequest outgoingRequest = request .toBuilder ()
88+ .imp (modifiedImps )
89+ .site (modifySite (site , networkId ))
90+ .app (modifyApp (app , networkId ))
91+ .build ();
9892
9993 final String finalEndpointUrl = replaceMacros (site , app , networkId , errors );
10094 final HttpRequest <BidRequest > call = BidderUtil .defaultRequest (outgoingRequest , finalEndpointUrl , mapper );
@@ -118,7 +112,7 @@ private ObjectNode modifyImpExt(Imp imp) {
118112 return modifiedImpExt ;
119113 }
120114
121- private Site modifySite (Site site , String networkId , JacksonMapper mapper ) {
115+ private Site modifySite (Site site , String networkId ) {
122116 if (site == null ) {
123117 return site ;
124118 }
@@ -127,26 +121,12 @@ private Site modifySite(Site site, String networkId, JacksonMapper mapper) {
127121 ? site .getPublisher ()
128122 : Publisher .builder ().build ();
129123
130- final ExtPublisher originalExt = originalPublisher .getExt ();
131- final ExtPublisher modifiedExt = originalExt != null
132- ? ExtPublisher .of (originalExt .getPrebid ())
133- : ExtPublisher .empty ();
134-
135- if (originalExt != null ) {
136- mapper .fillExtension (modifiedExt , originalExt );
137- }
138-
139- final ObjectNode paramsNode = ensureParamsNode (modifiedExt );
140- paramsNode .put ("networkId" , networkId );
141-
142- final Publisher modifiedPublisher = originalPublisher .toBuilder ()
143- .ext (modifiedExt )
144- .build ();
124+ final Publisher modifiedPublisher = modifiedPublisher (originalPublisher , networkId );
145125
146126 return site .toBuilder ().publisher (modifiedPublisher ).build ();
147127 }
148128
149- private App modifyApp (App app , String networkId , JacksonMapper mapper ) {
129+ private App modifyApp (App app , String networkId ) {
150130 if (app == null ) {
151131 return app ;
152132 }
@@ -155,23 +135,23 @@ private App modifyApp(App app, String networkId, JacksonMapper mapper) {
155135 ? app .getPublisher ()
156136 : Publisher .builder ().build ();
157137
158- final ExtPublisher originalExt = originalPublisher .getExt ();
159- final ExtPublisher modifiedExt = originalExt != null
160- ? ExtPublisher .of (originalExt .getPrebid ())
161- : ExtPublisher .empty ();
138+ final Publisher modifiedPublisher = modifiedPublisher (originalPublisher , networkId );
162139
163- if (originalExt != null ) {
164- mapper .fillExtension (modifiedExt , originalExt );
165- }
140+ return app .toBuilder ().publisher (modifiedPublisher ).build ();
141+ }
142+
143+ private Publisher modifiedPublisher (Publisher originalPublisher , String networkId ) {
144+ final ExtPublisher originalExt = originalPublisher .getExt ();
145+ final ExtPublisher modifiedExt = originalExt == null
146+ ? ExtPublisher .empty ()
147+ : mapper .mapper ().convertValue (originalExt , ExtPublisher .class );
166148
167149 final ObjectNode paramsNode = ensureParamsNode (modifiedExt );
168150 paramsNode .put ("networkId" , networkId );
169151
170- final Publisher modifiedPublisher = originalPublisher .toBuilder ()
152+ return originalPublisher .toBuilder ()
171153 .ext (modifiedExt )
172154 .build ();
173-
174- return app .toBuilder ().publisher (modifiedPublisher ).build ();
175155 }
176156
177157 private ObjectNode ensureParamsNode (ExtPublisher extPublisher ) {
@@ -196,14 +176,44 @@ private String replaceMacros(Site site, App app, String networkId, List<BidderEr
196176 }
197177 }
198178
199- if (UNKNOWN_VALUE .equals (bundle )) {
179+ if (app != null && UNKNOWN_VALUE .equals (bundle )) {
200180 errors .add (BidderError .badInput (
201181 "Bundle not found. Missing the app.bundle field." ));
202182 }
203183 return resolveEndpoint (siteDomain , appDomain , networkId , bundle );
204184 }
205185
206- private static String normalizeHostname (String host ) {
186+ private String resolveSiteDomain (Site site ) {
187+ return Optional .ofNullable (site )
188+ .map (s -> {
189+ final String domain = normalizeHostname (s .getDomain ());
190+ return StringUtils .isNotEmpty (domain ) ? domain : normalizeHostname (s .getPage ());
191+ })
192+ .filter (StringUtils ::isNotEmpty )
193+ .orElse (site != null ? UNKNOWN_VALUE : null );
194+ }
195+
196+ private String resolveAppDomain (App app ) {
197+ return Optional .ofNullable (app )
198+ .map (App ::getDomain )
199+ .map (SparteoBidder ::normalizeHostname )
200+ .filter (StringUtils ::isNotEmpty )
201+ .orElse (app != null ? UNKNOWN_VALUE : null );
202+ }
203+
204+ private String resolveBundle (App app ) {
205+ if (app == null ) {
206+ return null ;
207+ }
208+
209+ return Optional .ofNullable (app .getBundle ())
210+ .filter (rawBundle -> !rawBundle .isBlank ())
211+ .map (String ::trim )
212+ .filter (bundle -> !"null" .equalsIgnoreCase (bundle ))
213+ .orElse (UNKNOWN_VALUE );
214+ }
215+
216+ public static String normalizeHostname (String host ) {
207217 String h = StringUtils .trimToEmpty (host );
208218 if (h .isEmpty ()) {
209219 return "" ;
@@ -232,69 +242,24 @@ private static String normalizeHostname(String host) {
232242 return "null" .equals (h ) ? "" : h ;
233243 }
234244
235- private String resolveSiteDomain (Site site ) {
236- if (site != null ) {
237- final String siteDomain = normalizeHostname (site .getDomain ());
238- if (siteDomain != null && !siteDomain .isEmpty ()) {
239- return siteDomain ;
240- } else {
241- final String fromPage = normalizeHostname (site .getPage ());
242- if (fromPage != null && !fromPage .isEmpty ()) {
243- return fromPage ;
244- }
245- }
246- return UNKNOWN_VALUE ;
247- }
248-
249- return null ;
250- }
245+ private String resolveEndpoint (String siteDomain , String appDomain , String networkId , String bundle ) {
246+ final String baseUrl = endpointUrl .replace (NETWORK_ID_MACRO , StringUtils .defaultString (networkId ));
251247
252- private String resolveAppDomain (App app ) {
253- if (app != null ) {
254- final String appDomain = normalizeHostname (app .getDomain ());
255- if (appDomain != null && !appDomain .isEmpty ()) {
256- return appDomain ;
248+ try {
249+ final URIBuilder uriBuilder = new URIBuilder (baseUrl );
250+ if (StringUtils .isNotBlank (siteDomain )) {
251+ uriBuilder .addParameter ("site_domain" , siteDomain );
257252 }
258- return UNKNOWN_VALUE ;
259- }
260-
261- return null ;
262- }
263-
264- private String resolveBundle (App app ) {
265- if (app == null ) {
266- return null ;
267- }
268-
269- final String rawBundle = app .getBundle ();
270- if (rawBundle == null || rawBundle .isBlank ()) {
271- return UNKNOWN_VALUE ;
272- }
273-
274- final String bundle = rawBundle .trim ();
275- if ("null" .equalsIgnoreCase (bundle )) {
276- return UNKNOWN_VALUE ;
253+ if (StringUtils .isNotBlank (appDomain )) {
254+ uriBuilder .addParameter ("app_domain" , appDomain );
255+ }
256+ if (StringUtils .isNotBlank (bundle )) {
257+ uriBuilder .addParameter ("bundle" , bundle );
258+ }
259+ return uriBuilder .build ().toString ();
260+ } catch (URISyntaxException e ) {
261+ throw new PreBidException ("Failed to build endpoint URL" , e );
277262 }
278-
279- return bundle ;
280- }
281-
282- private String resolveEndpoint (String siteDomain , String appDomain , String networkId , String bundle ) {
283- final String siteDomainQuery = StringUtils .isNotBlank (siteDomain )
284- ? "&site_domain=" + HttpUtil .encodeUrl (siteDomain )
285- : "" ;
286- final String appDomainQuery = StringUtils .isNotBlank (appDomain )
287- ? "&app_domain=" + HttpUtil .encodeUrl (appDomain )
288- : "" ;
289- final String bundleQuery = StringUtils .isNotBlank (bundle )
290- ? "&bundle=" + HttpUtil .encodeUrl (bundle )
291- : "" ;
292-
293- return endpointUrl
294- .replace (NETWORK_ID_MACRO , StringUtils .defaultString (networkId ))
295- .replace (BUNDLE_QUERY_MACRO , bundleQuery )
296- .replace (SITE_DOMAIN_QUERY_MACRO , siteDomainQuery )
297- .replace (APP_DOMAIN_QUERY_MACRO , appDomainQuery );
298263 }
299264
300265 @ Override
0 commit comments