'How to log payload of WebClient captured with ClientHttpResponseDecorator?

I created a ClientHttpResponseDecorator to capture parts of the WebClient response.

Question: how can I access my ClientHttpResponseDecorator afterwards, so I can log what I saved in my buffer?

Sidenote: I know I could log in a .doOnTerminate() after .doOnNext() in the getBody() method, but that's not what I want. I only want to capture in this class, and log outside.

public class LoggingConnector implements ClientHttpConnector {
    private final ClientHttpConnector delegate;

    public LoggingConnector(ClientHttpConnector connector) {
        this.delegate = connector;
    }

    @Override
    public Mono<ClientHttpResponse> connect(HttpMethod method, URI uri,
            Function<? super ClientHttpRequest, Mono<Void>> requestCallback) {

        return this.delegate.connect(method, uri, requestCallback).map(LoggingResponse::new);
    }

    private static class LoggingResponse extends ClientHttpResponseDecorator {
        private static final DataBufferFactory bufferFactory = new DefaultDataBufferFactory();
        private final DataBuffer buffer = bufferFactory.allocateBuffer();

        LoggingResponse(ClientHttpResponse delegate) {
            super(delegate);
        }

        @Override
        public Flux<DataBuffer> getBody() {
            return super.getBody()
                    .doOnNext(this.buffer::write); //could be restricted to log only n bytes
        }
    }    
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source