サンプルファイル

3サイトのサンプルを実際に打ち込んで動かしてみました。

ディレクトリ 参考
sample01 Rubyで手っ取り早くWEB開発環境を用意する。WEBrick利用 - むかぁ~ どっと こむ
mount_sample 基本機能の実装にチャレンジ! | Think IT(シンクイット)
proxy_sample プロキシサーバーを作る! | Think IT(シンクイット)

WEBrickとは?

Webサーバーを手軽に拡張できるのがWEBrickとのこと。Apachモジュールで拡張しようとすると、大きなドキュメントを熟読する必要があるので敷居が高くなってしまいます。さらに言語がC言語になってしまう。

  • Ruby 1.8以降に標準添付。
  • フレームワークなので単体では起動できない。
  • ソースコードが綺麗なので入門におすすめ。

Apachとの違い

  • モジュールの数
  • 開発言語

インデックス

これらの機能の名前を知りませんでした。

機能名 意味
ディレクトリインデックス index.htmlを補完
オートインデックス index.htmlがない時にファイルリストを表示

手動でContent-Typeを挿入

Content-Typeがヘッダに含まれない場合、多くのWebブラウザはURLの拡張子を見て表示する方法を決めます。これはWebブラウザによって挙動が変わるので、できればHTTPサーバー側で返す必要があります。

基本機能の実装にチャレンジ! | Think IT(シンクイット)

HTMLファイルをimage/jpegにして返しましたが、Chromeだと正常に表示されました。Chromeはファイルの内容で判断しているのかも。HTMLは最初にDOCTYPEを宣言するからわかりやすいですしね。

プロキシのコード

最終的に次のようなコードになりました。localhostで実験する時には、下記のRubyファイルと同じ階層にlocalhostというディレクトリを作ります。ここにファイルを置いておけば優先して読み込まれます。ローカルファイルがある際は、HTTPサーバの同名のファイルは使われません。

res.header['key']keyは好きな文字列を入れることができます。それをどうブラウザが解釈するかわかりません。標準以外のも入れられることは覚えておくといいです。

#!/usr/bin/env ruby
require 'webrick'
require 'webrick/httpproxy'
include WEBrick

class OriginalHTTPProxyServer < HTTPProxyServer
  def proxy_service(req, res)
    localfile = "#{req.host}/#{req.path}"
    if File.file?(localfile)
      res.body = open(localfile).read
      res.header["Content-Type"] = WEBrick::HTTPUtils.mime_type(req.path_info, WEBrick::HTTPUtils::DefaultMimeTypes)
      return
    end
    super
  end
end

s = OriginalHTTPProxyServer.new(Port: 8080)
trap("INT"){ s.shutdown }
s.start

自作プロキシを何に使うか?

RubyとWEBrickで手軽にプロキシを作って拡張できます。次のような簡単なことに使うといいかもしれません。

  • ローカルネットで個人のアクセスを追跡する。
  • コンテンツフィルタリング。
  • CSSを変更して見た目を良くする。

最後のCSSのは、Chrome拡張で作ってもいいかもですね。でも、プロキシを一度踏むように設定すればプロキシサーバーをいじるだけで、全てのアクセスするPCを操作できるのが便利かな。一人だけならChrome拡張で、複数で統一を取りたいならプロキシサーバを立てるといいと思いました。

WEBrickをステップアップするための記事