Skip to content

Commit 02f61e3

Browse files
committed
Fix failing test in CancelWithoutDemandCodecTests
The test started failing after recent commit e370c15. See gh-29038
1 parent 6d5fa89 commit 02f61e3

File tree

1 file changed

+19
-28
lines changed

1 file changed

+19
-28
lines changed

spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Encoder.java

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import com.fasterxml.jackson.databind.SequenceWriter;
3737
import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
3838
import com.fasterxml.jackson.databind.ser.FilterProvider;
39-
import org.apache.commons.logging.Log;
4039
import org.reactivestreams.Publisher;
4140
import reactor.core.publisher.Flux;
4241
import reactor.core.publisher.Mono;
@@ -182,20 +181,23 @@ public Flux<DataBuffer> encode(Publisher<?> inputStream, DataBufferFactory buffe
182181
// Do not prepend JSON array prefix until first signal is known, onNext vs onError
183182
// Keeps response not committed for error handling
184183

185-
Flux<DataBuffer> flux1 = helper.getPrefix(bufferFactory, hints, logger)
186-
.concatWith(Flux.just(EMPTY_BUFFER).repeat());
184+
dataBufferFlux = Flux.from(inputStream)
185+
.map(value -> {
186+
byte[] prefix = helper.getPrefix();
187+
byte[] delimiter = helper.getDelimiter();
187188

188-
Flux<DataBuffer> flux2 = Flux.from(inputStream).map(value -> encodeStreamingValue(
189-
value, bufferFactory, hints, sequenceWriter, byteBuilder, helper.getDelimiter(), EMPTY_BYTES));
189+
DataBuffer dataBuffer = encodeStreamingValue(
190+
value, bufferFactory, hints, sequenceWriter, byteBuilder, delimiter, EMPTY_BYTES);
190191

191-
dataBufferFlux = Flux.zip(flux1, flux2, (buffer1, buffer2) ->
192-
(buffer1 != EMPTY_BUFFER ?
193-
bufferFactory.join(Arrays.asList(buffer1, buffer2)) :
194-
buffer2))
195-
.concatWith(helper.getSuffix(bufferFactory, hints, logger));
192+
return (prefix.length > 0 ?
193+
bufferFactory.join(Arrays.asList(bufferFactory.wrap(prefix), dataBuffer)) :
194+
dataBuffer);
195+
})
196+
.concatWith(Mono.fromCallable(() -> bufferFactory.wrap(helper.getSuffix())));
196197
}
197198

198199
return dataBufferFlux
200+
.doOnNext(dataBuffer -> Hints.touchDataBuffer(dataBuffer, hints, logger))
199201
.doAfterTerminate(() -> {
200202
try {
201203
byteBuilder.release();
@@ -420,33 +422,22 @@ private static class JsonArrayJoinHelper {
420422

421423
private static final byte[] CLOSE_BRACKET = {']'};
422424

423-
424-
private boolean afterFirstItem = false;
425+
private boolean firstItemEmitted;
425426

426427
public byte[] getDelimiter() {
427-
if (this.afterFirstItem) {
428+
if (this.firstItemEmitted) {
428429
return COMMA_SEPARATOR;
429430
}
430-
this.afterFirstItem = true;
431+
this.firstItemEmitted = true;
431432
return EMPTY_BYTES;
432433
}
433434

434-
public Mono<DataBuffer> getPrefix(DataBufferFactory factory, @Nullable Map<String, Object> hints, Log logger) {
435-
return wrapBytes(OPEN_BRACKET, factory, hints, logger);
436-
}
437-
438-
public Mono<DataBuffer> getSuffix(DataBufferFactory factory, @Nullable Map<String, Object> hints, Log logger) {
439-
return wrapBytes(CLOSE_BRACKET, factory, hints, logger);
435+
public byte[] getPrefix() {
436+
return (this.firstItemEmitted ? EMPTY_BYTES : OPEN_BRACKET);
440437
}
441438

442-
private Mono<DataBuffer> wrapBytes(
443-
byte[] bytes, DataBufferFactory bufferFactory, @Nullable Map<String, Object> hints, Log logger) {
444-
445-
return Mono.fromCallable(() -> {
446-
DataBuffer buffer = bufferFactory.wrap(bytes);
447-
Hints.touchDataBuffer(buffer, hints, logger);
448-
return buffer;
449-
});
439+
public byte[] getSuffix() {
440+
return CLOSE_BRACKET;
450441
}
451442
}
452443

0 commit comments

Comments
 (0)