Por que meu ClientHttpRequestInterceptor personalizado com resposta vazia
Fiz o seguinte para o meu interceptor de log personalizado
public class HttpLoggingInterceptor implements ClientHttpRequestInterceptor {
private final static Logger log = LoggerFactory.getLogger(HttpLoggingInterceptor.class);
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
logRequest(request, body);
ClientHttpResponse response = execution.execute(request, body);
logResponse(response);
return response;
}
private void logRequest(HttpRequest request, byte[] body) throws IOException {
log.info("Request URI : {}, Method : {}, Headers : {}, Request body : {}", request.getURI(), request.getMethod(), request.getHeaders(), new String(body, "UTF-8"));
}
private void logResponse(ClientHttpResponse response) throws IOException {
log.info("Response Status code : {}, Status text : {}, Headers : {}, Response body: {}", response.getStatusCode(), response.getStatusText(), response.getHeaders(), StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
}
}
E eu estou definindo o interceptador para o resto
@Autowired
public RestTemplate restTemplate;
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
List<ClientHttpRequestInterceptor> clientHttpRequestInterceptors = new ArrayList<>();
clientHttpRequestInterceptors.add(new HttpLoggingInterceptor());
// clientHttpRequestInterceptors.addAll(restTemplate.getInterceptors());
restTemplate.setInterceptors(clientHttpRequestInterceptors);
// restTemplate.setInterceptors(Collections.singletonList(new HttpLoggingInterceptor()));
}
O criador de logs está imprimindo a resposta adequadamente no console, mas no final a resposta é retornada vazia para o chamador. Não consigo depurar e descobrir.
Eu descobri que oStreamUtils.copyToString(response.getBody(), Charset.defaultCharset())
está lendo o fluxo de entrada uma vez e não mantém mais o corpo da resposta (que está vazio agora)
Alguém mais enfrentou o mesmo problema e tem alguma idéia de duplicar o InputStream sem lê-lo no InputStream original?