@Override protected void extendObjectWriters(List<HttpMessageWriter<?>> objectWriters) { objectWriters.add(new ServerSentEventHttpMessageWriter(getSseEncoder())); }
@Override public Mono<Void> write(Publisher<?> input, ResolvableType actualType, ResolvableType elementType, @Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response, Map<String, Object> hints) { Map<String, Object> allHints = Hints.merge(hints, getEncodeHints(actualType, elementType, mediaType, request, response)); return write(input, elementType, mediaType, response, allHints); }
@Override public Mono<Void> write(Publisher<?> input, ResolvableType elementType, @Nullable MediaType mediaType, ReactiveHttpOutputMessage message, Map<String, Object> hints) { mediaType = (mediaType != null && mediaType.getCharset() != null ? mediaType : DEFAULT_MEDIA_TYPE); DataBufferFactory bufferFactory = message.bufferFactory(); message.getHeaders().setContentType(mediaType); return message.writeAndFlushWith(encode(input, elementType, mediaType, bufferFactory, hints)); }
Object data = sse.data(); if (id != null) { writeField("id", id, sb); writeField("event", event, sb); writeField("retry", retry.toMillis(), sb); return Flux.concat(encodeText(sb, mediaType, factory), encodeData(data, valueType, mediaType, factory, hints), encodeText("\n", mediaType, factory)) .doOnDiscard(PooledDataBuffer.class, DataBufferUtils::release); });
@SuppressWarnings("unchecked") private <T> Flux<DataBuffer> encodeData(@Nullable T data, ResolvableType valueType, MediaType mediaType, DataBufferFactory factory, Map<String, Object> hints) { if (data == null) { return Flux.empty(); } if (data instanceof String) { String text = (String) data; return Flux.from(encodeText(StringUtils.replace(text, "\n", "\ndata:") + "\n", mediaType, factory)); } if (this.encoder == null) { return Flux.error(new CodecException("No SSE encoder configured and the data is not String.")); } return ((Encoder<T>) this.encoder) .encode(Mono.just(data), factory, valueType, mediaType, hints) .concatWith(encodeText("\n", mediaType, factory)); }
private <T> void testWrite( Publisher<T> source, MediaType mediaType, MockServerHttpResponse response, Class<T> clazz) { Mono<Void> result = this.messageWriter.write(source, forClass(clazz), mediaType, response, HINTS); StepVerifier.create(result) .verifyComplete(); }
Object data = sse.data(); if (id != null) { writeField("id", id, sb); writeField("event", event, sb); writeField("retry", retry.toMillis(), sb); return Flux.concat(encodeText(sb, mediaType, factory), encodeData(data, valueType, mediaType, factory, hints), encodeText("\n", mediaType, factory)) .doOnDiscard(PooledDataBuffer.class, DataBufferUtils::release); });
@SuppressWarnings("unchecked") private <T> Flux<DataBuffer> encodeData(@Nullable T data, ResolvableType valueType, MediaType mediaType, DataBufferFactory factory, Map<String, Object> hints) { if (data == null) { return Flux.empty(); } if (data instanceof String) { String text = (String) data; return Flux.from(encodeText(StringUtils.replace(text, "\n", "\ndata:") + "\n", mediaType, factory)); } if (this.encoder == null) { return Flux.error(new CodecException("No SSE encoder configured and the data is not String.")); } return ((Encoder<T>) this.encoder) .encode(Mono.just(data), factory, valueType, mediaType, hints) .concatWith(encodeText("\n", mediaType, factory)); }
@Override protected void extendObjectWriters(List<HttpMessageWriter<?>> objectWriters) { objectWriters.add(new ServerSentEventHttpMessageWriter(getSseEncoder())); }
Object data = sse.data(); if (id != null) { writeField("id", id, sb); writeField("event", event, sb); writeField("retry", retry.toMillis(), sb); return Flux.concat(encodeText(sb, mediaType, factory), encodeData(data, valueType, mediaType, factory, hints), encodeText("\n", mediaType, factory)); });
@Override public Mono<Void> write(Publisher<?> input, ResolvableType actualType, ResolvableType elementType, @Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response, Map<String, Object> hints) { Map<String, Object> allHints = Hints.merge(hints, getEncodeHints(actualType, elementType, mediaType, request, response)); return write(input, elementType, mediaType, response, allHints); }
@Override public Mono<Void> write(Publisher<?> input, ResolvableType elementType, @Nullable MediaType mediaType, ReactiveHttpOutputMessage message, Map<String, Object> hints) { mediaType = (mediaType != null && mediaType.getCharset() != null ? mediaType : DEFAULT_MEDIA_TYPE); DataBufferFactory bufferFactory = message.bufferFactory(); message.getHeaders().setContentType(mediaType); return message.writeAndFlushWith(encode(input, elementType, mediaType, bufferFactory, hints)); }
@SuppressWarnings("unchecked") private <T> Flux<DataBuffer> encodeData(@Nullable T data, ResolvableType valueType, MediaType mediaType, DataBufferFactory factory, Map<String, Object> hints) { if (data == null) { return Flux.empty(); } if (data instanceof String) { String text = (String) data; return Flux.from(encodeText(text.replaceAll("\\n", "\ndata:") + "\n", mediaType, factory)); } if (this.encoder == null) { return Flux.error(new CodecException("No SSE encoder configured and the data is not String.")); } return ((Encoder<T>) this.encoder) .encode(Mono.just(data), factory, valueType, mediaType, hints) .concatWith(encodeText("\n", mediaType, factory)); }
@Before public void createContext() { final List<HttpMessageWriter<?>> messageWriters = new ArrayList<>(); messageWriters.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder())); messageWriters.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly())); messageWriters.add(new ResourceHttpMessageWriter()); messageWriters.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder())); Jackson2JsonEncoder jsonEncoder = new Jackson2JsonEncoder(); messageWriters.add(new EncoderHttpMessageWriter<>(jsonEncoder)); messageWriters.add(new ServerSentEventHttpMessageWriter(jsonEncoder)); messageWriters.add(new FormHttpMessageWriter()); messageWriters.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes())); messageWriters.add(new MultipartHttpMessageWriter(messageWriters)); this.context = new BodyInserter.Context() { @Override public List<HttpMessageWriter<?>> messageWriters() { return messageWriters; } @Override public Optional<ServerHttpRequest> serverRequest() { return Optional.empty(); } @Override public Map<String, Object> hints() { return hints; } }; this.hints = new HashMap<>(); }
Object data = sse.data(); if (id != null) { writeField("id", id, sb); writeField("event", event, sb); writeField("retry", retry.toMillis(), sb); return Flux.concat(encodeText(sb, mediaType, factory), encodeData(data, valueType, mediaType, factory, hints), encodeText("\n", mediaType, factory)) .doOnDiscard(PooledDataBuffer.class, DataBufferUtils::release); });
@Override public Mono<Void> write(Publisher<?> input, ResolvableType actualType, ResolvableType elementType, @Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response, Map<String, Object> hints) { Map<String, Object> allHints = new HashMap<>(); allHints.putAll(getEncodeHints(actualType, elementType, mediaType, request, response)); allHints.putAll(hints); return write(input, elementType, mediaType, response, allHints); }
@Override public Mono<Void> write(Publisher<?> input, ResolvableType elementType, @Nullable MediaType mediaType, ReactiveHttpOutputMessage message, Map<String, Object> hints) { mediaType = (mediaType != null && mediaType.getCharset() != null ? mediaType : DEFAULT_MEDIA_TYPE); DataBufferFactory bufferFactory = message.bufferFactory(); message.getHeaders().setContentType(mediaType); return message.writeAndFlushWith(encode(input, elementType, mediaType, bufferFactory, hints)); }
@SuppressWarnings("unchecked") private <T> Flux<DataBuffer> encodeData(@Nullable T data, ResolvableType valueType, MediaType mediaType, DataBufferFactory factory, Map<String, Object> hints) { if (data == null) { return Flux.empty(); } if (data instanceof String) { String text = (String) data; return Flux.from(encodeText(StringUtils.replace(text, "\n", "\ndata:") + "\n", mediaType, factory)); } if (this.encoder == null) { return Flux.error(new CodecException("No SSE encoder configured and the data is not String.")); } return ((Encoder<T>) this.encoder) .encode(Mono.just(data), factory, valueType, mediaType, hints) .concatWith(encodeText("\n", mediaType, factory)); }
private static String getBody(ClientRequest request) { final List<HttpMessageWriter<?>> messageWriters = new ArrayList<>(); messageWriters.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder())); messageWriters.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly())); messageWriters.add(new ResourceHttpMessageWriter()); Jackson2JsonEncoder jsonEncoder = new Jackson2JsonEncoder(); messageWriters.add(new EncoderHttpMessageWriter<>(jsonEncoder)); messageWriters.add(new ServerSentEventHttpMessageWriter(jsonEncoder)); messageWriters.add(new FormHttpMessageWriter()); messageWriters.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes())); messageWriters.add(new MultipartHttpMessageWriter(messageWriters)); BodyInserter.Context context = new BodyInserter.Context() { @Override public List<HttpMessageWriter<?>> messageWriters() { return messageWriters; } @Override public Optional<ServerHttpRequest> serverRequest() { return Optional.empty(); } @Override public Map<String, Object> hints() { return new HashMap<>(); } }; MockClientHttpRequest body = new MockClientHttpRequest(HttpMethod.GET, "/"); request.body().insert(body, context).block(); return body.getBodyAsString().block(); }
@Override public Mono<Void> write(Publisher<?> input, ResolvableType actualType, ResolvableType elementType, @Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response, Map<String, Object> hints) { Map<String, Object> allHints = Hints.merge(hints, getEncodeHints(actualType, elementType, mediaType, request, response)); return write(input, elementType, mediaType, response, allHints); }