11package org .prebid .server .bidder .visx ;
22
3- import com .fasterxml .jackson .databind . JsonNode ;
3+ import com .fasterxml .jackson .core . type . TypeReference ;
44import com .fasterxml .jackson .databind .node .ObjectNode ;
55import com .iab .openrtb .request .BidRequest ;
6+ import com .iab .openrtb .request .Device ;
67import com .iab .openrtb .request .Imp ;
78import com .iab .openrtb .response .Bid ;
9+ import io .vertx .core .MultiMap ;
810import org .apache .commons .collections4 .CollectionUtils ;
11+ import org .apache .commons .lang3 .StringUtils ;
912import org .prebid .server .bidder .Bidder ;
1013import org .prebid .server .bidder .model .BidderBid ;
1114import org .prebid .server .bidder .model .BidderCall ;
1821import org .prebid .server .exception .PreBidException ;
1922import org .prebid .server .json .DecodeException ;
2023import org .prebid .server .json .JacksonMapper ;
24+ import org .prebid .server .proto .openrtb .ext .ExtPrebid ;
2125import org .prebid .server .proto .openrtb .ext .response .BidType ;
26+ import org .prebid .server .proto .openrtb .ext .response .ExtBidPrebid ;
27+ import org .prebid .server .proto .openrtb .ext .response .ExtBidPrebidMeta ;
2228import org .prebid .server .util .BidderUtil ;
2329import org .prebid .server .util .HttpUtil ;
2430
2531import java .util .Collection ;
2632import java .util .Collections ;
2733import java .util .List ;
2834import java .util .Objects ;
35+ import java .util .Optional ;
2936import java .util .Set ;
3037
3138public class VisxBidder implements Bidder <BidRequest > {
3239
3340 private static final String DEFAULT_REQUEST_CURRENCY = "USD" ;
3441 private static final Set <String > SUPPORTED_BID_TYPES_TEXTUAL = Set .of ("banner" , "video" );
3542
43+ private static final TypeReference <ExtPrebid <ExtBidPrebid , ?>> BID_EXT_TYPE_REFERENCE = new TypeReference <>() {
44+ };
45+
3646 private final String endpointUrl ;
3747 private final JacksonMapper mapper ;
3848
@@ -43,20 +53,28 @@ public VisxBidder(String endpointUrl, JacksonMapper mapper) {
4353
4454 @ Override
4555 public Result <List <HttpRequest <BidRequest >>> makeHttpRequests (BidRequest request ) {
46- return Result .withValue (makeRequest (request ));
47- }
48-
49- private HttpRequest <BidRequest > makeRequest (BidRequest bidRequest ) {
50- final BidRequest outgoingRequest = modifyRequest (bidRequest );
51- return BidderUtil .defaultRequest (outgoingRequest , endpointUrl , mapper );
56+ final BidRequest outgoingRequest = modifyRequest (request );
57+ return Result .withValue (
58+ BidderUtil .defaultRequest (outgoingRequest , makeHeaders (request .getDevice ()), endpointUrl , mapper ));
5259 }
5360
54- private BidRequest modifyRequest (BidRequest bidRequest ) {
61+ private static BidRequest modifyRequest (BidRequest bidRequest ) {
5562 return CollectionUtils .isEmpty (bidRequest .getCur ())
5663 ? bidRequest .toBuilder ().cur (Collections .singletonList (DEFAULT_REQUEST_CURRENCY )).build ()
5764 : bidRequest ;
5865 }
5966
67+ private static MultiMap makeHeaders (Device device ) {
68+ final MultiMap headers = HttpUtil .headers ();
69+
70+ if (device != null ) {
71+ HttpUtil .addHeaderIfValueIsNotEmpty (headers , HttpUtil .X_FORWARDED_FOR_HEADER , device .getIp ());
72+ HttpUtil .addHeaderIfValueIsNotEmpty (headers , HttpUtil .X_FORWARDED_FOR_HEADER , device .getIpv6 ());
73+ }
74+
75+ return headers ;
76+ }
77+
6078 @ Override
6179 public Result <List <BidderBid >> makeBids (BidderCall <BidRequest > httpCall , BidRequest bidRequest ) {
6280 try {
@@ -80,14 +98,14 @@ private List<BidderBid> bidsFromResponse(BidRequest bidRequest, VisxResponse vis
8098 .map (VisxSeatBid ::getBid )
8199 .filter (Objects ::nonNull )
82100 .flatMap (Collection ::stream )
83- .map (visxBid -> toBidderBid (bidRequest , visxBid ))
101+ .map (visxBid -> toBidderBid (bidRequest , visxBid , visxResponse . getCur () ))
84102 .toList ();
85103 }
86104
87- private BidderBid toBidderBid (BidRequest bidRequest , VisxBid visxBid ) {
105+ private BidderBid toBidderBid (BidRequest bidRequest , VisxBid visxBid , String currency ) {
88106 final Bid bid = toBid (visxBid , bidRequest .getId ());
89107 final BidType bidType = getBidType (bid .getExt (), bid .getImpid (), bidRequest .getImp ());
90- return BidderBid .of (bid , bidType , null );
108+ return BidderBid .of (bid , bidType , StringUtils . defaultIfBlank ( currency , null ) );
91109 }
92110
93111 private static Bid toBid (VisxBid visxBid , String id ) {
@@ -105,20 +123,24 @@ private static Bid toBid(VisxBid visxBid, String id) {
105123 .build ();
106124 }
107125
108- private static BidType getBidType (ObjectNode bidExt , String impId , List <Imp > imps ) {
126+ private BidType getBidType (ObjectNode bidExt , String impId , List <Imp > imps ) {
109127 final BidType extBidType = getBidTypeFromExt (bidExt );
110128 return extBidType != null ? extBidType : getBidTypeFromImp (impId , imps );
111129 }
112130
113- private static BidType getBidTypeFromExt (ObjectNode bidExt ) {
114- final JsonNode mediaTypeNode = bidExt != null ? bidExt .at ("/prebid/meta/mediaType" ) : null ;
115- final String bidTypeTextual = mediaTypeNode != null && mediaTypeNode .isTextual ()
116- ? mediaTypeNode .asText ()
117- : null ;
118-
119- return bidTypeTextual != null && SUPPORTED_BID_TYPES_TEXTUAL .contains (bidTypeTextual )
120- ? BidType .valueOf (bidTypeTextual )
121- : null ;
131+ private BidType getBidTypeFromExt (ObjectNode bidExt ) {
132+ try {
133+ return Optional .ofNullable (bidExt )
134+ .map (ext -> mapper .mapper ().convertValue (bidExt , BID_EXT_TYPE_REFERENCE ))
135+ .map (ExtPrebid ::getPrebid )
136+ .map (ExtBidPrebid ::getMeta )
137+ .map (ExtBidPrebidMeta ::getMediaType )
138+ .filter (SUPPORTED_BID_TYPES_TEXTUAL ::contains )
139+ .map (BidType ::valueOf )
140+ .orElse (null );
141+ } catch (IllegalArgumentException e ) {
142+ return null ;
143+ }
122144 }
123145
124146 private static BidType getBidTypeFromImp (String impId , List <Imp > imps ) {
0 commit comments