@Override protected Flux<DataBuffer> encode(Resource resource, DataBufferFactory dataBufferFactory, ResolvableType type, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) { if (logger.isDebugEnabled() && !Hints.isLoggingSuppressed(hints)) { String logPrefix = Hints.getLogPrefix(hints); logger.debug(logPrefix + "Writing [" + resource + "]"); } return DataBufferUtils.read(resource, dataBufferFactory, this.bufferSize); }
@Override public Map<String, Object> hints() { return Hints.from(Hints.LOG_PREFIX_HINT, logPrefix); } });
@Override public Mono<MultiValueMap<String, Part>> readMono(ResolvableType elementType, ReactiveHttpInputMessage inputMessage, Map<String, Object> hints) { Map<String, Object> allHints = Hints.merge(hints, Hints.SUPPRESS_LOGGING_HINT, true); return this.partReader.read(elementType, inputMessage, allHints) .collectMultimap(Part::name) .doOnNext(map -> { LogFormatUtils.traceDebug(logger, traceOn -> Hints.getLogPrefix(hints) + "Parsed " + (isEnableLoggingRequestDetails() ? LogFormatUtils.formatValue(map, !traceOn) : "parts " + map.keySet() + " (content masked)")); }) .map(this::toMultiValueMap); }
protected Map<String, Object> getHints(ResolvableType resolvableType) { MethodParameter param = getParameter(resolvableType); if (param != null) { JsonView annotation = getAnnotation(param, JsonView.class); if (annotation != null) { Class<?>[] classes = annotation.value(); Assert.isTrue(classes.length == 1, JSON_VIEW_HINT_ERROR + param); return Hints.from(JSON_VIEW_HINT, classes[0]); } } return Hints.none(); }
@Override protected DataBuffer decodeDataBuffer(DataBuffer buffer, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) { if (logger.isDebugEnabled()) { logger.debug(Hints.getLogPrefix(hints) + "Read " + buffer.readableByteCount() + " bytes"); } return buffer; }
/** * Get decoding hints based on the server request or annotations on the * target controller method parameter. * @param actualType the actual source type to encode, possibly a reactive * wrapper and sourced from {@link org.springframework.core.MethodParameter}, * i.e. providing access to method annotations. * @param elementType the element type within {@code Flux/Mono} that we're * trying to encode. * @param request the current request * @param response the current response * @return a Map with hints, possibly empty */ default Map<String, Object> getEncodeHints(ResolvableType actualType, ResolvableType elementType, @Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response) { return Hints.none(); }
@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); }
final String boundaryString = Hints.getRequiredHint(hints, BOUNDARY_STRING_HINT); byte[] startBoundary = getAsciiBytes("\r\n--" + boundaryString + "\r\n"); byte[] contentType =
@Override protected ByteBuffer decodeDataBuffer(DataBuffer dataBuffer, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) { int byteCount = dataBuffer.readableByteCount(); ByteBuffer copy = ByteBuffer.allocate(byteCount); copy.put(dataBuffer.asByteBuffer()); copy.flip(); DataBufferUtils.release(dataBuffer); if (logger.isDebugEnabled()) { logger.debug(Hints.getLogPrefix(hints) + "Read " + byteCount + " bytes"); } return copy; }
@Override public Map<String, Object> getEncodeHints(@Nullable ResolvableType actualType, ResolvableType elementType, @Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response) { return (actualType != null ? getHints(actualType) : Hints.none()); }
@Override public Mono<Void> write(Publisher<? extends T> inputStream, ResolvableType actualType, ResolvableType elementType, @Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response, Map<String, Object> hints) { Map<String, Object> allHints = Hints.merge(hints, getWriteHints(actualType, elementType, mediaType, request, response)); return write(inputStream, elementType, mediaType, response, allHints); }
protected Map<String, Object> getHints(ResolvableType resolvableType) { MethodParameter param = getParameter(resolvableType); if (param != null) { JsonView annotation = getAnnotation(param, JsonView.class); if (annotation != null) { Class<?>[] classes = annotation.value(); Assert.isTrue(classes.length == 1, JSON_VIEW_HINT_ERROR + param); return Hints.from(JSON_VIEW_HINT, classes[0]); } } return Hints.none(); }
final String boundaryString = Hints.getRequiredHint(hints, BOUNDARY_STRING_HINT); byte[] startBoundary = getAsciiBytes("\r\n--" + boundaryString + "\r\n"); byte[] contentType =
private static MediaType getResourceMediaType( @Nullable MediaType mediaType, Resource resource, Map<String, Object> hints) { if (mediaType != null && mediaType.isConcrete() && !mediaType.equals(MediaType.APPLICATION_OCTET_STREAM)) { return mediaType; } mediaType = MediaTypeFactory.getMediaType(resource).orElse(MediaType.APPLICATION_OCTET_STREAM); if (logger.isDebugEnabled() && !Hints.isLoggingSuppressed(hints)) { logger.debug(Hints.getLogPrefix(hints) + "Resource associated with '" + mediaType + "'"); } return mediaType; }
@Override protected byte[] decodeDataBuffer(DataBuffer dataBuffer, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) { byte[] result = new byte[dataBuffer.readableByteCount()]; dataBuffer.read(result); DataBufferUtils.release(dataBuffer); if (logger.isDebugEnabled()) { logger.debug(Hints.getLogPrefix(hints) + "Read " + result.length + " bytes"); } return result; }
@Override public Map<String, Object> hints() { return Hints.from(Hints.LOG_PREFIX_HINT, logPrefix()); } });
@Override public Mono<MultiValueMap<String, Part>> readMono(ResolvableType elementType, ReactiveHttpInputMessage inputMessage, Map<String, Object> hints) { Map<String, Object> allHints = Hints.merge(hints, Hints.SUPPRESS_LOGGING_HINT, true); return this.partReader.read(elementType, inputMessage, allHints) .collectMultimap(Part::name) .doOnNext(map -> { LogFormatUtils.traceDebug(logger, traceOn -> Hints.getLogPrefix(hints) + "Parsed " + (isEnableLoggingRequestDetails() ? LogFormatUtils.formatValue(map, !traceOn) : "parts " + map.keySet() + " (content masked)")); }) .map(this::toMultiValueMap); }
private Map<String, Object> getEncodeHints(ResolvableType actualType, ResolvableType elementType, @Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response) { if (this.encoder instanceof HttpMessageEncoder) { HttpMessageEncoder<?> encoder = (HttpMessageEncoder<?>) this.encoder; return encoder.getEncodeHints(actualType, elementType, mediaType, request, response); } return Hints.none(); }
@Override public Flux<T> read(ResolvableType actualType, ResolvableType elementType, ServerHttpRequest request, ServerHttpResponse response, Map<String, Object> hints) { Map<String, Object> allHints = Hints.merge(hints, getReadHints(actualType, elementType, request, response)); return read(elementType, request, allHints); }
protected Map<String, Object> getHints(ResolvableType resolvableType) { MethodParameter param = getParameter(resolvableType); if (param != null) { JsonView annotation = getAnnotation(param, JsonView.class); if (annotation != null) { Class<?>[] classes = annotation.value(); Assert.isTrue(classes.length == 1, JSON_VIEW_HINT_ERROR + param); return Hints.from(JSON_VIEW_HINT, classes[0]); } } return Hints.none(); }