rubyでバイナリデータをPOSTする

とあるサーバのレスポンステストのために、バイナリデータをPOSTする必要が生じたので、ネットで調べてコードを書いてみた。

[cc lang="ruby"]require 'net/http'
require 'uri'

uri = URI.parse("http://192.168.0.34/")
Net::HTTP.start(uri.host, uri.port){ |http|
# ヘッダー部
header = {
"Content-Type" => "application/octet-stream"
}

# ボディ部
body = [ 0x00, 0x01, 0x02, 0x3456 ].pack("CCCn")

# 送信
response = http.post(uri.path, body, header)
}
[/cc]

1バイト、2バイトなどのバイナリストリームを作るにはpack使えばいいのか。

0000   50 4f 53 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d  POST / HTTP/1.1.
0010   0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 61  .Content-Type: a
0020   70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
0030   2d 73 74 72 65 61 6d 0d 0a 41 63 63 65 70 74 3a  -stream..Accept:
0040   20 2a 2f 2a 0d 0a 55 73 65 72 2d 41 67 65 6e 74   */*..User-Agent
0050   3a 20 52 75 62 79 0d 0a 48 6f 73 74 3a 20 31 39  : Ruby..Host: 19
0060   32 2e 31 36 38 2e 30 2e 33 34 0d 0a 43 6f 6e 74  2.168.0.34..Cont
0070   65 6e 74 2d 4c 65 6e 67 74 68 3a 20 35 0d 0a 0d  ent-Length: 5...
0080   0a 00 01 02 34 56                                ....4V

Wiresharkで実際のHTTPリクエストをキャプチャしてみると、いちおう想定通りのデータがPOSTされてるようだ。たぶん大丈夫かな。しかしrubyだと簡単にこんなネットワークテスト用のスクリプトが書けるのか。

タイトルとURLをコピーしました