88import com .iab .openrtb .response .Bid ;
99import com .iab .openrtb .response .BidResponse ;
1010import com .iab .openrtb .response .SeatBid ;
11- import io .vertx .core .MultiMap ;
1211import org .apache .commons .collections4 .CollectionUtils ;
12+ import org .apache .commons .collections4 .ListUtils ;
1313import org .apache .commons .lang3 .StringUtils ;
1414import org .prebid .server .auction .model .Endpoint ;
1515import org .prebid .server .bidder .Bidder ;
3838import java .util .Collections ;
3939import java .util .List ;
4040import java .util .Objects ;
41+ import java .util .Optional ;
4142
4243public class NativeryBidder implements Bidder <BidRequest > {
4344
@@ -119,7 +120,11 @@ private ExtImpNativery parseImpExt(Imp imp) {
119120 private ExtRequest buildRequestExtWithNativery (ExtRequest originalExt , boolean isAmp , String widgetId ) {
120121 final ExtRequest ext = originalExt != null ? originalExt : ExtRequest .empty ();
121122
122- final ObjectNode nativeryNode = mapper .mapper ().createObjectNode ();
123+ final JsonNode existing = ext .getProperty ("nativery" );
124+ final ObjectNode nativeryNode = existing != null && existing .isObject ()
125+ ? (ObjectNode ) existing
126+ : mapper .mapper ().createObjectNode ();
127+
123128 nativeryNode .put ("isAmp" , isAmp );
124129 if (StringUtils .isNotBlank (widgetId )) {
125130 nativeryNode .put ("widgetId" , widgetId );
@@ -133,17 +138,13 @@ private ExtRequest buildRequestExtWithNativery(ExtRequest originalExt, boolean i
133138 public Result <List <BidderBid >> makeBids (BidderCall <BidRequest > httpCall , BidRequest bidRequest ) {
134139 final List <BidderError > errors = new ArrayList <>();
135140
136- if (httpCall .getResponse () != null && httpCall .getResponse ().getStatusCode () == 204 ) {
137- final MultiMap headers = httpCall .getResponse ().getHeaders ();
138- final String nativeryErr = headers != null ? headers .get (NATIVERY_ERROR_HEADER ) : null ;
139- if (StringUtils .isNotBlank (nativeryErr )) {
140- return Result .withError (BidderError .badInput ("Nativery Error: " + nativeryErr + "." ));
141- }
142- return Result .withError (BidderError .badServerResponse ("No Content" ));
141+ final var response = httpCall .getResponse ();
142+ if (response == null || StringUtils .isBlank (response .getBody ())) {
143+ return Result .withError (BidderError .badServerResponse ("Empty response" ));
143144 }
144145
145146 try {
146- final BidResponse bidResponse = mapper .decodeValue (httpCall . getResponse () .getBody (), BidResponse .class );
147+ final BidResponse bidResponse = mapper .decodeValue (response .getBody (), BidResponse .class );
147148 final List <BidderBid > bidderBids = extractBids (bidResponse , errors );
148149 return Result .of (bidderBids , errors );
149150 } catch (DecodeException e ) {
@@ -172,15 +173,12 @@ private List<BidderBid> extractBids(BidResponse bidResponse, List<BidderError> e
172173 private BidderBid resolveBidderBid (Bid bid , String currency , List <BidderError > errors ) {
173174 try {
174175 final BidExtNativery nativeryExt = parseNativeryExt (bid .getExt ());
175- final String mediaTypeRaw = nativeryExt != null ? nativeryExt .getBidAdMediaType () : null ;
176- final BidType bidType = mapMediaType (mediaTypeRaw );
177176
178- final List < String > advDomains = nativeryExt != null && nativeryExt . getBidAdvDomains () != null
179- ? nativeryExt . getBidAdvDomains ()
180- : Collections .emptyList ();
177+ final BidType bidType = mapMediaType ( nativeryExt . getBidAdMediaType ());
178+ final List < String > advDomains = ListUtils . defaultIfNull (
179+ nativeryExt . getBidAdvDomains (), Collections .emptyList () );
181180
182181 final Bid updatedBid = addBidMeta (bid , mediaTypeString (bidType ), advDomains );
183-
184182 return BidderBid .of (updatedBid , bidType , currency );
185183 } catch (PreBidException e ) {
186184 errors .add (BidderError .badInput (e .getMessage ()));
@@ -216,24 +214,30 @@ private static BidType mapMediaType(String mediaType) {
216214
217215 private static String mediaTypeString (BidType type ) {
218216 return switch (type ) {
219- case banner -> "banner" ;
220- case video -> "video" ;
221- case xNative -> "native" ;
217+ case banner -> type . getName () ;
218+ case video -> type . getName () ;
219+ case xNative -> type . getName () ;
222220 default -> throw new IllegalStateException ("Unexpected value: " + type .getName ());
223221 };
224222 }
225223
226224 private Bid addBidMeta (Bid bid , String mediaType , List <String > advDomains ) {
227225 final ExtBidPrebid prebid = parseExtBidPrebid (bid );
228226
229- final ExtBidPrebidMeta modifiedMeta = (prebid != null && prebid .getMeta () != null
230- ? prebid .getMeta ().toBuilder ()
231- : ExtBidPrebidMeta .builder ())
227+ final List <String > safeAdvDomains = Optional .ofNullable (advDomains )
228+ .orElse (Collections .emptyList ());
229+
230+ final ExtBidPrebidMeta modifiedMeta = Optional .ofNullable (prebid )
231+ .map (ExtBidPrebid ::getMeta )
232+ .map (ExtBidPrebidMeta ::toBuilder )
233+ .orElseGet (ExtBidPrebidMeta ::builder )
232234 .mediaType (mediaType )
233- .advertiserDomains (advDomains )
235+ .advertiserDomains (safeAdvDomains )
234236 .build ();
235237
236- final ExtBidPrebid modifiedPrebid = (prebid != null ? prebid .toBuilder () : ExtBidPrebid .builder ())
238+ final ExtBidPrebid modifiedPrebid = Optional .ofNullable (prebid )
239+ .map (ExtBidPrebid ::toBuilder )
240+ .orElseGet (ExtBidPrebid ::builder )
237241 .meta (modifiedMeta )
238242 .build ();
239243
0 commit comments