Skip to content

Commit 361605a

Browse files
committed
Fix comments
1 parent 74ac069 commit 361605a

File tree

8 files changed

+205
-336
lines changed

8 files changed

+205
-336
lines changed

src/main/java/org/prebid/server/cookie/UidsCookie.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ public UidsCookie updateUid(String familyName, String uid) {
8686
return new UidsCookie(uids.toBuilder().uids(uidsMap).build(), mapper);
8787
}
8888

89+
public UidsCookie updateUid(String familyName, UidWithExpiry uid) {
90+
final Map<String, UidWithExpiry> uidsMap = new HashMap<>(uids.getUids());
91+
uidsMap.put(familyName, uid);
92+
return new UidsCookie(uids.toBuilder().uids(uidsMap).build(), mapper);
93+
}
94+
8995
/**
9096
* Performs updates of {@link UidsCookie}'s optout flag and returns newly constructed {@link UidsCookie}
9197
* to avoid mutation of the current {@link UidsCookie}.
@@ -102,7 +108,7 @@ public UidsCookie updateOptout(boolean optout) {
102108
/**
103109
* Converts {@link Uids} to JSON string.
104110
*/
105-
String toJson() {
111+
public String toJson() {
106112
return mapper.encodeToString(uids);
107113
}
108114

src/main/java/org/prebid/server/cookie/UidsCookieService.java

+52-40
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,23 @@
66
import io.vertx.ext.web.RoutingContext;
77
import org.apache.commons.lang3.StringUtils;
88
import org.prebid.server.cookie.model.UidWithExpiry;
9-
import org.prebid.server.cookie.model.UidsCookieUpdateResult;
109
import org.prebid.server.cookie.proto.Uids;
1110
import org.prebid.server.json.DecodeException;
1211
import org.prebid.server.json.JacksonMapper;
1312
import org.prebid.server.log.Logger;
1413
import org.prebid.server.log.LoggerFactory;
1514
import org.prebid.server.metric.Metrics;
1615
import org.prebid.server.model.HttpRequestContext;
16+
import org.prebid.server.model.UpdateResult;
1717
import org.prebid.server.util.HttpUtil;
1818

1919
import java.time.Duration;
20+
import java.util.ArrayList;
2021
import java.util.Base64;
2122
import java.util.Collections;
2223
import java.util.HashMap;
2324
import java.util.Iterator;
25+
import java.util.List;
2426
import java.util.Map;
2527
import java.util.Objects;
2628
import java.util.Optional;
@@ -137,17 +139,19 @@ private Uids parseUids(Map<String, String> cookies) {
137139

138140
for (Map.Entry<String, String> cookie : cookies.entrySet()) {
139141
final String cookieKey = cookie.getKey();
140-
if (cookieKey.startsWith(COOKIE_NAME)) {
141-
try {
142-
final Uids parsedUids = mapper.decodeValue(
143-
Buffer.buffer(Base64.getUrlDecoder().decode(cookie.getValue())), Uids.class);
144-
if (parsedUids != null && parsedUids.getUids() != null) {
145-
parsedUids.getUids().forEach((key, value) -> uids.merge(key, value, (newValue, oldValue) ->
146-
newValue.getExpires().compareTo(oldValue.getExpires()) > 0 ? newValue : oldValue));
147-
}
148-
} catch (IllegalArgumentException | DecodeException e) {
149-
logger.debug("Could not decode or parse {} cookie value {}", e, COOKIE_NAME, cookie.getValue());
142+
if (!cookieKey.startsWith(COOKIE_NAME)) {
143+
continue;
144+
}
145+
146+
try {
147+
final Uids parsedUids = mapper.decodeValue(
148+
Buffer.buffer(Base64.getUrlDecoder().decode(cookie.getValue())), Uids.class);
149+
if (parsedUids != null && parsedUids.getUids() != null) {
150+
parsedUids.getUids().forEach((key, value) -> uids.merge(key, value, (newValue, oldValue) ->
151+
newValue.getExpires().compareTo(oldValue.getExpires()) > 0 ? newValue : oldValue));
150152
}
153+
} catch (IllegalArgumentException | DecodeException e) {
154+
logger.debug("Could not decode or parse {} cookie value {}", e, COOKIE_NAME, cookie.getValue());
151155
}
152156
}
153157

@@ -158,7 +162,7 @@ private Uids parseUids(Map<String, String> cookies) {
158162
* Creates a {@link Cookie} with 'uids' as a name and encoded JSON string representing supplied {@link UidsCookie}
159163
* as a value.
160164
*/
161-
public Cookie makeCookie(String cookieName, UidsCookie uidsCookie) {
165+
public Cookie aliveCookie(String cookieName, UidsCookie uidsCookie) {
162166
return Cookie
163167
.cookie(cookieName, Base64.getUrlEncoder().encodeToString(uidsCookie.toJson().getBytes()))
164168
.setPath("/")
@@ -168,11 +172,11 @@ public Cookie makeCookie(String cookieName, UidsCookie uidsCookie) {
168172
.setDomain(hostCookieDomain);
169173
}
170174

171-
public Cookie makeCookie(UidsCookie uidsCookie) {
172-
return makeCookie(COOKIE_NAME, uidsCookie);
175+
public Cookie aliveCookie(UidsCookie uidsCookie) {
176+
return aliveCookie(COOKIE_NAME, uidsCookie);
173177
}
174178

175-
public Cookie removeCookie(String cookieName) {
179+
public Cookie expiredCookie(String cookieName) {
176180
return Cookie
177181
.cookie(cookieName, StringUtils.EMPTY)
178182
.setPath("/")
@@ -245,17 +249,17 @@ private static boolean facebookSentinelOrEmpty(Map.Entry<String, UidWithExpiry>
245249
/***
246250
* Removes expired {@link Uids}, updates {@link UidsCookie} with new uid for family name according to priority
247251
*/
248-
public UidsCookieUpdateResult updateUidsCookie(UidsCookie uidsCookie, String familyName, String uid) {
252+
public UpdateResult<UidsCookie> updateUidsCookie(UidsCookie uidsCookie, String familyName, String uid) {
249253
final UidsCookie initialCookie = removeExpiredUids(uidsCookie);
250254

251255
// At the moment, Facebook calls /setuid with a UID of 0 if the user isn't logged into Facebook.
252256
// They shouldn't be sending us a sentinel value... but since they are, we're refusing to save that ID.
253257
if (StringUtils.isBlank(uid) || UidsCookie.isFacebookSentinel(familyName, uid)) {
254-
return UidsCookieUpdateResult.failure(splitUids(initialCookie));
258+
return UpdateResult.unaltered(initialCookie);
255259
}
256260

257261
final UidsCookie updatedCookie = initialCookie.updateUid(familyName, uid);
258-
return UidsCookieUpdateResult.success(splitUids(updatedCookie));
262+
return UpdateResult.updated(updatedCookie);
259263
}
260264

261265
private static UidsCookie removeExpiredUids(UidsCookie uidsCookie) {
@@ -271,49 +275,49 @@ private static UidsCookie removeExpiredUids(UidsCookie uidsCookie) {
271275
return updatedCookie;
272276
}
273277

274-
public Map<String, UidsCookie> splitUids(UidsCookie uidsCookie) {
278+
public List<Cookie> splitUidsIntoCookies(UidsCookie uidsCookie) {
275279
final Uids cookieUids = uidsCookie.getCookieUids();
276280
final Map<String, UidWithExpiry> uids = cookieUids.getUids();
277281
final boolean hasOptout = !uidsCookie.allowsSync();
278282

279-
final Iterator<String> cookieFamilyIterator = cookieFamilyNamesByDescPriorityAndExpiration(uidsCookie);
280-
final Map<String, UidsCookie> splitCookies = new HashMap<>();
283+
final Iterator<String> cookieFamilies = cookieFamilyNamesByDescPriorityAndExpiration(uidsCookie);
284+
final List<Cookie> splitCookies = new ArrayList<>();
281285

282286
int uidsIndex = 0;
283287
String nextCookieFamily = null;
284288

285289
while (uidsIndex < numberOfUidCookies) {
286290
final String uidsName = uidsIndex == 0 ? COOKIE_NAME : COOKIE_NAME_FORMAT.formatted(uidsIndex + 1);
287-
final UidsCookie tempUidsCookie = splitCookies.computeIfAbsent(
288-
uidsName,
289-
key -> new UidsCookie(Uids.builder().uids(new HashMap<>()).optout(hasOptout).build(), mapper));
290-
final Map<String, UidWithExpiry> tempUids = tempUidsCookie.getCookieUids().getUids();
291-
292-
while (nextCookieFamily != null || cookieFamilyIterator.hasNext()) {
293-
nextCookieFamily = nextCookieFamily == null ? cookieFamilyIterator.next() : nextCookieFamily;
294-
tempUids.put(nextCookieFamily, uids.get(nextCookieFamily));
291+
UidsCookie tempUidsCookie = new UidsCookie(
292+
Uids.builder().uids(new HashMap<>()).optout(hasOptout).build(),
293+
mapper);
294+
295+
while (nextCookieFamily != null || cookieFamilies.hasNext()) {
296+
nextCookieFamily = nextCookieFamily == null ? cookieFamilies.next() : nextCookieFamily;
297+
tempUidsCookie = tempUidsCookie.updateUid(nextCookieFamily, uids.get(nextCookieFamily));
295298
if (cookieExceededMaxLength(uidsName, tempUidsCookie)) {
296-
tempUids.remove(nextCookieFamily);
299+
tempUidsCookie = tempUidsCookie.deleteUid(nextCookieFamily);
297300
break;
298301
}
299302

300303
nextCookieFamily = null;
301304
}
302305

303-
uidsIndex++;
304-
}
305-
306-
while (nextCookieFamily != null || cookieFamilyIterator.hasNext()) {
307-
nextCookieFamily = nextCookieFamily == null ? cookieFamilyIterator.next() : nextCookieFamily;
308-
if (prioritizedCoopSyncProvider.isPrioritizedFamily(nextCookieFamily)) {
309-
metrics.updateUserSyncSizedOutMetric(nextCookieFamily);
306+
if (tempUidsCookie.getCookieUids().getUids().isEmpty()) {
307+
splitCookies.add(expiredCookie(uidsName));
310308
} else {
311-
metrics.updateUserSyncSizeBlockedMetric(nextCookieFamily);
309+
splitCookies.add(aliveCookie(uidsName, tempUidsCookie));
312310
}
313311

314-
nextCookieFamily = null;
312+
uidsIndex++;
315313
}
316314

315+
if (nextCookieFamily != null) {
316+
updateSyncSizeMetrics(nextCookieFamily);
317+
}
318+
319+
cookieFamilies.forEachRemaining(this::updateSyncSizeMetrics);
320+
317321
return splitCookies;
318322
}
319323

@@ -340,12 +344,20 @@ private int compareCookieFamilyNames(Map.Entry<String, UidWithExpiry> left,
340344
}
341345
}
342346

347+
private void updateSyncSizeMetrics(String nextCookieFamily) {
348+
if (prioritizedCoopSyncProvider.isPrioritizedFamily(nextCookieFamily)) {
349+
metrics.updateUserSyncSizedOutMetric(nextCookieFamily);
350+
} else {
351+
metrics.updateUserSyncSizeBlockedMetric(nextCookieFamily);
352+
}
353+
}
354+
343355
private boolean cookieExceededMaxLength(String name, UidsCookie uidsCookie) {
344356
return maxCookieSizeBytes > 0 && cookieBytesLength(name, uidsCookie) > maxCookieSizeBytes;
345357
}
346358

347359
private int cookieBytesLength(String cookieName, UidsCookie uidsCookie) {
348-
return makeCookie(cookieName, uidsCookie).encode().getBytes().length;
360+
return aliveCookie(cookieName, uidsCookie).encode().getBytes().length;
349361
}
350362

351363
public String hostCookieUidToSync(RoutingContext routingContext, String cookieFamilyName) {

src/main/java/org/prebid/server/cookie/model/UidsCookieUpdateResult.java

-22
This file was deleted.

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ private Cookie optCookie(boolean optout, RoutingContext routingContext) {
107107
.parseFromRequest(routingContext)
108108
.updateOptout(optout);
109109

110-
return uidsCookieService.makeCookie(uidsCookie);
110+
return uidsCookieService.aliveCookie(uidsCookie);
111111
}
112112

113113
private String optUrl(boolean optout) {

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

+6-13
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import org.prebid.server.cookie.UidsCookieService;
3636
import org.prebid.server.cookie.exception.UnauthorizedUidsException;
3737
import org.prebid.server.cookie.exception.UnavailableForLegalReasonsException;
38-
import org.prebid.server.cookie.model.UidsCookieUpdateResult;
3938
import org.prebid.server.exception.InvalidAccountConfigException;
4039
import org.prebid.server.exception.InvalidRequestException;
4140
import org.prebid.server.execution.timeout.Timeout;
@@ -44,6 +43,7 @@
4443
import org.prebid.server.log.LoggerFactory;
4544
import org.prebid.server.metric.Metrics;
4645
import org.prebid.server.model.Endpoint;
46+
import org.prebid.server.model.UpdateResult;
4747
import org.prebid.server.privacy.HostVendorTcfDefinerService;
4848
import org.prebid.server.privacy.gdpr.model.HostVendorTcfResponse;
4949
import org.prebid.server.privacy.gdpr.model.PrivacyEnforcementAction;
@@ -328,14 +328,13 @@ private void respondWithCookie(SetuidContext setuidContext) {
328328
final String uid = routingContext.request().getParam(UID_PARAM);
329329
final String bidder = setuidContext.getCookieName();
330330

331-
final UidsCookieUpdateResult uidsCookieUpdateResult = uidsCookieService.updateUidsCookie(
331+
final UpdateResult<UidsCookie> uidsCookieUpdateResult = uidsCookieService.updateUidsCookie(
332332
setuidContext.getUidsCookie(), bidder, uid);
333333

334-
uidsCookieUpdateResult.getUidsCookies().entrySet().stream()
335-
.map(entry -> toCookie(entry.getKey(), entry.getValue()))
336-
.forEach(uidsCookie -> addCookie(routingContext, uidsCookie));
334+
uidsCookieService.splitUidsIntoCookies(uidsCookieUpdateResult.getValue())
335+
.forEach(cookie -> addCookie(routingContext, cookie));
337336

338-
if (uidsCookieUpdateResult.isSuccessfullyUpdated()) {
337+
if (uidsCookieUpdateResult.isUpdated()) {
339338
metrics.updateUserSyncSetsMetric(bidder);
340339
}
341340
final int statusCode = HttpResponseStatus.OK.code();
@@ -346,17 +345,11 @@ private void respondWithCookie(SetuidContext setuidContext) {
346345
.status(statusCode)
347346
.bidder(bidder)
348347
.uid(uid)
349-
.success(uidsCookieUpdateResult.isSuccessfullyUpdated())
348+
.success(uidsCookieUpdateResult.isUpdated())
350349
.build();
351350
analyticsDelegator.processEvent(setuidEvent, tcfContext);
352351
}
353352

354-
private Cookie toCookie(String cookieName, UidsCookie uidsCookie) {
355-
return uidsCookie.getCookieUids().getUids().isEmpty()
356-
? uidsCookieService.removeCookie(cookieName)
357-
: uidsCookieService.makeCookie(cookieName, uidsCookie);
358-
}
359-
360353
private Consumer<HttpServerResponse> buildCookieResponseConsumer(SetuidContext setuidContext,
361354
int responseStatusCode) {
362355

0 commit comments

Comments
 (0)