2017-01-13 18 views
1

我們使用Twitter的Finagle客戶端,它使用Netty作爲其HTTP客戶端。我們看到了我們的Web服務調用的一個Netty中無法確定響應的HTTP版本,導致Netty 3.10.0.FINAL表示「無效版本格式:<!DOCTYPE」

2017-01-13 11:28:13,825 [finagle/netty3-1] WARN com.twitter.finagle.netty3.channel.ChannelStatsHandler ChannelStatsHandler caught an exception 
java.lang.IllegalArgumentException: invalid version format: <!DOCTYPE 

的Netty的org.jboss.netty.handler.codec.http.HttpVersion類是試圖確定的HTTP版本(HTTP/1.1,HTTP/1.0)基於字符串<!DOCTYPE。這顯然不會起作用。該匹配失敗導致上面的IllegalArgumentException。

因爲這個原因,我沒有在我的應用程序中收到回覆。 Netty引發異常,就是這樣。

我的問題是爲什麼Netty可能使用<!DOCTYPE作爲HttpVersion類中的HTTP版本匹配的輸入。

當我使用CURL調用發生此問題的服務時,我得到了適當的HTTP版本的正確響應。以下是curl返回的HTTP標頭。我也得到了一個合適的身體,這不以<!DOCTYPE開頭。這是一個格式良好的SOAP響應,以<SOAP-ENVELOPE..開頭。

HTTP/1.1 200 OK 
Date: Fri, 13 Jan 2017 12:25:14 GMT 
Server: Apache-Coyote/1.1 
Content-Type: text/xml;charset=utf-8 
Connection: close 
Transfer-Encoding: chunked 

我的猜測是,發生失敗調用,因爲一些itermediate系統會返回一個「破」的反應,我一直無法與捲曲觸發。所以我的第二個問題是,如果系統能夠在沒有Http版本的情況下返回響應,並且我正在考慮以正確的方向進行操作。

回答

0

我們使用的是https,沒有在Finagle客戶端上設置withTls選項。

我們的解決方案是使用com.twitter.finagle.Http.withTls(String hostName)選項來創建欺騙客戶,在我們的特定情況下,還設置Java的SSL上下文TLS 1.2版:

SSLContext sslContext = null; 
try { 
    sslContext = SSLContext.getInstance("TLSv1.2"); 
    SSLContext.setDefault(sslContext); 
} catch (NoSuchAlgorithmException e) { 
    log.error("Failure getting ssl context", e); 
} 

這些變化問題就消失了。