http-conduitを使用して Mt Gox REST API にアクセスしようとしています。パスだけを持つクエリ (例: https://data.mtgox.com/api/2/BTCUSD/money/ticker ) は正常に動作しますが、クエリ文字列をリクエストに追加するとタイムアウトになります。
したがって、これは機能します:
mtGoxRequest :: String -> QueryText -> Request m
mtGoxRequest p qt = def {
secure = True,
host = "data.mtgox.com",
port = 443,
method = "GET",
path = fromString $ "api/2/" ++ p,
queryString = renderQuery False $ queryTextToQuery qt,
responseTimeout = Just 10000000
}
currencyTicker :: Request m
currencyTicker = mtGoxRequest "BTCUSD/money/ticker" []
しかし、これはタイムアウトします:
tradeStream :: Currency -> UTCTime -> Request m
tradeStream t = mtGoxRequest
"BTCUSD/money/trades/fetch"
[("since", Just $ T.pack $ utcToGoxTime t)]
違いは queryString の使用にあるようです: 偽のクエリ "foo=bar" を currencyTicker に追加したときもタイムアウトしました。
ただし、これはすべて Web ブラウザーで正常に機能します。 https://data.mtgox.com/api/2/BTCUSD/money/ticker?foo=barにアクセスすると、タイムアウトするのではなく、正しいエラー メッセージが即座に返されます。トレード フェッチ URL も同様に機能しますが、"since" 引数がどれだけ遡るかを示しているため、リンクは含めません。逆に、取引リスト リクエストから queryString を削除すると、利用可能な取引履歴全体が正しく返されます。
そのため、http-conduit クエリ文字列に関する何かが明らかに異なります。誰がそれが何であるか知っていますか?
送信される Haskell Request オブジェクトは次のとおりです ("Show" で表示):
Request {
host = "data.mtgox.com"
port = 443
secure = True
clientCertificates = []
requestHeaders = []
path = "api/2/BTCUSD/money/trades/fetch"
queryString = "since=1367142721624293"
requestBody = RequestBodyLBS Empty
method = "GET"
proxy = Nothing
rawBody = False
redirectCount = 10
responseTimeout = Just 10000000
}
返されたヘッダーによると、Mt Gox は cloudflare-nginx と PHP 5 を使用しています。
編集: http-conduit を使用して queryString を含むリクエストをhttp://scooterlabs.com/echoに送信すると、正しい応答も返されるので、Mt Gox Web サーバーとhttp コンジット。