如何在Haskell中连接到websocket时添加标头

时间:2013-08-04 00:03:52

标签: haskell websocket mtgox

我正在尝试创建一个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发送的相同标题,因为它可行。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我没有使用connect,而是使用了connectWith,它允许设置“Origin”标头。虽然我看不到如何添加任何其他标题,但这是MtGox要求的标题。只要我提供一个原点,使用某种基于http的网址,它就会成功连接。

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

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