Skip to content

Commit 852ce3e

Browse files
authored
Fix ext.prebid.analytics flag to be tolerant for invalid input (#1283)
1 parent 2147e59 commit 852ce3e

File tree

6 files changed

+42
-16
lines changed

6 files changed

+42
-16
lines changed

src/main/java/org/prebid/server/analytics/AnalyticsReporterDelegator.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,8 @@ private void logUnknownAdapters(AuctionEvent auctionEvent) {
114114
final BidRequest bidRequest = auctionEvent.getAuctionContext().getBidRequest();
115115
final ExtRequest extRequest = bidRequest.getExt();
116116
final ExtRequestPrebid extPrebid = extRequest != null ? extRequest.getPrebid() : null;
117-
final ObjectNode analytics = extPrebid != null ? extPrebid.getAnalytics() : null;
118-
final Iterator<String> analyticsFieldNames = analytics != null && !analytics.isEmpty()
119-
? analytics.fieldNames() : null;
117+
final JsonNode analytics = extPrebid != null ? extPrebid.getAnalytics() : null;
118+
final Iterator<String> analyticsFieldNames = isNotEmptyObjectNode(analytics) ? analytics.fieldNames() : null;
120119

121120
if (analyticsFieldNames != null) {
122121
final List<String> unknownAdapterNames = StreamUtil.asStream(analyticsFieldNames)
@@ -132,6 +131,10 @@ private void logUnknownAdapters(AuctionEvent auctionEvent) {
132131
}
133132
}
134133

134+
private static boolean isNotEmptyObjectNode(JsonNode analytics) {
135+
return analytics != null && analytics.isObject() && !analytics.isEmpty();
136+
}
137+
135138
private static <T> T updateEvent(T event, String adapter) {
136139
if (!ADAPTERS_PERMITTED_FOR_FULL_DATA.contains(adapter) && event instanceof AuctionEvent) {
137140
final AuctionEvent auctionEvent = (AuctionEvent) event;
@@ -154,14 +157,14 @@ private static AuctionContext updateAuctionContextAdapter(AuctionContext context
154157
private static BidRequest updateBidRequest(BidRequest bidRequest, String adapterName) {
155158
final ExtRequest requestExt = bidRequest.getExt();
156159
final ExtRequestPrebid extPrebid = requestExt != null ? requestExt.getPrebid() : null;
157-
final ObjectNode analytics = extPrebid != null ? extPrebid.getAnalytics() : null;
160+
final JsonNode analytics = extPrebid != null ? extPrebid.getAnalytics() : null;
158161
ObjectNode preparedAnalytics = null;
159-
if (analytics != null && !analytics.isEmpty()) {
160-
preparedAnalytics = prepareAnalytics(analytics, adapterName);
162+
if (isNotEmptyObjectNode(analytics)) {
163+
preparedAnalytics = prepareAnalytics((ObjectNode) analytics, adapterName);
161164
}
162-
final ExtRequest updatedExtRequest = preparedAnalytics != null ? ExtRequest.of(extPrebid.toBuilder()
163-
.analytics(preparedAnalytics)
164-
.build()) : null;
165+
final ExtRequest updatedExtRequest = preparedAnalytics != null
166+
? ExtRequest.of(extPrebid.toBuilder().analytics(preparedAnalytics).build())
167+
: null;
165168

166169
if (updatedExtRequest != null) {
167170
updatedExtRequest.addProperties(requestExt.getProperties());

src/main/java/org/prebid/server/bidder/beachfront/BeachfrontBidder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ private List<BeachfrontResponseSlot> makeBeachfrontResponseSlots(String response
421421
return mapper.mapper().readValue(
422422
responseBody,
423423
mapper.mapper().getTypeFactory().constructCollectionType(List.class, BeachfrontResponseSlot.class));
424-
} catch (IOException ex) {
424+
} catch (IOException e) {
425425
throw new PreBidException("server response failed to unmarshal "
426426
+ "as valid rtb. Run with request.debug = 1 for more info");
427427
}

src/main/java/org/prebid/server/handler/CookieSyncHandler.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,8 @@ private void handleCookieSyncContextResult(AsyncResult<CookieSyncContext> cookie
215215
final TcfContext tcfContext = cookieSyncContext.getPrivacyContext().getTcfContext();
216216
try {
217217
validateCookieSyncContext(cookieSyncContext);
218-
} catch (InvalidRequestException | UnauthorizedUidsException ex) {
219-
handleErrors(ex, routingContext, tcfContext);
218+
} catch (InvalidRequestException | UnauthorizedUidsException e) {
219+
handleErrors(e, routingContext, tcfContext);
220220
return;
221221
}
222222

@@ -648,7 +648,6 @@ private void handleErrors(Throwable error, RoutingContext routingContext, TcfCon
648648
metrics.updateUserSyncOptoutMetric();
649649
status = HttpResponseStatus.UNAUTHORIZED.code();
650650
body = String.format("Unauthorized: %s", message);
651-
652651
} else {
653652
status = HttpResponseStatus.INTERNAL_SERVER_ERROR.code();
654653
body = String.format("Unexpected setuid processing error: %s", message);

src/main/java/org/prebid/server/handler/SetuidHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@ private void handleSetuidContextResult(AsyncResult<SetuidContext> setuidContextR
142142

143143
try {
144144
validateSetuidContext(setuidContext, bidder);
145-
} catch (InvalidRequestException | UnauthorizedUidsException ex) {
146-
handleErrors(ex, routingContext, tcfContext);
145+
} catch (InvalidRequestException | UnauthorizedUidsException e) {
146+
handleErrors(e, routingContext, tcfContext);
147147
return;
148148
}
149149

src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebid.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.prebid.server.proto.openrtb.ext.request;
22

3+
import com.fasterxml.jackson.databind.JsonNode;
34
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
45
import com.fasterxml.jackson.databind.node.ObjectNode;
56
import lombok.Builder;
@@ -120,5 +121,5 @@ public class ExtRequestPrebid {
120121
/**
121122
* Defines the contract for bidrequest.ext.prebid.analytics
122123
*/
123-
ObjectNode analytics;
124+
JsonNode analytics;
124125
}

src/test/java/org/prebid/server/analytics/AnalyticsReporterDelegatorTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,29 @@ public void shouldPassEventToAllDelegates() {
104104
assertThat(captureEvent(secondReporter)).isSameAs(EVENT);
105105
}
106106

107+
@Test
108+
public void shouldTolerateInvalidExtPrebidAnalyticsNode() {
109+
// given
110+
final TextNode analyticsNode = new TextNode("invalid");
111+
final AuctionEvent givenAuctionEvent = givenAuctionEvent(bidRequestBuilder ->
112+
bidRequestBuilder.ext(ExtRequest.of(ExtRequestPrebid.builder()
113+
.analytics(analyticsNode)
114+
.build())));
115+
116+
// when
117+
target.processEvent(givenAuctionEvent, TcfContext.empty());
118+
119+
// then
120+
verify(vertx, times(2)).runOnContext(any());
121+
assertThat(asList(captureAuctionEvent(firstReporter), captureAuctionEvent(secondReporter)))
122+
.extracting(AuctionEvent::getAuctionContext)
123+
.extracting(AuctionContext::getBidRequest)
124+
.extracting(BidRequest::getExt)
125+
.extracting(ExtRequest::getPrebid)
126+
.extracting(ExtRequestPrebid::getAnalytics)
127+
.containsExactly(analyticsNode, analyticsNode);
128+
}
129+
107130
@Test
108131
public void shouldPassOnlyAdapterRelatedEntriesToAnalyticReporters() {
109132
// given

0 commit comments

Comments
 (0)