【问题标题】:Connect through squid proxy with pusher lib通过 squid 代理与 pusher lib 连接
【发布时间】: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


【解决方案1】:

我不知道你是如何解决这个问题的,因为我最近遇到了同样的问题。

该 URL 在内部 squid 代理中被列入白名单,但是 Pusher java 客户端库的当前实现的问题是(Pusher 的 java-websocket 客户端的 1.4.1 版),构造函数使用主机地址创建 InetAddress (ws.pusherapp.com),这会导致 URL 被解析为 IP 地址。

库然后尝试打开一个套接字(使用代理),到解析的 IP 地址,而不是使用 URL 地址打开一个套接字连接。这对于代理来说是有问题的,因为 Pusher 使用 AWS,并且 URL 被动态解析为随机的 AWS IP 地址。

我可以通过修补 WebSocketClient.java 包中的 WebSocketClient.java 来改变这种行为,如下所示

public void run() 方法中,原行是:

this.socket.connect(new InetSocketAddress(this.uri.getHost(), this.getPort()), this.connectTimeout);

我替换为 this.socket.connect(InetSocketAddress.createUnresolved(this.uri.getHost(), this.uri.getPort()), this.connectTimeout);

InetScoketAddress 的第二个构造函数不使用 DNS 来解析 URL,并且库使用 URL 地址向 Pusher 服务器发出请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多