createRequest(BidRequest bidRequest, Imp imp, Ex
}
private String createUri(ExtImpVideobyte extImpVideobyte) {
- final URIBuilder uriBuilder;
- try {
- uriBuilder = new URIBuilder(endpointUrl);
- } catch (URISyntaxException e) {
- throw new PreBidException(e.getMessage());
- }
-
- uriBuilder.addParameter("source", "pbs")
- .addParameter("pid", extImpVideobyte.getPublisherId());
+ final Variables variables = endpointTemplate.newVariables();
+ variables.set("pid", extImpVideobyte.getPublisherId());
- addUriParameterIfNotEmpty(uriBuilder, "placementId", extImpVideobyte.getPlacementId());
- addUriParameterIfNotEmpty(uriBuilder, "nid", extImpVideobyte.getNetworkId());
+ addParameterIfNotEmpty(variables, "placementId", extImpVideobyte.getPlacementId());
+ addParameterIfNotEmpty(variables, "nid", extImpVideobyte.getNetworkId());
- return uriBuilder.toString();
+ return endpointTemplate.expandToString(variables);
}
- private static void addUriParameterIfNotEmpty(URIBuilder uriBuilder, String parameter, String value) {
+ private static void addParameterIfNotEmpty(Variables variables, String parameter, String value) {
if (StringUtils.isNotEmpty(value)) {
- uriBuilder.addParameter(parameter, value);
+ variables.set(parameter, value);
}
}
diff --git a/src/main/java/org/prebid/server/cache/CoreCacheService.java b/src/main/java/org/prebid/server/cache/CoreCacheService.java
index 6b028eb9ae8..e1e146a9a03 100644
--- a/src/main/java/org/prebid/server/cache/CoreCacheService.java
+++ b/src/main/java/org/prebid/server/cache/CoreCacheService.java
@@ -9,7 +9,6 @@
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
-import org.apache.http.client.utils.URIBuilder;
import org.prebid.server.auction.model.AuctionContext;
import org.prebid.server.auction.model.BidInfo;
import org.prebid.server.auction.model.CachedDebugLog;
diff --git a/src/main/java/org/prebid/server/floors/PriceFloorFetcher.java b/src/main/java/org/prebid/server/floors/PriceFloorFetcher.java
index b1cc8c257b2..4db7d31d0e7 100644
--- a/src/main/java/org/prebid/server/floors/PriceFloorFetcher.java
+++ b/src/main/java/org/prebid/server/floors/PriceFloorFetcher.java
@@ -2,6 +2,7 @@
import com.github.benmanes.caffeine.cache.Caffeine;
import io.netty.channel.ConnectTimeoutException;
+import io.netty.handler.codec.http.HttpResponseStatus;
import io.vertx.core.Future;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpHeaders;
@@ -11,7 +12,6 @@
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.http.HttpStatus;
import org.prebid.server.exception.PreBidException;
import org.prebid.server.execution.timeout.TimeoutFactory;
import org.prebid.server.floors.model.PriceFloorData;
@@ -165,7 +165,7 @@ private ResponseCacheInfo parseFloorResponse(HttpClientResponse httpClientRespon
AccountPriceFloorsFetchConfig fetchConfig) {
final int statusCode = httpClientResponse.getStatusCode();
- if (statusCode != HttpStatus.SC_OK) {
+ if (statusCode != HttpResponseStatus.OK.code()) {
throw new PreBidException("Failed to request, provider respond with status %s".formatted(statusCode));
}
final String body = httpClientResponse.getBody();
diff --git a/src/main/java/org/prebid/server/handler/OptoutHandler.java b/src/main/java/org/prebid/server/handler/OptoutHandler.java
index 5d9885c70ec..6011971649b 100644
--- a/src/main/java/org/prebid/server/handler/OptoutHandler.java
+++ b/src/main/java/org/prebid/server/handler/OptoutHandler.java
@@ -17,8 +17,6 @@
import org.prebid.server.vertx.verticles.server.HttpEndpoint;
import org.prebid.server.vertx.verticles.server.application.ApplicationResource;
-import java.net.MalformedURLException;
-import java.net.URL;
import java.util.List;
import java.util.Objects;
@@ -121,9 +119,8 @@ private static String getRequestParam(RoutingContext routingContext, String para
public static String getOptoutRedirectUrl(String externalUrl) {
try {
- final URL url = new URL(externalUrl);
- return new URL(url.toExternalForm() + "/static/optout.html").toString();
- } catch (MalformedURLException e) {
+ return HttpUtil.validateUrl(externalUrl + "/static/optout.html");
+ } catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Could not get optout redirect url", e);
}
}
diff --git a/src/main/java/org/prebid/server/settings/HttpApplicationSettings.java b/src/main/java/org/prebid/server/settings/HttpApplicationSettings.java
index c0d899508c4..a74d9b2b35a 100644
--- a/src/main/java/org/prebid/server/settings/HttpApplicationSettings.java
+++ b/src/main/java/org/prebid/server/settings/HttpApplicationSettings.java
@@ -8,7 +8,6 @@
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
-import org.apache.http.client.utils.URIBuilder;
import org.prebid.server.exception.PreBidException;
import org.prebid.server.execution.timeout.Timeout;
import org.prebid.server.json.DecodeException;
@@ -95,10 +94,10 @@ public HttpApplicationSettings(boolean isRfc3986Compatible,
JacksonMapper mapper) {
this.isRfc3986Compatible = isRfc3986Compatible;
- this.endpoint = HttpUtil.validateUrlSyntax(Objects.requireNonNull(endpoint));
- this.ampEndpoint = HttpUtil.validateUrlSyntax(Objects.requireNonNull(ampEndpoint));
- this.videoEndpoint = HttpUtil.validateUrlSyntax(Objects.requireNonNull(videoEndpoint));
- this.categoryEndpoint = HttpUtil.validateUrlSyntax(Objects.requireNonNull(categoryEndpoint));
+ this.endpoint = HttpUtil.validateUrl(Objects.requireNonNull(endpoint));
+ this.ampEndpoint = HttpUtil.validateUrl(Objects.requireNonNull(ampEndpoint));
+ this.videoEndpoint = HttpUtil.validateUrl(Objects.requireNonNull(videoEndpoint));
+ this.categoryEndpoint = HttpUtil.validateUrl(Objects.requireNonNull(categoryEndpoint));
this.httpClient = Objects.requireNonNull(httpClient);
this.mapper = Objects.requireNonNull(mapper);
}
diff --git a/src/main/java/org/prebid/server/util/HttpUtil.java b/src/main/java/org/prebid/server/util/HttpUtil.java
index e08a276c6fa..617dabbd3b3 100644
--- a/src/main/java/org/prebid/server/util/HttpUtil.java
+++ b/src/main/java/org/prebid/server/util/HttpUtil.java
@@ -8,7 +8,6 @@
import io.vertx.core.http.HttpServerResponse;
import io.vertx.ext.web.RoutingContext;
import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.validator.routines.UrlValidator;
import org.prebid.server.log.ConditionalLogger;
import org.prebid.server.log.Logger;
import org.prebid.server.log.LoggerFactory;
@@ -16,6 +15,8 @@
import org.prebid.server.model.HttpRequestContext;
import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
@@ -28,9 +29,6 @@
import java.util.function.Consumer;
import java.util.stream.Collectors;
-/**
- * This class consists of {@code static} utility methods for operating HTTP requests.
- */
public final class HttpUtil {
private static final Logger logger = LoggerFactory.getLogger(HttpUtil.class);
@@ -85,52 +83,30 @@ public final class HttpUtil {
public static final String MACROS_OPEN = "{{";
public static final String MACROS_CLOSE = "}}";
- private static final UrlValidator URL_VALIDAROR = UrlValidator.getInstance();
-
private HttpUtil() {
}
- /**
- * Checks the input string for using as URL.
- */
- @Deprecated
- public static String validateUrl(String url) {
- if (containsMacrosses(url)) {
- return url;
- }
-
+ public static URL parseUrl(String url) {
try {
- return new URL(url).toString();
- } catch (MalformedURLException e) {
+ return new URI(url).toURL();
+ } catch (URISyntaxException | MalformedURLException e) {
throw new IllegalArgumentException("URL supplied is not valid: " + url, e);
}
}
- public static String validateUrlSyntax(String url) {
- if (containsMacrosses(url) || URL_VALIDAROR.isValid(url)) {
- return url;
- }
-
- throw new IllegalArgumentException("URL supplied is not valid: " + url);
+ public static String validateUrl(String url) {
+ // TODO: check new macro
+ return !containsMacrosses(url) ? parseUrl(url).toString() : url;
}
- // TODO: We need our own way to work with url macrosses
private static boolean containsMacrosses(String url) {
return StringUtils.contains(url, MACROS_OPEN) && StringUtils.contains(url, MACROS_CLOSE);
}
- /**
- * Returns encoded URL for the given value.
- *
- * The result can be safety used as the query string.
- */
public static String encodeUrl(String value) {
return URLEncoder.encode(value, StandardCharsets.UTF_8);
}
- /**
- * Returns decoded value if supplied is not null, otherwise returns null.
- */
public static String decodeUrl(String value) {
if (StringUtils.isBlank(value)) {
return null;
@@ -138,18 +114,12 @@ public static String decodeUrl(String value) {
return URLDecoder.decode(value, StandardCharsets.UTF_8);
}
- /**
- * Creates general headers for request.
- */
public static MultiMap headers() {
return MultiMap.caseInsensitiveMultiMap()
.add(CONTENT_TYPE_HEADER, APPLICATION_JSON_CONTENT_TYPE)
.add(ACCEPT_HEADER, HttpHeaderValues.APPLICATION_JSON);
}
- /**
- * Creates header from name and value, when value is not null or empty string.
- */
public static void addHeaderIfValueIsNotEmpty(MultiMap headers, CharSequence headerName, CharSequence headerValue) {
if (StringUtils.isNotEmpty(headerValue)) {
headers.add(headerName, headerValue);
@@ -160,9 +130,10 @@ public static String getHostFromUrl(String url) {
if (StringUtils.isBlank(url)) {
return null;
}
+
try {
- return new URL(url).getHost();
- } catch (MalformedURLException e) {
+ return parseUrl(url).getHost();
+ } catch (IllegalArgumentException e) {
return null;
}
}
diff --git a/src/main/java/org/prebid/server/util/uritemplate/DeclaredParamsUriTemplate.java b/src/main/java/org/prebid/server/util/uritemplate/DeclaredParamsUriTemplate.java
new file mode 100644
index 00000000000..1d2b8ea15f1
--- /dev/null
+++ b/src/main/java/org/prebid/server/util/uritemplate/DeclaredParamsUriTemplate.java
@@ -0,0 +1,36 @@
+package org.prebid.server.util.uritemplate;
+
+import io.vertx.uritemplate.ExpandOptions;
+import io.vertx.uritemplate.Variables;
+
+class DeclaredParamsUriTemplate implements UriTemplate {
+
+ private static final ExpandOptions DEFAULT_OPTIONS = new ExpandOptions().setAllowVariableMiss(true);
+
+ private final io.vertx.uritemplate.UriTemplate internal;
+ private final ExpandOptions defaultOptions;
+
+ DeclaredParamsUriTemplate(String uri) {
+ this(uri, DEFAULT_OPTIONS);
+ }
+
+ DeclaredParamsUriTemplate(String uri, ExpandOptions defaultOptions) {
+ this.internal = io.vertx.uritemplate.UriTemplate.of(uri);
+ this.defaultOptions = defaultOptions;
+ }
+
+ @Override
+ public Variables newVariables() {
+ return Variables.variables();
+ }
+
+ @Override
+ public String expandToString(Variables variables) {
+ return expandToString(variables, defaultOptions);
+ }
+
+ @Override
+ public String expandToString(Variables variables, ExpandOptions expandOptions) {
+ return internal.expandToString(variables, expandOptions);
+ }
+}
diff --git a/src/main/java/org/prebid/server/util/uritemplate/DynamicParamsUriTemplate.java b/src/main/java/org/prebid/server/util/uritemplate/DynamicParamsUriTemplate.java
new file mode 100644
index 00000000000..b0e1f684253
--- /dev/null
+++ b/src/main/java/org/prebid/server/util/uritemplate/DynamicParamsUriTemplate.java
@@ -0,0 +1,67 @@
+package org.prebid.server.util.uritemplate;
+
+import io.vertx.core.json.JsonObject;
+import io.vertx.uritemplate.ExpandOptions;
+import io.vertx.uritemplate.Variables;
+import io.vertx.uritemplate.impl.VariablesImpl;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class DynamicParamsUriTemplate extends DeclaredParamsUriTemplate implements UriTemplate {
+
+ private static final ExpandOptions DEFAULT_OPTIONS = new ExpandOptions().setAllowVariableMiss(false);
+ private static final String DYNAMIC_QUERY_PARAM = "{?DYNAMIC_QUERY_PARAM*}";
+
+
+ DynamicParamsUriTemplate(String uri) {
+ super(uri + DYNAMIC_QUERY_PARAM, DEFAULT_OPTIONS);
+ }
+
+ @Override
+ public Variables newVariables() {
+ return new VariablesWithDynamicQueryParams();
+ }
+
+ private static class VariablesWithDynamicQueryParams extends VariablesImpl {
+
+ private VariablesWithDynamicQueryParams() {
+ init();
+ }
+
+ private void init() {
+ super.set(DYNAMIC_QUERY_PARAM, new HashMap<>());
+ }
+
+ @Override
+ public Variables set(String name, String value) {
+ if (value != null) {
+ getMap(DYNAMIC_QUERY_PARAM).put(name, value);
+ }
+ return this;
+ }
+
+ @Override
+ public Variables set(String name, List value) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Variables set(String name, Map value) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Variables addAll(JsonObject json) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Variables clear() {
+ super.clear();
+ init();
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/org/prebid/server/util/uritemplate/UriTemplate.java b/src/main/java/org/prebid/server/util/uritemplate/UriTemplate.java
new file mode 100644
index 00000000000..914e2978c82
--- /dev/null
+++ b/src/main/java/org/prebid/server/util/uritemplate/UriTemplate.java
@@ -0,0 +1,30 @@
+package org.prebid.server.util.uritemplate;
+
+import io.vertx.uritemplate.Variables;
+
+public interface UriTemplate extends io.vertx.uritemplate.UriTemplate {
+
+ Variables newVariables();
+
+ default String expandToString(String key, String value) {
+ return expandToString(newVariables().set(key, value));
+ }
+
+ default String expandToString(String key1, String value1,
+ String key2, String value2) {
+
+ return expandToString(newVariables()
+ .set(key1, value1)
+ .set(key2, value2));
+ }
+
+ default String expandToString(String key1, String value1,
+ String key2, String value2,
+ String key3, String value3) {
+
+ return expandToString(newVariables()
+ .set(key1, value1)
+ .set(key2, value2)
+ .set(key3, value3));
+ }
+}
diff --git a/src/main/java/org/prebid/server/util/uritemplate/UriTemplateFactory.java b/src/main/java/org/prebid/server/util/uritemplate/UriTemplateFactory.java
new file mode 100644
index 00000000000..0ace00d79a9
--- /dev/null
+++ b/src/main/java/org/prebid/server/util/uritemplate/UriTemplateFactory.java
@@ -0,0 +1,12 @@
+package org.prebid.server.util.uritemplate;
+
+public interface UriTemplateFactory {
+
+ static UriTemplate declaredParams(String uri) {
+ return new DeclaredParamsUriTemplate(uri);
+ }
+
+ static UriTemplate dynamicParams(String uri) {
+ return new DynamicParamsUriTemplate(uri);
+ }
+}
diff --git a/src/main/resources/bidder-config/appnexus.yaml b/src/main/resources/bidder-config/appnexus.yaml
index 6928936bc5f..f815ccea8be 100644
--- a/src/main/resources/bidder-config/appnexus.yaml
+++ b/src/main/resources/bidder-config/appnexus.yaml
@@ -1,6 +1,6 @@
adapters:
appnexus:
- endpoint: http://ib.adnxs.com/openrtb2
+ endpoint: http://ib.adnxs.com/openrtb2{?member_id}
aliases:
mediafuse:
meta-info:
diff --git a/src/main/resources/bidder-config/bluesea.yaml b/src/main/resources/bidder-config/bluesea.yaml
index 23f6a7a702a..ef336ab244b 100644
--- a/src/main/resources/bidder-config/bluesea.yaml
+++ b/src/main/resources/bidder-config/bluesea.yaml
@@ -1,6 +1,6 @@
adapters:
bluesea:
- endpoint: https://bid.bluevoox.com/rtb/prebid
+ endpoint: https://bid.bluevoox.com/rtb/prebid{?pubid,token}
endpoint-compression: gzip
modifying-vast-xml-allowed: true
meta-info:
diff --git a/src/main/resources/bidder-config/connatix.yaml b/src/main/resources/bidder-config/connatix.yaml
index 63e1aca65c1..1178ae81ee3 100644
--- a/src/main/resources/bidder-config/connatix.yaml
+++ b/src/main/resources/bidder-config/connatix.yaml
@@ -1,6 +1,6 @@
adapters:
connatix:
- endpoint: "https://capi.connatix.com/rtb/ortb"
+ endpoint: "https://capi.connatix.com/rtb/ortb{?dc}"
endpoint-compression: gzip
meta-info:
maintainer-email: "pubsolutions@connatix.com"
diff --git a/src/main/resources/bidder-config/dxkulture.yaml b/src/main/resources/bidder-config/dxkulture.yaml
index 739b2ba00af..4dcc9e833f3 100644
--- a/src/main/resources/bidder-config/dxkulture.yaml
+++ b/src/main/resources/bidder-config/dxkulture.yaml
@@ -1,6 +1,6 @@
adapters:
dxkulture:
- endpoint: https://ads.dxkulture.com/pbs
+ endpoint: https://ads.dxkulture.com/pbs{?publisher_id,placement_id}
meta-info:
maintainer-email: devops@dxkulture.com
app-media-types:
diff --git a/src/main/resources/bidder-config/eplanning.yaml b/src/main/resources/bidder-config/eplanning.yaml
index db89054080a..8811acd68a5 100644
--- a/src/main/resources/bidder-config/eplanning.yaml
+++ b/src/main/resources/bidder-config/eplanning.yaml
@@ -1,6 +1,6 @@
adapters:
eplanning:
- endpoint: http://rtb.e-planning.net/pbs/1
+ endpoint: http://rtb.e-planning.net/pbs/1{/clientId,dfpClientId,requestTarget,sec}{?r,ncb,ur,e,uid,ip,appn,appid,ifa,app,sch}
meta-info:
maintainer-email: producto@e-planning.net
app-media-types:
diff --git a/src/main/resources/bidder-config/nexx360.yaml b/src/main/resources/bidder-config/nexx360.yaml
index 7f3820e24d1..3deaee96d19 100644
--- a/src/main/resources/bidder-config/nexx360.yaml
+++ b/src/main/resources/bidder-config/nexx360.yaml
@@ -1,6 +1,6 @@
adapters:
nexx360:
- endpoint: http://fast.nexx360.io/prebid-server
+ endpoint: http://fast.nexx360.io/prebid-server{?placement,tag_id}
endpoint-compression: gzip
aliases:
1accord: ~
diff --git a/src/main/resources/bidder-config/smartadserver.yaml b/src/main/resources/bidder-config/smartadserver.yaml
index 343bec392de..906e673d963 100644
--- a/src/main/resources/bidder-config/smartadserver.yaml
+++ b/src/main/resources/bidder-config/smartadserver.yaml
@@ -1,7 +1,7 @@
adapters:
smartadserver:
- endpoint: https://ssb-global.smartadserver.com
- secondary-endpoint: https://prebid-global.smartadserver.com
+ endpoint: https://ssb-global.smartadserver.com/api/bid
+ secondary-endpoint: https://prebid-global.smartadserver.com/ortb
endpoint-compression: gzip
aliases:
equativ:
diff --git a/src/main/resources/bidder-config/sparteo.yaml b/src/main/resources/bidder-config/sparteo.yaml
index 5dd9dd19b1d..cd91cf0f196 100644
--- a/src/main/resources/bidder-config/sparteo.yaml
+++ b/src/main/resources/bidder-config/sparteo.yaml
@@ -1,6 +1,6 @@
adapters:
sparteo:
- endpoint: https://bid.sparteo.com/s2s-auction
+ endpoint: https://bid.sparteo.com/s2s-auction{?network_id,site_domain,app_domain,bundle}
meta-info:
maintainer-email: prebid@sparteo.com
app-media-types:
diff --git a/src/main/resources/bidder-config/videobyte.yaml b/src/main/resources/bidder-config/videobyte.yaml
index 9d4223748fa..0691b27a57c 100644
--- a/src/main/resources/bidder-config/videobyte.yaml
+++ b/src/main/resources/bidder-config/videobyte.yaml
@@ -1,6 +1,6 @@
adapters:
videobyte:
- endpoint: https://x.videobyte.com/ortbhb
+ endpoint: https://x.videobyte.com/ortbhb?source=pbs&pid={pid}{&placementId,nid}
meta-info:
maintainer-email: prebid@videobyte.com
app-media-types: