Hi, I have a camel rest route like the following
rest("/api/test") .post() .to("direct:test"); from("direct:test"). .toD("http4://localhost/test?bridgeEndpoint=true&throwExceptionOnFailure=false") .toD("http4://localhost/test2?bridgeEndpoint=true&throwExceptionOnFailure=false"); Trouble occurs when the http4://localhost/test route sets a content-length header it gets used for http4://localhost/test2. There are some web servers that use that header to determine request size which if it never gets to the needed length will never close and after a while timeout. This happens despite content-length being in the HttpHeaderFilterStrategy list because in the HttpProducer class there is code like this. So an input stream will still use the header. // fallback as input stream if (answer == null) { // force the body as an input stream since this is the fallback InputStream is = in.getMandatoryBody(InputStream.class); String length = in.getHeader(Exchange.CONTENT_LENGTH, String.class); InputStreamEntity entity = null; if (ObjectHelper.isEmpty(length) ) { entity = new InputStreamEntity(is, -1); } else { entity = new InputStreamEntity(is, Long.parseLong(length)); } if (contentType != null) { entity.setContentType(contentType.toString()); } answer = entity; } I'm assuming there are cases where I might want to explicitly provide the content-length to the request entity. But I'd like to be able to turn it off so it always falls back to -1 (chunked). I'm working around the issue by doing this: from("direct:test"). .toD("http4://localhost/test?bridgeEndpoint=true&throwExceptionOnFailure=false") .setHeader("Content-Length", constant("")) .toD("http4://localhost/test2?bridgeEndpoint=true&throwExceptionOnFailure=false"); But I'd like to suggest creating a more global way to ignore the Content-Length header: // fallback as input stream if (answer == null) { // force the body as an input stream since this is the fallback InputStream is = in.getMandatoryBody(InputStream.class); String length = in.getHeader(Exchange.CONTENT_LENGTH, String.class); InputStreamEntity entity = null; if (ObjectHelper.isEmpty(length) || getEndpoint().getComponent().isForceChunkedRequestEntity()) { entity = new InputStreamEntity(is, -1); } else { entity = new InputStreamEntity(is, Long.parseLong(length)); } if (contentType != null) { entity.setContentType(contentType.toString()); } answer = entity; } Thoughts on this approach? How are other folks dealing with this? Happy to work on a contribution/patch but I wanted to discuss before creating a jira. - Bob
signature.asc
Description: OpenPGP digital signature