【发布时间】:2017-08-09 02:44:24
【问题描述】:
我必须连接到托管在 pusher 上的 websocket,他们提供了一个 lib。
我设法通过一个 cntlm 代理使其在我的开发环境中工作,我的 connectionEventListener 有这样的日志
New state for pusher connection: CONNECTING -> CONNECTED
private final ConnectionEventListener connectionEventListener = new ConnectionEventListener() {
@Override
public void onConnectionStateChange(ConnectionStateChange connectionStateChange) {
log.info("New state for pusher connection: {} -> {}",
connectionStateChange.getPreviousState(),
connectionStateChange.getCurrentState());
}
@Override
public void onError(String s, String s1, Exception e) {
log.error("Some error {} - {} - {}", s, s1, e);
}
};
问题出在我们的预生产环境中,它位于 squid 代理 (v.3.5.12) 后面,我在日志中得到了这个:
New state for pusher connection: DISCONNECTED -> CONNECTING
Exception in thread "Thread-8" java.lang.InternalError: Should not reach here
at java.net.HttpConnectSocketImpl.doTunneling(HttpConnectSocketImpl.java:181)
at java.net.HttpConnectSocketImpl.doTunnel(HttpConnectSocketImpl.java:168)
at java.net.HttpConnectSocketImpl.access$200(HttpConnectSocketImpl.java:44)
at java.net.HttpConnectSocketImpl$2.run(HttpConnectSocketImpl.java:151)
at java.net.HttpConnectSocketImpl$2.run(HttpConnectSocketImpl.java:149)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.HttpConnectSocketImpl.privilegedDoTunnel(HttpConnectSocketImpl.java:148)
at java.net.HttpConnectSocketImpl.connect(HttpConnectSocketImpl.java:111)
at java.net.Socket.connect(Socket.java:589)
at com.pusher.java_websocket.client.WebSocketClient.run(WebSocketClient.java:165)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at java.net.HttpConnectSocketImpl.doTunneling(HttpConnectSocketImpl.java:179)
... 10 more
Caused by: java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 403 Forbidden"
at sun.net.www.protocol.http.HttpURLConnection.doTunneling(HttpURLConnection.java:2084)
... 15 more
我的问题是,是否有人设法在 squid 代理后面的 java 中的 pusher 中使用 websocket。
更新: 问题解决了,我们的 squid 代理缺少一些允许连接的规则。
【问题讨论】:
-
根错误是代理返回“HTTP/1.1 403 Forbidden”,这表明您需要某种身份验证或设置一些权限才能连接。 squid 代理有登录要求吗?或者在预生产环境中它背后的服务器是否需要你登录。
-
身份验证是关键,我们添加了一些规则以允许来自部署守护程序的机器的所有流量。但是我们还有其他一些规则取消了这一规则。问题解决了。
标签: java websocket proxy squid pusher