0

ruby TCPSocket 経由で HiveServer2 と通信しようとしています。Thrift SASL 仕様に従って、START メッセージを送信してからプレーンな認証情報を送信します。サーバーは空のペイロードで COMPLETE ステータスを返します。チャレンジをペイロードとして返す必要がありますが、空の文字列です。

START    = 0x01
OK       = 0x02
COMPLETE = 0x05

auth = 'PLAIN'
header = [START, auth.length].pack('cl>')

auth_string = ['anonymous'].pack('u')
auth_message = "[LOGIN] \u0000 #{auth_string} \u0000 #{auth_string}"
auth_header = [OK, auth_message.length].pack('cl>')

socket = TCPSocket.new localhost, 10000
socket.write header + auth
socket.write auth_header + auth_message

socket.read(5).unpack('cl>')
=> [5,0]

HiveServer2 は、COMPLETE である 5 つのステータスを返します。サーバーはもう何も返さないため、このソケットを介してこれ以上通信することはできません。

auth_message が間違った方法で構築されているか、他の何かが間違っていると思われます。

HiveServer2 が私の要求を理解する方法を誰か提案できますか?

どんな助けでも大歓迎です。

UPD: Thrift SASL仕様

UPD2: 解決しました! STARTTLS ブロックは次のようになります。

START    = 0x01
OK       = 0x02
COMPLETE = 0x05

auth = 'PLAIN'
header = [START, auth.length].pack('cl>')
auth_message = "[ANONYMOUS]\u0000anonymous\u0000anonymous"
auth_header = [OK, auth_message.length].pack('cl>')

socket = TCPSocket.new localhost, 10000
socket.write header + auth
socket.write auth_header + auth_message
socket.read(5).unpack('cl>')
=> [5,0]

サーバーから COMPLETE ステータスを受信したら、TCLIService::Client を使用して HiveServer2 と通信できます。注意すべき点は 1 つだけです。

基になるトランスポートへのすべての書き込みには、ペイロード データの 4 バイト長を前に付け、その後にペイロードを付ける必要があります。このトランスポートからのすべての読み取りでは、4 バイト長のワードを読み取ってから、この長さのワードで指定されたバイト数をすべて読み取る必要があります。

4

1 に答える 1

0

thrift gem を使用してみて、Ruby ソケットの代わりにhttps://github.com/dallasmarlow/hiveserver2を検討してください。

于 2013-05-15T14:28:12.000 に答える