Haskell 使用http客户端tls连接到Azure Datamarket时管道断开 这现在是hs-tls中的一个。

Haskell 使用http客户端tls连接到Azure Datamarket时管道断开 这现在是hs-tls中的一个。,haskell,https,bing-translator-api,Haskell,Https,Bing Translator Api,在我可以使用bing翻译api之前,我必须这样做。这基本上相当于以下代码片段,它在curl curl -Lp --data-urlencode client_id=$APPID \ --data-urlencode client_secret=$SECRET \ --data-urlencode scope='http://api.microsofttranslator.com' \ --data-urlencode grant_type="

在我可以使用bing翻译api之前,我必须这样做。这基本上相当于以下代码片段,它在
curl

curl -Lp --data-urlencode client_id=$APPID \
         --data-urlencode client_secret=$SECRET \
         --data-urlencode scope='http://api.microsofttranslator.com' \
         --data-urlencode grant_type="client_credentials" \
         https://datamarket.accesscontrol.windows.net/v2/OAuth2-13
并立即使用包含令牌的JSON进行响应。请记住,即使是错误/格式错误的请求也会引发一些包含错误消息的响应,尽管通常也是400错误请求HTTP响应代码

当我尝试在Haskell中复制时,它立即失败(重新格式化):
似乎datamarket.accesscontrol.windows.net不喜欢Haskell的TLS实现

您可以通过以下操作添加TLS数据包的日志记录:

连接
程序包中,对
网络/连接.hs

添加
import Network.TLS((日志(..))

按如下所示修改
tlsesstablish

  tlsEstablish :: Handle -> TLS.ClientParams -> IO TLS.Context
  tlsEstablish handle tlsParams = do
      rng <- RNG.makeSystem
      ctx <- TLS.contextNew handle tlsParams rng
 +    let logging = def { loggingPacketSent = (\s -> putStrLn $ "<-- sent packet " ++ s)
 +                      , loggingPacketRecv = (\s -> putStrLn $ "--> recv packet " ++ s)
 +                      }
 +    TLS.contextHookSetLogging ctx logging
      TLS.handshake ctx
      return ctx
但当您执行
go badURL
时,您只会看到:

<-- sent packet Handshake [ClientHello TLS12
<-- sent packet Alert [(AlertLevel_Fatal,InternalError)]
*** Exception: FailedConnectionException2 "datamarket.accesscontrol.windows.net" 443 True <socket: 13>: hPutBuf: resource vanished (Broken pipe)

tls simpleclient可以在

中找到,一个很好的起点是tls的调试说明:使用
tls simpleclient
比修改
连接
包容易得多!user5402-是的,但付出了巨大的努力!谢谢!我确实学到了很多:-)看起来微软的几个网站都在用
hs-tls
造成这个问题,这里已经有一个漏洞打开了:。我将把这个问题标记为已解决,因为我只想知道发生了什么,以及这是否是我的错。是的,我想这就是simpleclient在(编辑的)帖子中向我们展示的。所以结论是。。。可能是http客户机tls中的一个bug,或者是他们端的一个bug,对此我无能为力。我对tls的了解还不足以调试库:/Time to wikipedia。
$ tls-simpleclient -d -v datamarket.accesscontrol.windows.net                                          
sending query:
GET / HTTP/1.0



debug: >> Handshake [ClientHello TLS12 (ClientRandom "\235=wnV\156z\143M\168+n\165`\193\217\132G\144\204\187\178\SOHG\156\EM\195\168\251l\232+") (Session Nothing) [107,103,57,51,56,50,47,53,4,5,10] [0] [(0,"\NUL'\NUL\NUL$datamarket.accesscontrol.windows.net"),(65281,"\NUL")] Nothing]
debug: >> Alert [(AlertLevel_Fatal,InternalError)]
tls-simpleclient: send: resource vanished (Broken pipe)

$ .cabal-sandbox/bin/tls-retrievecertificate datamarket.accesscontrol.windows.net 443                                     
connecting to datamarket.accesscontrol.windows.net on port 443 ...
tls-retrievecertificate: send: resource vanished (Broken pipe)
  tlsEstablish :: Handle -> TLS.ClientParams -> IO TLS.Context
  tlsEstablish handle tlsParams = do
      rng <- RNG.makeSystem
      ctx <- TLS.contextNew handle tlsParams rng
 +    let logging = def { loggingPacketSent = (\s -> putStrLn $ "<-- sent packet " ++ s)
 +                      , loggingPacketRecv = (\s -> putStrLn $ "--> recv packet " ++ s)
 +                      }
 +    TLS.contextHookSetLogging ctx logging
      TLS.handshake ctx
      return ctx
<-- sent packet Handshake [ClientHello TLS12 ...
--> recv packet Handshake [ServerHello TLS12 ...
...
<-- sent packet Handshake [ClientHello TLS12
<-- sent packet Alert [(AlertLevel_Fatal,InternalError)]
*** Exception: FailedConnectionException2 "datamarket.accesscontrol.windows.net" 443 True <socket: 13>: hPutBuf: resource vanished (Broken pipe)
tls-simpleclient -d -v datamarket.accesscontrol.windows.net