I’m using a class implementing ClientRequestFilter
JavaScript
x
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
logger.trace(F_SEPARATOR);
logger.trace(String.format(F_REQUEST, requestContext.getMethod(), requestContext.getUri()));
requestContext.getHeaders()
.keySet()
.stream()
.sorted()
.forEach(key -> {
logger.trace(String.format(F_HEADER, key, requestContext.getHeaders().get(key)));
});
if (requestContext.hasEntity()) {
if(requestContext.getHeaders().get("Content-Type").get(0).toString().equals("multipart/form-data")) {
FormDataMultiPart formDataMultiPart = (FormDataMultiPart) requestContext.getEntity();
logger.trace(String.format(F_PART_NUMBER, formDataMultiPart.getBodyParts().size()));
AtomicInteger index = new AtomicInteger(1);
formDataMultiPart.getBodyParts().stream()
.forEach(bodyPart -> {
logger.trace(String.format(F_PART + F_PART_CONTENT_TYPE, index.get(), requestContext.getMediaType().toString()));
if(bodyPart.getMediaType().toString().equals("text/xml")) {
StreamDataBodyPart streamDataBodyPart = (StreamDataBodyPart) bodyPart;
String part = new BufferedReader(
new InputStreamReader(streamDataBodyPart.getStreamEntity(), StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("n"));
logger.trace(String.format(F_PART + F_PART_CONTENT, index.get(), part));
}
index.getAndIncrement();
});
}
}
requestContext.setProperty(PROPERTY_NANOS, System.nanoTime());
}
It is working fine except that after being logged the bodypart stream seems to be consumed and is not sent with the request. How can I do to display the bodypart stream and make it again available for the request itself ?
For the response it was the same problem and I managed to have it working with
JavaScript
if (responseContext.hasEntity()) {
InputStream entityStream = responseContext.getEntityStream();
byte[] bytes = IOUtils.toByteArray(entityStream);
responseContext.setEntityStream(new ByteArrayInputStream(bytes));
String entity = new String(bytes);
logger.trace(String.format(F_ENTITY, entity));
}
Solution 1 : buffuring the stream.
JavaScript
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
ClientRequest clientRequest = (ClientRequest) requestContext;
clientRequest.enableBuffering();
logger.trace(F_SEPARATOR);
logger.trace(String.format(F_REQUEST, clientRequest.getMethod(), clientRequest.getUri()));
clientRequest.getHeaders()
.keySet()
.stream()
.sorted()
.forEach(key -> {
logger.trace(String.format(F_HEADER, key, clientRequest.getHeaders().get(key)));
});
if (clientRequest.hasEntity()) {
if(clientRequest.getHeaders().get("Content-Type").get(0).toString().equals("multipart/form-data")) {
FormDataMultiPart formDataMultiPart = (FormDataMultiPart) clientRequest.getEntity();
logger.trace(String.format(F_PART_NUMBER, formDataMultiPart.getBodyParts().size()));
AtomicInteger index = new AtomicInteger(1);
formDataMultiPart.getBodyParts().stream()
.forEach(bodyPart -> {
logger.trace(String.format(F_PART + F_PART_CONTENT_TYPE, index.get(), clientRequest.getMediaType().toString()));
if(bodyPart.getMediaType().toString().equals("text/xml")) {
StreamDataBodyPart streamDataBodyPart = (StreamDataBodyPart) bodyPart;
String part = new BufferedReader(
new InputStreamReader(streamDataBodyPart.getStreamEntity(), StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("n"));
logger.trace(String.format(F_PART + F_PART_CONTENT, index.get(), part));
}
index.getAndIncrement();
});
}
}
clientRequest.setProperty(PROPERTY_NANOS, System.nanoTime());
}
But it is still not working.
Advertisement
Answer
My working solution
JavaScript
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
ClientRequest clientRequest = (ClientRequest) requestContext;
clientRequest.enableBuffering();
logger.trace(F_SEPARATOR);
logger.trace(String.format(F_REQUEST, clientRequest.getMethod(), clientRequest.getUri()));
clientRequest.getHeaders()
.keySet()
.stream()
.sorted()
.forEach(key -> {
logger.trace(String.format(F_HEADER, key, clientRequest.getHeaders().get(key)));
});
if (clientRequest.hasEntity()) {
if(clientRequest.getHeaders().get("Content-Type").get(0).toString().equals("multipart/form-data")) {
FormDataMultiPart formDataMultiPart = (FormDataMultiPart) clientRequest.getEntity();
logger.trace(String.format(F_PART_NUMBER, formDataMultiPart.getBodyParts().size()));
AtomicInteger index = new AtomicInteger(1);
formDataMultiPart.getBodyParts().stream()
.forEach(bodyPart -> {
logger.trace(String.format(F_PART + F_PART_CONTENT_TYPE, index.get(), bodyPart.getMediaType().toString()));
if(bodyPart.getMediaType().toString().equals("text/xml")) {
byte[] bytes = null;
try {
bytes = IOUtils.toByteArray(((StreamDataBodyPart)bodyPart).getStreamEntity());
logger.trace(String.format(F_PART + F_PART_CONTENT, index.get(), new String(bytes)));
} catch (IOException e) {
e.printStackTrace();
}
((StreamDataBodyPart) bodyPart).setStreamEntity(new ByteArrayInputStream(bytes));
}
index.getAndIncrement();
});
}
}
clientRequest.setProperty(PROPERTY_NANOS, System.nanoTime());
}