【问题标题】:How to add headers when connecting to a websocket in Haskell连接到 Haskell 中的 websocket 时如何添加标头
【发布时间】:2013-08-10 21:46:18
【问题描述】:

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

【问题讨论】:

    标签: haskell websocket mtgox


    【解决方案1】:

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

    【讨论】:

    • 这个问题是关于使用 Javascript WebSockets 发送自定义标头的。当您使用 JavaScript 客户端时,会自动添加一些标准标头,而 MtGox api 需要这些标头。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-03-27
      • 2015-07-29
      • 2018-05-05
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 2015-09-15
      相关资源
      最近更新 更多