Hi Yeah we should look at improving this. I have logged a ticket https://issues.apache.org/jira/browse/CAMEL-12751
You are welcome to help around and provide unit tests / patches etc. For example as github PRs. We love contributions http://camel.apache.org/contributing On Thu, Aug 16, 2018 at 3:29 PM Bob Paulin <b...@bobpaulin.com> wrote: > > Agree that removeHeader inbetween the routes fixes the problem. It's > great experience having to go through all the code to figure out a > content-length header mismatch is the issue since the request just > hangs. I ran into it again with the following scenerio using the > automatic json binding in the REST DSL with stream caching enabled. > > this.getContext().setStreamCaching(true); > > restConfiguration().component("netty4-http").port(8282).bindingMode(RestBindingMode.json); > > rest("/bind").post() > .type(InputDTO.class) > .outType(OutputDTO.class) > .to("direct:bind"); > > from("direct:bind") > .setHeader(Exchange.HTTP_METHOD, constant("POST")) > .setHeader("Accept", constant("application/json")) > .setHeader(Exchange.HTTP_PATH, constant("")) > .setHeader(Exchange.CONTENT_TYPE, > constant("application/json")) > .process(new Processor() { > > public void process(Exchange exchange) throws > Exception { > InputDTO body = > exchange.getIn().getBody(InputDTO.class); > body.setDescription("SomethingElse"); > > } > }) > .marshal().json(JsonLibrary.Jackson) > .to("http4://localhost/realservice?bridgeEndpoint=true") > .unmarshal().json(JsonLibrary.Jackson, > FinalOutputDTO.class); > > The json coming into /bind is pretty printed so includes spaces and > returns. After it's marshaled to an object and the object is modified > the Content-length will change. Seems like removing the content-length > header in the DataFormat used to do the marshal ling or perhaps > providing an option in the HTTP Client to ignore the content-header > would be useful. Again willing to help collaborate on a patch but I'd > like some input on where it would fit best. Currently thinking either > in the DataFormat marshal methods and/or the HttpProducer. > > - Bob > > On 2017/09/20 13:13:06, Claus Ibsen <c...@gmail.com> wrote: > > You can remove the header before calling the http endpoints, with> > > removeHeader(Exchange.CONTENT_LENGTH)> > > > > On Sat, Sep 16, 2017 at 9:03 PM, Bob Paulin <bo...@bobpaulin.com> wrote:> > > > 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> > > >> > > > > > > > > -- > > > Claus Ibsen> > > -----------------> > > http://davsclaus.com @davsclaus> > > Camel in Action 2: https://www.manning.com/ibsen2> > > -- Claus Ibsen ----------------- http://davsclaus.com @davsclaus Camel in Action 2: https://www.manning.com/ibsen2