Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.fasterxml.jackson.databind.node.ObjectNode;
import com.iab.openrtb.request.BidRequest;
import io.vertx.core.http.HttpMethod;
import lombok.Builder;
import lombok.Value;
import lombok.experimental.Accessors;
Expand All @@ -21,6 +22,8 @@ public class BidderInvocationContextImpl implements BidderInvocationContext {

Timeout timeout;

HttpMethod httpMethod;

Endpoint endpoint;

AuctionContext auctionContext;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.prebid.server.auction.privacy.contextfactory.AmpPrivacyContextFactory;
import org.prebid.server.auction.versionconverter.BidRequestOrtbVersionConversionManager;
import org.prebid.server.exception.InvalidRequestException;
import org.prebid.server.hooks.execution.model.HookHttpEndpoint;
import org.prebid.server.json.JacksonMapper;
import org.prebid.server.metric.MetricName;
import org.prebid.server.model.CaseInsensitiveMultiMap;
Expand Down Expand Up @@ -139,7 +140,7 @@ public Future<AuctionContext> fromRequest(RoutingContext routingContext, long st
final String body = routingContext.body().asString();

final AuctionContext initialAuctionContext = ortb2RequestFactory.createAuctionContext(
Endpoint.openrtb2_amp, MetricName.amp);
HookHttpEndpoint.AMP, MetricName.amp);

return ortb2RequestFactory.executeEntrypointHooks(routingContext, body, initialAuctionContext)
.compose(httpRequest -> parseBidRequest(initialAuctionContext, httpRequest)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.prebid.server.bidadjustments.BidAdjustmentsEnricher;
import org.prebid.server.cookie.CookieDeprecationService;
import org.prebid.server.exception.InvalidRequestException;
import org.prebid.server.hooks.execution.model.HookHttpEndpoint;
import org.prebid.server.json.JacksonMapper;
import org.prebid.server.metric.MetricName;
import org.prebid.server.model.Endpoint;
Expand Down Expand Up @@ -104,7 +105,7 @@ public Future<AuctionContext> parseRequest(RoutingContext routingContext, long s
}

final AuctionContext initialAuctionContext = ortb2RequestFactory.createAuctionContext(
Endpoint.openrtb2_auction, MetricName.openrtb2web);
HookHttpEndpoint.POST_AUCTION, MetricName.openrtb2web);

return ortb2RequestFactory.executeEntrypointHooks(routingContext, body, initialAuctionContext)
.compose(httpRequest -> parseBidRequest(httpRequest, initialAuctionContext.getPrebidErrors())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import org.prebid.server.geolocation.model.GeoInfo;
import org.prebid.server.hooks.execution.HookStageExecutor;
import org.prebid.server.hooks.execution.model.HookExecutionContext;
import org.prebid.server.hooks.execution.model.HookHttpEndpoint;
import org.prebid.server.hooks.execution.model.HookStageExecutionResult;
import org.prebid.server.hooks.v1.auction.AuctionRequestPayload;
import org.prebid.server.hooks.v1.entrypoint.EntrypointPayload;
Expand All @@ -51,7 +52,6 @@
import org.prebid.server.metric.MetricName;
import org.prebid.server.metric.Metrics;
import org.prebid.server.model.CaseInsensitiveMultiMap;
import org.prebid.server.model.Endpoint;
import org.prebid.server.model.HttpRequestContext;
import org.prebid.server.model.UpdateResult;
import org.prebid.server.privacy.model.PrivacyContext;
Expand Down Expand Up @@ -147,7 +147,7 @@ public Ortb2RequestFactory(int timeoutAdjustmentFactor,
this.metrics = Objects.requireNonNull(metrics);
}

public AuctionContext createAuctionContext(Endpoint endpoint, MetricName requestTypeMetric) {
public AuctionContext createAuctionContext(HookHttpEndpoint endpoint, MetricName requestTypeMetric) {
return AuctionContext.builder()
.requestTypeMetric(requestTypeMetric)
.prebidErrors(new ArrayList<>())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.prebid.server.auction.privacy.contextfactory.AuctionPrivacyContextFactory;
import org.prebid.server.auction.versionconverter.BidRequestOrtbVersionConversionManager;
import org.prebid.server.exception.InvalidRequestException;
import org.prebid.server.hooks.execution.model.HookHttpEndpoint;
import org.prebid.server.json.DecodeException;
import org.prebid.server.json.JacksonMapper;
import org.prebid.server.metric.MetricName;
Expand Down Expand Up @@ -105,7 +106,7 @@ public Future<WithPodErrors<AuctionContext>> fromRequest(RoutingContext routingC
final List<PodError> podErrors = new ArrayList<>();

final AuctionContext initialAuctionContext = ortb2RequestFactory.createAuctionContext(
Endpoint.openrtb2_video, MetricName.video);
HookHttpEndpoint.VIDEO, MetricName.video);

return ortb2RequestFactory.executeEntrypointHooks(routingContext, body, initialAuctionContext)
.compose(httpRequest -> createBidRequest(httpRequest)
Expand All @@ -120,9 +121,9 @@ public Future<WithPodErrors<AuctionContext>> fromRequest(RoutingContext routingC
.map(auctionContext -> auctionContext.with(debugResolver.debugContextFrom(auctionContext)))

.compose(auctionContext -> ortb2RequestFactory.limitImpressions(
auctionContext.getAccount(),
auctionContext.getBidRequest(),
auctionContext.getDebugWarnings())
auctionContext.getAccount(),
auctionContext.getBidRequest(),
auctionContext.getDebugWarnings())
.map(auctionContext::with))

.compose(auctionContext -> ortb2RequestFactory.validateRequest(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.prebid.server.hooks.execution.model.ExecutionGroup;
import org.prebid.server.hooks.execution.model.ExecutionPlan;
import org.prebid.server.hooks.execution.model.HookExecutionContext;
import org.prebid.server.hooks.execution.model.HookHttpEndpoint;
import org.prebid.server.hooks.execution.model.HookId;
import org.prebid.server.hooks.execution.model.HookStageExecutionResult;
import org.prebid.server.hooks.execution.model.Stage;
Expand Down Expand Up @@ -57,7 +58,6 @@
import org.prebid.server.json.DecodeException;
import org.prebid.server.json.JacksonMapper;
import org.prebid.server.model.CaseInsensitiveMultiMap;
import org.prebid.server.model.Endpoint;
import org.prebid.server.settings.model.Account;
import org.prebid.server.settings.model.AccountHooksConfiguration;
import org.prebid.server.settings.model.HooksAdminConfig;
Expand Down Expand Up @@ -193,7 +193,7 @@ public Future<HookStageExecutionResult<EntrypointPayload>> executeEntrypointStag
AuctionContext auctionContext) {

final HookExecutionContext context = auctionContext.getHookExecutionContext();
final Endpoint endpoint = context.getEndpoint();
final HookHttpEndpoint endpoint = context.getEndpoint();

return stageExecutor(StageWithHookType.ENTRYPOINT, ENTITY_HTTP_REQUEST, context)
.withExecutionPlan(planForEntrypointStage(endpoint))
Expand All @@ -212,12 +212,9 @@ public Future<HookStageExecutionResult<AuctionRequestPayload>> executeRawAuction
final BidRequest bidRequest = auctionContext.getBidRequest();
final Account account = auctionContext.getAccount();
final HookExecutionContext context = auctionContext.getHookExecutionContext();
final HookHttpEndpoint endpoint = context.getEndpoint();

final Endpoint endpoint = context.getEndpoint();

return this
.stageExecutor(
StageWithHookType.RAW_AUCTION_REQUEST, ENTITY_AUCTION_REQUEST, context, account, endpoint)
return stageExecutor(StageWithHookType.RAW_AUCTION_REQUEST, ENTITY_AUCTION_REQUEST, context, account, endpoint)
.withInitialPayload(AuctionRequestPayloadImpl.of(bidRequest))
.withInvocationContextProvider(auctionInvocationContextProvider(endpoint, auctionContext))
.withRejectAllowed(true)
Expand All @@ -231,12 +228,10 @@ public Future<HookStageExecutionResult<AuctionRequestPayload>> executeProcessedA
final BidRequest bidRequest = auctionContext.getBidRequest();
final Account account = auctionContext.getAccount();
final HookExecutionContext context = auctionContext.getHookExecutionContext();
final HookHttpEndpoint endpoint = context.getEndpoint();

final Endpoint endpoint = context.getEndpoint();

return this
.stageExecutor(
StageWithHookType.PROCESSED_AUCTION_REQUEST, ENTITY_AUCTION_REQUEST, context, account, endpoint)
return stageExecutor(
StageWithHookType.PROCESSED_AUCTION_REQUEST, ENTITY_AUCTION_REQUEST, context, account, endpoint)
.withInitialPayload(AuctionRequestPayloadImpl.of(bidRequest))
.withInvocationContextProvider(auctionInvocationContextProvider(endpoint, auctionContext))
.withRejectAllowed(true)
Expand All @@ -245,17 +240,16 @@ public Future<HookStageExecutionResult<AuctionRequestPayload>> executeProcessedA
}

public Future<HookStageExecutionResult<BidderRequestPayload>> executeBidderRequestStage(
BidderRequest bidderRequest, AuctionContext auctionContext) {
BidderRequest bidderRequest,
AuctionContext auctionContext) {

final Account account = auctionContext.getAccount();
final HookExecutionContext context = auctionContext.getHookExecutionContext();
final HookHttpEndpoint endpoint = context.getEndpoint();

final String bidder = bidderRequest.getBidder();

final Endpoint endpoint = context.getEndpoint();

return this
.stageExecutor(StageWithHookType.BIDDER_REQUEST, bidder, context, account, endpoint)
return stageExecutor(StageWithHookType.BIDDER_REQUEST, bidder, context, account, endpoint)
.withInitialPayload(BidderRequestPayloadImpl.of(bidderRequest.getBidRequest()))
.withInvocationContextProvider(bidderInvocationContextProvider(endpoint, auctionContext, bidder))
.withRejectAllowed(true)
Expand All @@ -269,14 +263,12 @@ public Future<HookStageExecutionResult<BidderResponsePayload>> executeRawBidderR

final Account account = auctionContext.getAccount();
final HookExecutionContext context = auctionContext.getHookExecutionContext();
final HookHttpEndpoint endpoint = context.getEndpoint();

final List<BidderBid> bids = bidderResponse.getSeatBid().getBids();
final String bidder = bidderResponse.getBidder();

final Endpoint endpoint = context.getEndpoint();

return this
.stageExecutor(StageWithHookType.RAW_BIDDER_RESPONSE, bidder, context, account, endpoint)
return stageExecutor(StageWithHookType.RAW_BIDDER_RESPONSE, bidder, context, account, endpoint)
.withInitialPayload(BidderResponsePayloadImpl.of(bids))
.withInvocationContextProvider(bidderInvocationContextProvider(endpoint, auctionContext, bidder))
.withRejectAllowed(true)
Expand All @@ -290,12 +282,11 @@ public Future<HookStageExecutionResult<BidderResponsePayload>> executeProcessedB

final Account account = auctionContext.getAccount();
final HookExecutionContext context = auctionContext.getHookExecutionContext();
final HookHttpEndpoint endpoint = context.getEndpoint();

final List<BidderBid> bids = bidderResponse.getSeatBid().getBids();
final String bidder = bidderResponse.getBidder();

final Endpoint endpoint = context.getEndpoint();

return stageExecutor(StageWithHookType.PROCESSED_BIDDER_RESPONSE, bidder, context, account, endpoint)
.withInitialPayload(BidderResponsePayloadImpl.of(bids))
.withInvocationContextProvider(bidderInvocationContextProvider(endpoint, auctionContext, bidder))
Expand All @@ -310,12 +301,14 @@ public Future<HookStageExecutionResult<AllProcessedBidResponsesPayload>> execute

final Account account = auctionContext.getAccount();
final HookExecutionContext context = auctionContext.getHookExecutionContext();

final Endpoint endpoint = context.getEndpoint();
final HookHttpEndpoint endpoint = context.getEndpoint();

return stageExecutor(
StageWithHookType.ALL_PROCESSED_BID_RESPONSES, ENTITY_ALL_PROCESSED_BID_RESPONSES,
context, account, endpoint)
StageWithHookType.ALL_PROCESSED_BID_RESPONSES,
ENTITY_ALL_PROCESSED_BID_RESPONSES,
context,
account,
endpoint)
.withInitialPayload(AllProcessedBidResponsesPayloadImpl.of(bidderResponses))
.withInvocationContextProvider(auctionInvocationContextProvider(endpoint, auctionContext))
.withRejectAllowed(false)
Expand All @@ -329,8 +322,7 @@ public Future<HookStageExecutionResult<AuctionResponsePayload>> executeAuctionRe

final Account account = ObjectUtils.defaultIfNull(auctionContext.getAccount(), EMPTY_ACCOUNT);
final HookExecutionContext context = auctionContext.getHookExecutionContext();

final Endpoint endpoint = context.getEndpoint();
final HookHttpEndpoint endpoint = context.getEndpoint();

return stageExecutor(StageWithHookType.AUCTION_RESPONSE, ENTITY_AUCTION_RESPONSE, context, account, endpoint)
.withInitialPayload(AuctionResponsePayloadImpl.of(bidResponse))
Expand All @@ -345,8 +337,7 @@ public Future<HookStageExecutionResult<ExitpointPayload>> executeExitpointStage(

final Account account = ObjectUtils.defaultIfNull(auctionContext.getAccount(), EMPTY_ACCOUNT);
final HookExecutionContext context = auctionContext.getHookExecutionContext();

final Endpoint endpoint = context.getEndpoint();
final HookHttpEndpoint endpoint = context.getEndpoint();

return stageExecutor(StageWithHookType.EXITPOINT, ENTITY_HTTP_RESPONSE, context, account, endpoint)
.withInitialPayload(ExitpointPayloadImpl.of(responseHeaders, responseBody))
Expand All @@ -371,7 +362,7 @@ private <PAYLOAD, CONTEXT extends InvocationContext> StageExecutor<PAYLOAD, CONT
String entity,
HookExecutionContext context,
Account account,
Endpoint endpoint) {
HookHttpEndpoint endpoint) {

return stageExecutor(stage, entity, context)
.withModulesExecution(modulesExecutionForAccount(account))
Expand Down Expand Up @@ -400,16 +391,17 @@ private Map<String, Boolean> modulesExecutionForAccount(Account account) {
return DefaultedMap.defaultedMap(resultModulesExecution, !isConfigToInvokeRequired);
}

private StageExecutionPlan planForEntrypointStage(Endpoint endpoint) {
private StageExecutionPlan planForEntrypointStage(HookHttpEndpoint endpoint) {
return effectiveStagePlanFrom(ExecutionPlan.empty(), endpoint, Stage.entrypoint);
}

private StageExecutionPlan planForStage(Account account, Endpoint endpoint, Stage stage) {
private StageExecutionPlan planForStage(Account account, HookHttpEndpoint endpoint, Stage stage) {
return effectiveStagePlanFrom(effectiveExecutionPlanFor(account), endpoint, stage);
}

private StageExecutionPlan effectiveStagePlanFrom(
ExecutionPlan accountExecutionPlan, Endpoint endpoint, Stage stage) {
private StageExecutionPlan effectiveStagePlanFrom(ExecutionPlan accountExecutionPlan,
HookHttpEndpoint endpoint,
Stage stage) {

final StageExecutionPlan hostStageExecutionPlan = stagePlanFrom(hostExecutionPlan, endpoint, stage);
final StageExecutionPlan accountStageExecutionPlan = stagePlanFrom(accountExecutionPlan, endpoint, stage);
Expand All @@ -428,7 +420,10 @@ private StageExecutionPlan effectiveStagePlanFrom(
return StageExecutionPlan.of(combinedGroups);
}

private static StageExecutionPlan stagePlanFrom(ExecutionPlan executionPlan, Endpoint endpoint, Stage stage) {
private static StageExecutionPlan stagePlanFrom(ExecutionPlan executionPlan,
HookHttpEndpoint endpoint,
Stage stage) {

return MapUtils.emptyIfNull(executionPlan.getEndpoints())
.getOrDefault(endpoint, EndpointExecutionPlan.empty())
.getStages()
Expand Down Expand Up @@ -471,23 +466,23 @@ private <PAYLOAD, CONTEXT extends InvocationContext> HookProvider<PAYLOAD, CONTE
return hookId -> hookCatalog.hookById(hookId, stage);
}

private InvocationContextProvider<InvocationContext> invocationContextProvider(Endpoint endpoint) {
private InvocationContextProvider<InvocationContext> invocationContextProvider(HookHttpEndpoint endpoint) {
return (timeout, hookId, moduleContext) -> invocationContext(endpoint, timeout);
}

private InvocationContextImpl invocationContext(Endpoint endpoint, Long timeout) {
return InvocationContextImpl.of(createTimeout(timeout), endpoint);
private InvocationContextImpl invocationContext(HookHttpEndpoint endpoint, Long timeout) {
return InvocationContextImpl.of(createTimeout(timeout), endpoint.httpMethod(), endpoint.endpoint());
}

private InvocationContextProvider<AuctionInvocationContext> auctionInvocationContextProvider(
Endpoint endpoint,
HookHttpEndpoint endpoint,
AuctionContext auctionContext) {

return (timeout, hookId, moduleContext) -> auctionInvocationContext(
endpoint, timeout, auctionContext, hookId, moduleContext);
}

private AuctionInvocationContextImpl auctionInvocationContext(Endpoint endpoint,
private AuctionInvocationContextImpl auctionInvocationContext(HookHttpEndpoint endpoint,
Long timeout,
AuctionContext auctionContext,
HookId hookId,
Expand All @@ -502,7 +497,7 @@ private AuctionInvocationContextImpl auctionInvocationContext(Endpoint endpoint,
}

private InvocationContextProvider<BidderInvocationContext> bidderInvocationContextProvider(
Endpoint endpoint,
HookHttpEndpoint endpoint,
AuctionContext auctionContext,
String bidder) {

Expand Down Expand Up @@ -561,7 +556,6 @@ private static boolean isABTestApplicable(ABTest abTest, String account) {
}

//todo: should it be more strict? e.g. allowing rejecting only imps/bids on the particular stages

private <T> HookStageExecutionResult<T> rejectAll(AuctionContext auctionContext,
HookStageExecutionResult<T> result) {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package org.prebid.server.hooks.execution.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Value;
import org.prebid.server.model.Endpoint;
import org.prebid.server.json.deserializer.ExecutionPlanEndpointsConfigDeserializer;

import java.util.List;
import java.util.Map;
Expand All @@ -15,7 +16,8 @@ public class ExecutionPlan {
@JsonProperty("abtests")
List<ABTest> abTests;

Map<Endpoint, EndpointExecutionPlan> endpoints;
@JsonDeserialize(using = ExecutionPlanEndpointsConfigDeserializer.class)
Map<HookHttpEndpoint, EndpointExecutionPlan> endpoints;

public static ExecutionPlan empty() {
return EMPTY;
Expand Down
Loading
Loading