2013-01-16 65 views
0

路线:骆驼http4组件411坏的Content-Length

from("direct:start") 
    .setProperty(Exchange.CHARSET_NAME, constant("iso-8859-1")) 
    .process(new Processor() {    
     @Override 
     public void process(Exchange exchange) throws Exception { 
      Message m = exchange.getOut(); 
      m.setBody(exchange.getIn().getBody()); 
      m.setHeader(Exchange.HTTP_METHOD, HttpMethods.POST); 
      m.setHeader(Exchange.CONTENT_ENCODING, "gzip"); 
      m.setHeader(Exchange.CONTENT_LENGTH, m.getBody(byte[].class).length); 
      m.setHeader(HttpHeaders.CONTENT_TYPE, "application/xml"); 
      m.setHeader(Exchange.HTTP_CHARACTER_ENCODING, "iso-8859-1"); 
      m.setHeader(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate");   
     } 
    }) 
    .marshal().gzip() 
    .to("http4://remote.com/path") 
    .unmarshal().gzip(); 

什么我送:

String body = "<?xmlversion=\"1.0\"encoding=\"ISO-8859-1\"?><theXml></theXml>"; 
producer.sendBody(body); 

我越来越

HTTP操作失败,调用http://remote.com/path用的StatusCode: 411

这条路线有什么遗漏/错误?

编辑

正确的路线会

from("direct:start") 
    .process(new Processor() {    
     @Override 
     public void process(Exchange exchange) throws Exception { 
      Message m = exchange.getOut(); 
      m.setBody(exchange.getIn().getBody()); 
      m.setHeader(Exchange.HTTP_METHOD, HttpMethods.POST); 
      m.setHeader(Exchange.CONTENT_ENCODING, "gzip"); 
      m.setHeader(Exchange.CONTENT_TYPE, "application/xml");   
     } 
    }) 
    // http4 takes care of compressing/decompressing gzip 
    .to("http4://remote.com/path") 

但现在我有一个问题:在远程服务器不处理“传输编码:Chuncked”,这似乎是默认方式camel-http4做到了。 而我不知道如何关闭Chunked

参见下一个问题How to turn off “Transfer-Encoding Chuncked” in Camel-http4?

+0

嗯。 HTTP状态代码非常清晰 - 服务器期待Content-Length标题......但您明确地在请求中设置了一个。 – Charles

回答

1

您从未编码数据的长度设置内容长度。它应该是传输数据的长度。参考这个SO问题: content-length when using http compression

顺便说一句,你真的需要gzip的数据格式? 有骆驼发送GZIPed数据的单元测试。

https://svn.apache.org/repos/asf/camel/trunk/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpCompressionTest.java

+0

你是对的,这是不需要的!现在它是好的,但后来我发现了另一个问题......远程服务器不处理“传输编码:分块”,但我不知道如何禁用它在camel-http4 – redben