Hatena::Grouprubyist

Going My Ruby Way このページをアンテナに追加 RSSフィード

Ruby ロゴ (C) Ruby Association LLC

2010年10月26日(火)

Ruby で HTTP 備忘録

| 12:31 |  Ruby で HTTP 備忘録 - Going My Ruby Way を含むブックマーク はてなブックマーク -  Ruby で HTTP 備忘録 - Going My Ruby Way  Ruby で HTTP 備忘録 - Going My Ruby Way のブックマークコメント

RubyHTTP するときの備忘録です。(他の日記よりこちらに引越し)

HTTP サーバに GETリクエストを投げて、レスポンスボディを表示するスクリプト。

#!/usr/bin/env ruby
require 'open-uri'

uri = ARGV.shift or raise ArgumentError, "usage: #{$0} URI"

print open(uri).read

HTTP サーバに POST リクエストを投げて、レスポンスボディを表示するスクリプト。

#!/usr/bin/env ruby
require 'uri'
require 'net/http'

uri = ARGV.shift or raise ArgumentError, "usage: #{$0} URI"
http_uri = URI::HTTP.new *URI.split(uri)

Net::HTTP.start(http_uri.host, http_uri.port) {|http|
    res = http.post(http_uri.path, http_uri.query||"")
    print res.body
}

HTTP サーバに HEAD リクエストを投げて、レスポンスヘッダを表示するスクリプト。

#!/usr/bin/env ruby
require 'uri'
require 'net/http'

uri = ARGV.shift or raise ArgumentError, "usage: #{$0} URI"
http_uri = URI::HTTP.new *URI.split(uri)

Net::HTTP.start(http_uri.host, http_uri.port) {|http|
    res = http.head http_uri.request_uri

    puts res.code + " " + res.message
    res.each {|name, val|
        puts name + ": " + val
    }
}

上記の SSL 対応版。

#!/usr/bin/env ruby
require 'uri'
require 'net/https'
Net::HTTP.version_1_2

header_puts = proc {}
# 次行をコメントアウトするとヘッダを出力しない
header_puts = method(:puts)

# GET/POST/HEAD のどれか (ここでは POST)
##METHOD = :GET
METHOD = :POST
##METHOD = :HEAD

uri_str = ARGV.shift or raise ArgumentError, "usage: #{$0} URI [ CA_CERT ]"
ca_cert = ARGV.shift

uri = URI::HTTP.new *URI.split(uri_str)

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl     = ca_cert ? true : false
http.ca_file     = ca_cert
http.verify_mode = OpenSSL::SSL::VERIFY_PEER

http.start {|http|
  res = case METHOD
      when :POST; http.post(uri.path, uri.query||"")
      when :HEAD; http.head(uri.request_uri)
      else      ; http.get(uri.request_uri)
  end

  header_puts.call "HTTP/#{res.http_version} #{res.code} #{res.message}"
  res.each {|name, val|
    header_puts.call "#{name}: #{val}"
  }
  header_puts.call

  print res.body
}
# vi: ts=2 sw=2 et:

WEBrick を使った簡単な httpd

#!/usr/bin/env ruby

require 'pp'
require 'optparse'
require 'webrick'
require 'webrick/https'

conf = {
  :BindAddress    => '127.0.0.1',
  :Port           => 50080,
  :DocumentRoot   => ENV['HOME'] + '/public_html',
  :CGIInterpreter => `which ruby`.chomp,
  :SSLEnable      => false,
}

def conf.ssl_on(cert, key)
  self[:SSLCertificate] = OpenSSL::X509::Certificate.new(open(cert))
  self[:SSLPrivateKey]  = OpenSSL::PKey::RSA.new(open(key))
  self[:SSLEnable]      = true
end

ARGV.options {|opt|
  opt.on('-b BIND_ADDRESS')     {|addr| conf[:BindAddress]    = addr  }
  opt.on('-p PORT')             {|port| conf[:Port]           = port  }
  opt.on('-d DOCUMENT_ROOT')    {|root| conf[:DocumentRoot]   = root  }
  opt.on('-i CGI_INTERPRETER')  {|intp| conf[:CGIInterpreter] = intp  }
  opt.on('-s','enable SSL')     {
    conf.ssl_on('httpd-cert.pem', 'httpd-key.pem')
  }
  opt.on('-S CERT_FILE,PRIVATE_KEY_FILE') {|files|
    conf.ssl_on(*files.split(',', 2))
  }

  opt.on('-t', 'print config and exit') { pp conf ; exit }

  opt.parse!
}

httpd = WEBrick::HTTPServer.new(conf)
Signal.trap(:INT)  {httpd.shutdown}
Signal.trap(:TERM) {httpd.shutdown}
httpd.start

# vi: ts=2 sw=2 et: