Skip to content

Commit d714f28

Browse files
authored
Module: Request correction (#3526)
1 parent 6af31f5 commit d714f28

35 files changed

Lines changed: 1633 additions & 3 deletions

extra/bundle/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@
5050
<artifactId>greenbids-real-time-data</artifactId>
5151
<version>${project.version}</version>
5252
</dependency>
53+
<dependency>
54+
<groupId>org.prebid.server.hooks.modules</groupId>
55+
<artifactId>pb-request-correction</artifactId>
56+
<version>${project.version}</version>
57+
</dependency>
5358
</dependencies>
5459

5560
<build>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
5+
<parent>
6+
<groupId>org.prebid.server.hooks.modules</groupId>
7+
<artifactId>all-modules</artifactId>
8+
<version>3.15.0-SNAPSHOT</version>
9+
</parent>
10+
11+
<artifactId>pb-request-correction</artifactId>
12+
13+
<name>pb-request-correction</name>
14+
<description>Request correction module</description>
15+
</project>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
lombok.anyConstructor.addConstructorProperties = true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.prebid.server.hooks.modules.pb.request.correction.core;
2+
3+
import com.iab.openrtb.request.BidRequest;
4+
import org.prebid.server.hooks.modules.pb.request.correction.core.config.model.Config;
5+
import org.prebid.server.hooks.modules.pb.request.correction.core.correction.Correction;
6+
import org.prebid.server.hooks.modules.pb.request.correction.core.correction.CorrectionProducer;
7+
8+
import java.util.List;
9+
import java.util.Objects;
10+
11+
public class RequestCorrectionProvider {
12+
13+
private final List<CorrectionProducer> correctionProducers;
14+
15+
public RequestCorrectionProvider(List<CorrectionProducer> correctionProducers) {
16+
this.correctionProducers = Objects.requireNonNull(correctionProducers);
17+
}
18+
19+
public List<Correction> corrections(Config config, BidRequest bidRequest) {
20+
return correctionProducers.stream()
21+
.filter(correctionProducer -> correctionProducer.shouldProduce(config, bidRequest))
22+
.map(correctionProducer -> correctionProducer.produce(config))
23+
.toList();
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.prebid.server.hooks.modules.pb.request.correction.core.config.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonAlias;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.Builder;
6+
import lombok.Value;
7+
8+
@Value
9+
@Builder
10+
public class Config {
11+
12+
boolean enabled;
13+
14+
@JsonAlias("pbsdkAndroidInstlRemove")
15+
@JsonProperty("pbsdk-android-instl-remove")
16+
boolean interstitialCorrectionEnabled;
17+
18+
@JsonAlias("pbsdkUaCleanup")
19+
@JsonProperty("pbsdk-ua-cleanup")
20+
boolean userAgentCorrectionEnabled;
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.prebid.server.hooks.modules.pb.request.correction.core.correction;
2+
3+
import com.iab.openrtb.request.BidRequest;
4+
import org.prebid.server.hooks.modules.pb.request.correction.core.config.model.Config;
5+
6+
public interface Correction {
7+
8+
BidRequest apply(BidRequest bidRequest);
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.prebid.server.hooks.modules.pb.request.correction.core.correction;
2+
3+
import com.iab.openrtb.request.BidRequest;
4+
import org.prebid.server.hooks.modules.pb.request.correction.core.config.model.Config;
5+
6+
public interface CorrectionProducer {
7+
8+
boolean shouldProduce(Config config, BidRequest bidRequest);
9+
10+
Correction produce(Config config);
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.prebid.server.hooks.modules.pb.request.correction.core.correction.interstitial;
2+
3+
import com.iab.openrtb.request.BidRequest;
4+
import com.iab.openrtb.request.Imp;
5+
import org.prebid.server.hooks.modules.pb.request.correction.core.correction.Correction;
6+
7+
public class InterstitialCorrection implements Correction {
8+
9+
@Override
10+
public BidRequest apply(BidRequest bidRequest) {
11+
return bidRequest.toBuilder()
12+
.imp(bidRequest.getImp().stream()
13+
.map(InterstitialCorrection::removeInterstitial)
14+
.toList())
15+
.build();
16+
}
17+
18+
private static Imp removeInterstitial(Imp imp) {
19+
final Integer interstitial = imp.getInstl();
20+
return interstitial != null && interstitial == 1
21+
? imp.toBuilder().instl(null).build()
22+
: imp;
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package org.prebid.server.hooks.modules.pb.request.correction.core.correction.interstitial;
2+
3+
import com.iab.openrtb.request.App;
4+
import com.iab.openrtb.request.BidRequest;
5+
import com.iab.openrtb.request.Imp;
6+
import org.apache.commons.lang3.StringUtils;
7+
import org.prebid.server.hooks.modules.pb.request.correction.core.config.model.Config;
8+
import org.prebid.server.hooks.modules.pb.request.correction.core.correction.Correction;
9+
import org.prebid.server.hooks.modules.pb.request.correction.core.correction.CorrectionProducer;
10+
import org.prebid.server.hooks.modules.pb.request.correction.core.util.VersionUtil;
11+
import org.prebid.server.proto.openrtb.ext.request.ExtApp;
12+
import org.prebid.server.proto.openrtb.ext.request.ExtAppPrebid;
13+
14+
import java.util.List;
15+
import java.util.Optional;
16+
17+
public class InterstitialCorrectionProducer implements CorrectionProducer {
18+
19+
private static final InterstitialCorrection CORRECTION_INSTANCE = new InterstitialCorrection();
20+
21+
private static final String PREBID_MOBILE = "prebid-mobile";
22+
private static final String ANDROID = "android";
23+
24+
private static final int MAX_VERSION_MAJOR = 2;
25+
private static final int MAX_VERSION_MINOR = 2;
26+
private static final int MAX_VERSION_PATCH = 3;
27+
28+
@Override
29+
public boolean shouldProduce(Config config, BidRequest bidRequest) {
30+
final App app = bidRequest.getApp();
31+
return config.isInterstitialCorrectionEnabled()
32+
&& hasInterstitialToRemove(bidRequest.getImp())
33+
&& isPrebidMobile(app)
34+
&& isAndroid(app)
35+
&& isApplicableVersion(app);
36+
}
37+
38+
private static boolean hasInterstitialToRemove(List<Imp> imps) {
39+
for (Imp imp : imps) {
40+
final Integer interstitial = imp.getInstl();
41+
if (interstitial != null && interstitial == 1) {
42+
return true;
43+
}
44+
}
45+
46+
return false;
47+
}
48+
49+
private static boolean isPrebidMobile(App app) {
50+
final String source = Optional.ofNullable(app)
51+
.map(App::getExt)
52+
.map(ExtApp::getPrebid)
53+
.map(ExtAppPrebid::getSource)
54+
.orElse(null);
55+
56+
return StringUtils.equalsIgnoreCase(source, PREBID_MOBILE);
57+
}
58+
59+
private static boolean isAndroid(App app) {
60+
return StringUtils.containsIgnoreCase(app.getBundle(), ANDROID);
61+
}
62+
63+
private static boolean isApplicableVersion(App app) {
64+
return Optional.ofNullable(app)
65+
.map(App::getExt)
66+
.map(ExtApp::getPrebid)
67+
.map(ExtAppPrebid::getVersion)
68+
.map(InterstitialCorrectionProducer::checkVersion)
69+
.orElse(false);
70+
}
71+
72+
private static boolean checkVersion(String version) {
73+
return VersionUtil.isVersionLessThan(version, MAX_VERSION_MAJOR, MAX_VERSION_MINOR, MAX_VERSION_PATCH);
74+
}
75+
76+
@Override
77+
public Correction produce(Config config) {
78+
return CORRECTION_INSTANCE;
79+
}
80+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.prebid.server.hooks.modules.pb.request.correction.core.correction.useragent;
2+
3+
import com.iab.openrtb.request.BidRequest;
4+
import com.iab.openrtb.request.Device;
5+
import org.prebid.server.hooks.modules.pb.request.correction.core.correction.Correction;
6+
7+
import java.util.regex.Pattern;
8+
9+
public class UserAgentCorrection implements Correction {
10+
11+
private static final Pattern USER_AGENT_PATTERN = Pattern.compile("PrebidMobile/[0-9][^ ]*");
12+
13+
@Override
14+
public BidRequest apply(BidRequest bidRequest) {
15+
return bidRequest.toBuilder()
16+
.device(correctDevice(bidRequest.getDevice()))
17+
.build();
18+
}
19+
20+
private static Device correctDevice(Device device) {
21+
return device.toBuilder()
22+
.ua(USER_AGENT_PATTERN.matcher(device.getUa()).replaceAll(""))
23+
.build();
24+
}
25+
}

0 commit comments

Comments
 (0)