1

我正在尝试创建一个 WebSocket 客户端以连接到现有服务器(mtgox api)。

作为一个起点,为了弄清楚连接到 WebSockets,我找到了这个示例代码https://github.com/jaspervdj/websockets/blob/master/example/client.hs

问题是 Mtgox 需要在连接时发送标头,我只是不确定如何发送它们。

更新:为了帮助解决这个问题,我也创建了一个简单的 websocket 服务器。当我从 Chrome JavaScript 控制台通过 JavaScript WebSocket 连接到它时,我看到以下标题:

 requestHeaders = [("Upgrade","websocket"),("Connection","Upgrade"),
("Host","127.0.0.1:8001"),("Origin","chrome://newtab"),("Pragma","no-cache"),
("Cache-Control","no-cache"),("Sec-WebSocket-Key","yOsPEMHx9AyT9u3ssNma/Q=="),
("Sec-WebSocket-Version","13"),("Sec-WebSocket-Extensions","x-webkit-deflate-frame"),
("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36")]

然而,当我通过 Haskell 客户端连接时,我只看到以下标题:

requestHeaders = [("Host","127.0.0.1"),("Connection","Upgrade"),
("Upgrade","websocket"),("Sec-WebSocket-Key","X3hMDW4fAau53dbz7w4MTw=="),
("Sec-WebSocket-Version","13")]

我不知道 MtGox 实际需要哪些标头,但我的计划是只发送与 Chrome 发送的相同的标头,因为这样可以。

4

2 回答 2

0

而不是使用connectI used connectWith,它允许设置“Origin”标题。虽然我看不到如何添加任何其他标题,但这是 MtGox 需要的。只要我提供一个来源,以及某种基于 http 的 url,它就可以成功连接。

WS.connectWith "websocket.mtgox.com" 80 "/mtgox" (Just "http://anything") Nothing app

似乎几乎没有必要添加任何进一步的标头,并且大概这就是为什么没有提供任何机制的原因。但是,查看source,可以通过复制粘贴代码connectWithconnectWithSocket更改添加到 Request 对象的标头。

于 2013-08-10T13:23:12.617 回答
0

根据以下答案,除了 WebSocket-Protocol 标头之外不可能: HTTP headers in Websockets client API

于 2013-08-04T00:07:49.430 回答