Skip to content

Commit 771b183

Browse files
committed
Merge remote-tracking branch 'origin/master' into replace-static-sampling-with-configured-rate
2 parents c21fdb4 + 2880782 commit 771b183

301 files changed

Lines changed: 2304 additions & 2705 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/main/java/org/prebid/server/auction/ExchangeService.java

Lines changed: 169 additions & 69 deletions
Large diffs are not rendered by default.

src/main/java/org/prebid/server/auction/externalortb/StoredResponseProcessor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,8 @@ private List<SeatBid> resolveSeatBids(StoredResponse storedResponse,
224224
Map<String, String> idToStoredResponses,
225225
String impId) {
226226

227-
if (storedResponse instanceof StoredResponse.StoredResponseObject storedResponseObject) {
228-
return Collections.singletonList(storedResponseObject.seatBid());
227+
if (storedResponse instanceof StoredResponse.StoredResponseObject(SeatBid seatBid)) {
228+
return Collections.singletonList(seatBid);
229229
}
230230

231231
final String storedResponseId = ((StoredResponse.StoredResponseId) storedResponse).id();
@@ -313,7 +313,7 @@ private static AuctionParticipation updateStoredBidResponse(AuctionParticipation
313313
final BidRequest bidRequest = bidderRequest.getBidRequest();
314314

315315
final List<Imp> imps = bidRequest.getImp();
316-
// Аor now, Stored Bid Response works only for bid requests with single imp
316+
// For now, Stored Bid Response works only for bid requests with single imp
317317
if (imps.size() > 1 || StringUtils.isEmpty(bidderRequest.getStoredResponse())) {
318318
return auctionParticipation;
319319
}

src/main/java/org/prebid/server/auction/model/AuctionContext.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ public AuctionContext with(BidResponse bidResponse) {
8383
return this.toBuilder().bidResponse(bidResponse).build();
8484
}
8585

86+
public AuctionContext with(Map<String, BidRejectionTracker> bidRejectionTrackers) {
87+
return this.toBuilder().bidRejectionTrackers(bidRejectionTrackers).build();
88+
}
89+
8690
public AuctionContext with(List<AuctionParticipation> auctionParticipations) {
8791
return this.toBuilder().auctionParticipations(auctionParticipations).build();
8892
}

src/main/java/org/prebid/server/auction/model/BidRejectionTracker.java

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -45,24 +45,48 @@ public BidRejectionTracker(String bidder, Set<String> involvedImpIds, double log
4545
rejections = new HashMap<>();
4646
}
4747

48-
public BidRejectionTracker(BidRejectionTracker anotherTracker, Set<String> additionalImpIds) {
49-
this.bidder = anotherTracker.bidder;
50-
this.logSamplingRate = anotherTracker.logSamplingRate;
51-
this.involvedImpIds = new HashSet<>(anotherTracker.involvedImpIds);
52-
this.involvedImpIds.addAll(additionalImpIds);
53-
54-
this.succeededBidsIds = new HashMap<>(anotherTracker.succeededBidsIds);
55-
this.rejections = new HashMap<>(anotherTracker.rejections);
48+
private BidRejectionTracker(
49+
String bidder,
50+
Set<String> involvedImpIds,
51+
Map<String, Set<String>> succeededBidsIds,
52+
Map<String, List<Rejection>> rejections,
53+
double logSamplingRate) {
54+
55+
this.bidder = bidder;
56+
this.involvedImpIds = new HashSet<>(involvedImpIds);
57+
this.logSamplingRate = logSamplingRate;
58+
59+
this.succeededBidsIds = MapUtil.mapValues(succeededBidsIds, v -> new HashSet<>(v));
60+
this.rejections = MapUtil.mapValues(rejections, ArrayList::new);
5661
}
5762

58-
public void succeed(Collection<BidderBid> bids) {
63+
public static BidRejectionTracker copyOf(BidRejectionTracker anotherTracker) {
64+
return new BidRejectionTracker(
65+
anotherTracker.bidder,
66+
anotherTracker.involvedImpIds,
67+
anotherTracker.succeededBidsIds,
68+
anotherTracker.rejections,
69+
anotherTracker.logSamplingRate);
70+
}
71+
72+
public static BidRejectionTracker withAdditionalImpIds(
73+
BidRejectionTracker anotherTracker,
74+
Set<String> additionalImpIds) {
75+
76+
final BidRejectionTracker newTracker = copyOf(anotherTracker);
77+
newTracker.involvedImpIds.addAll(additionalImpIds);
78+
return newTracker;
79+
}
80+
81+
public BidRejectionTracker succeed(Collection<BidderBid> bids) {
5982
bids.stream()
6083
.map(BidderBid::getBid)
6184
.filter(Objects::nonNull)
6285
.forEach(this::succeed);
86+
return this;
6387
}
6488

65-
private void succeed(Bid bid) {
89+
private BidRejectionTracker succeed(Bid bid) {
6690
final String bidId = bid.getId();
6791
final String impId = bid.getImpid();
6892
if (involvedImpIds.contains(impId)) {
@@ -73,21 +97,23 @@ private void succeed(Bid bid) {
7397
logSamplingRate);
7498
}
7599
}
100+
return this;
76101
}
77102

78103
public void restoreFromRejection(Collection<BidderBid> bids) {
79104
succeed(bids);
80105
}
81106

82-
public void reject(Collection<Rejection> rejections) {
107+
public BidRejectionTracker reject(Collection<Rejection> rejections) {
83108
rejections.forEach(this::reject);
109+
return this;
84110
}
85111

86-
public void reject(Rejection rejection) {
112+
public BidRejectionTracker reject(Rejection rejection) {
87113
if (rejection instanceof ImpRejection && rejection.reason().getValue() >= 300) {
88114
logger.warn("The rejected imp {} with the code {} equal to or higher than 300 assumes "
89115
+ "that there is a rejected bid that shouldn't be lost");
90-
return;
116+
return this;
91117
}
92118

93119
final String impId = rejection.impId();
@@ -113,14 +139,18 @@ public void reject(Rejection rejection) {
113139
}
114140
}
115141
}
142+
143+
return this;
116144
}
117145

118-
public void rejectImps(Collection<String> impIds, BidRejectionReason reason) {
146+
public BidRejectionTracker rejectImps(Collection<String> impIds, BidRejectionReason reason) {
119147
impIds.forEach(impId -> reject(ImpRejection.of(impId, reason)));
148+
return this;
120149
}
121150

122-
public void rejectAll(BidRejectionReason reason) {
151+
public BidRejectionTracker rejectAll(BidRejectionReason reason) {
123152
involvedImpIds.forEach(impId -> reject(ImpRejection.of(impId, reason)));
153+
return this;
124154
}
125155

126156
public Set<Rejection> getRejected() {

src/main/java/org/prebid/server/auction/model/SetuidContext.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import lombok.Value;
77
import org.prebid.server.activity.infrastructure.ActivityInfrastructure;
88
import org.prebid.server.auction.gpp.model.GppContext;
9-
import org.prebid.server.bidder.UsersyncMethodType;
9+
import org.prebid.server.bidder.Usersyncer;
1010
import org.prebid.server.cookie.UidsCookie;
1111
import org.prebid.server.execution.timeout.Timeout;
1212
import org.prebid.server.privacy.model.PrivacyContext;
@@ -27,10 +27,10 @@ public class SetuidContext {
2727

2828
Account account;
2929

30-
String cookieName;
30+
String bidder;
3131

3232
@JsonIgnore
33-
UsersyncMethodType syncType;
33+
Usersyncer usersyncer;
3434

3535
PrivacyContext privacyContext;
3636

src/main/java/org/prebid/server/bidder/UsersyncInfoBuilder.java

Lines changed: 0 additions & 100 deletions
This file was deleted.
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package org.prebid.server.bidder;
2+
3+
import org.apache.commons.collections4.CollectionUtils;
4+
import org.apache.commons.lang3.ObjectUtils;
5+
import org.apache.commons.lang3.StringUtils;
6+
import org.prebid.server.privacy.model.Privacy;
7+
import org.prebid.server.proto.response.UsersyncInfo;
8+
import org.prebid.server.util.HttpUtil;
9+
10+
import java.util.Map;
11+
import java.util.Objects;
12+
import java.util.stream.Collectors;
13+
14+
public class UsersyncInfoFactory {
15+
16+
private static final String CALLBACK_URL_TEMPLATE = """
17+
{{base_url}}/setuid?\
18+
bidder={{bidder}}\
19+
&gdpr={{gdpr}}\
20+
&gdpr_consent={{gdpr_consent}}\
21+
&us_privacy={{us_privacy}}\
22+
&gpp={{gpp}}\
23+
&gpp_sid={{gpp_sid}}\
24+
&f={{format}}\
25+
&uid={{uid}}""";
26+
27+
private static final String BASE_URL_PLACEHOLDER = "{{base_url}}";
28+
private static final String BIDDER_PLACEHOLDER = "{{bidder}}";
29+
private static final String GDPR_PLACEHOLDER = "{{gdpr}}";
30+
private static final String GDPR_CONSENT_PLACEHOLDER = "{{gdpr_consent}}";
31+
private static final String US_PRIVACY_PLACEHOLDER = "{{us_privacy}}";
32+
private static final String GPP_PLACEHOLDER = "{{gpp}}";
33+
private static final String GPP_SID_PLACEHOLDER = "{{gpp_sid}}";
34+
private static final String REDIRECT_URL_PLACEHOLDER = "{{redirect_url}}";
35+
private static final String FORMAT_PLACEHOLDER = "{{format}}";
36+
private static final String UID_PLACEHOLDER = "{{uid}}";
37+
38+
private final String externalUrl;
39+
40+
public UsersyncInfoFactory(String externalUrl) {
41+
this.externalUrl = HttpUtil.validateUrl(Objects.requireNonNull(externalUrl));
42+
}
43+
44+
public UsersyncInfo build(String bidder,
45+
String hostCookieUid,
46+
UsersyncMethod usersyncMethod,
47+
Privacy privacy) {
48+
49+
final String usersyncUrl = hostCookieUid == null
50+
? StringUtils.defaultString(usersyncMethod.getUsersyncUrl())
51+
: buildRedirectUrl(bidder, hostCookieUid, usersyncMethod);
52+
53+
final String redirectUrl = hostCookieUid == null
54+
? buildRedirectUrl(bidder, usersyncMethod.getUidMacro(), usersyncMethod)
55+
: StringUtils.EMPTY;
56+
57+
final Map<String, String> privacyParams = preparePrivacyParams(privacy);
58+
final String usersyncUrlWithPrivacy = applyParams(usersyncUrl, encodeParams(privacyParams));
59+
final String redirectUrlWithPrivacy = applyParams(redirectUrl, privacyParams);
60+
61+
final String finalUrl = usersyncUrlWithPrivacy.replace(
62+
REDIRECT_URL_PLACEHOLDER, HttpUtil.encodeUrl(redirectUrlWithPrivacy));
63+
64+
return UsersyncInfo.of(finalUrl, usersyncMethod.getType(), usersyncMethod.isSupportCORS());
65+
}
66+
67+
private String buildRedirectUrl(String bidder, String uid, UsersyncMethod method) {
68+
return CALLBACK_URL_TEMPLATE
69+
.replace(BASE_URL_PLACEHOLDER, externalUrl)
70+
.replace(BIDDER_PLACEHOLDER, HttpUtil.encodeUrl(bidder))
71+
.replace(UID_PLACEHOLDER, StringUtils.defaultString(uid))
72+
.replace(FORMAT_PLACEHOLDER, resolveFormat(method).name);
73+
}
74+
75+
private static UsersyncFormat resolveFormat(UsersyncMethod method) {
76+
return ObjectUtils.firstNonNull(method.getFormatOverride(), method.getType().format);
77+
}
78+
79+
private static Map<String, String> preparePrivacyParams(Privacy privacy) {
80+
return Map.of(
81+
GDPR_PLACEHOLDER, StringUtils.defaultString(privacy.getGdpr()),
82+
GDPR_CONSENT_PLACEHOLDER, StringUtils.defaultString(privacy.getConsentString()),
83+
US_PRIVACY_PLACEHOLDER, StringUtils.defaultString(privacy.getCcpa().getUsPrivacy()),
84+
GPP_PLACEHOLDER, StringUtils.defaultString(privacy.getGpp()),
85+
GPP_SID_PLACEHOLDER, CollectionUtils.emptyIfNull(privacy.getGppSid()).stream()
86+
.map(String::valueOf)
87+
.collect(Collectors.joining(",")));
88+
}
89+
90+
private static Map<String, String> encodeParams(Map<String, String> params) {
91+
return params.entrySet().stream()
92+
.collect(Collectors.toMap(Map.Entry::getKey, entry -> HttpUtil.encodeUrl(entry.getValue())));
93+
}
94+
95+
private static String applyParams(String url, Map<String, String> params) {
96+
String result = url;
97+
for (Map.Entry<String, String> param: params.entrySet()) {
98+
result = result.replace(param.getKey(), param.getValue());
99+
}
100+
return result;
101+
}
102+
}

src/main/java/org/prebid/server/bidder/UsersyncMethod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class UsersyncMethod {
1111

1212
String usersyncUrl;
1313

14-
String redirectUrl;
14+
String uidMacro;
1515

1616
boolean supportCORS;
1717

0 commit comments

Comments
 (0)