とあるサーバのレスポンステストのために、バイナリデータを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だと簡単にこんなネットワークテスト用のスクリプトが書けるのか。
コメント