我正在尝试创建一个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发送的相同标头,因为这是有效的。
根据以下答案,除了WebSocket协议标头之外,这是不可能的:Websockets客户端API 中的HTTP头
我没有使用connect
,而是使用了connectWith
,这允许设置"Origin"标头。虽然我看不出如何添加任何其他标头,但这是MtGox所需要的。只要我提供一个来源,带有某种基于http的url,它就会成功连接。
WS.connectWith "websocket.mtgox.com" 80 "/mtgox" (Just "http://anything") Nothing app
似乎基本上没有必要添加任何进一步的头,这大概就是为什么没有提供任何机制的原因。但是,从源代码来看,可以通过复制粘贴connectWith
和connectWithSocket
的代码来更改添加到Request对象的头。