JSON-RPC の複数呼び出し

人物: lachesis

JSON-RPC パスワードスレッドでサトシがほのめかした、Bitcoin の JSON-RPC におけるいわゆる「Multiple Invocation」サポートに気づいた。

大量のアドレスへの支払いを 1分に 2回ポーリングするサイトを運営しているので、興味を引かれた。まず、これは JSON-RPC 2.0 の「Batch」サポートとは違う。Batch ではリクエストを配列で送信し、レスポンスも同様に受信する:

request = [
        {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},
        {"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"},
        {"jsonrpc": "2.0", "method": "get_data", "id": "9"} 
    ]
response = [
        {"jsonrpc": "2.0", "result": 7, "id": "1"},
        {"jsonrpc": "2.0", "result": 19, "id": "2"},
        {"jsonrpc": "2.0", "result": ["hello", 5], "id": "9"}
    ]

代わりに別の方式で、Python でレスポンスをパースする方法が分からない。Bitcoin RPC サーバーへの telnet セッションの画面キャプチャを示す:

$ telnet localhost 8332
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
POST / HTTP/1.1
Content-Type: text/plain
Content-Length: 97

{"params":[],"id":1,"method":"getconnectioncount"}
{"params":[],"id":2,"method":"getdifficulty"}
HTTP/1.1 200 OK
Connection: close
Content-Length: 33
Content-Type: application/json
Date: Sat, 08 Jul 2006 12:04:08 GMT
Server: json-rpc/1.0

{"result":8,"error":null,"id":1}
HTTP/1.1 200 OK
Connection: close
Content-Length: 49
Content-Type: application/json
Date: Sat, 08 Jul 2006 12:04:08 GMT
Server: json-rpc/1.0

{"result":181.5432893640505,"error":null,"id":2}
Connection closed by foreign host.
見ての通り、サーバーは(予想されるような)2行を連結した1つのレスポンスではなく、2つの完全なHTTP 200レスポンスを返す。

Python で半自動的にこれをパースする方法が分からない。urllib2 も httplib も最初のレスポンスの後に戻ってきて、2 つ目を捨ててしまう。

この問題に遭遇した人はいるだろうか?この奇妙なマルチリクエスト動作を処理できる Python ライブラリを知っている人は?