WEBrick の ProcHandler で DELETE メソッドや PUT メソッドを扱えるようにする

WEBrick で HTTP サーバーを作ってリクエストを WEBrick::HTTPServlet::ProcHandler オブジェクトで処理する、ということをしていたのですが、DELETE メソッドを投げると 405 エラーが返ってきてしまうという問題に直面しました。 レスポンスボディは以下のような感じでした。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
  <HEAD><TITLE>Method Not Allowed</TITLE></HEAD>
  <BODY>
    <H1>Method Not Allowed</H1>
    unsupported method `DELETE'.
    <HR>
    <ADDRESS>
     WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18) at
     localhost
    </ADDRESS>
  </BODY>
</HTML>

Ruby 1.9.2-p180 に添付されている webrickWEBrick::HTTPServlet::ProcHandler は、デフォルトでは HEAD メソッドと GET メソッドと POST メソッドと OPTIONS メソッドしか処理しないようです。

DELETE メソッドと PUT メソッドも受け取って欲しかったので、以下のように WEBrick::HTTPServlet::ProcHandler クラスにインスタンスメソッドを追加して対応しました。 こういうときはオープンクラスであることは非常に便利でいいですね。 (オープンクラスじゃなくてもサブクラスを作ったりして対応はできますが。。)

##
# WEBrick::HTTPServlet::ProcHandler が DELETE メソッドや PUT メソッドを認識しないため
# 認識するように変更するための拡張
module WEBrick
  module HTTPServlet

    class ProcHandler < AbstractServlet
      alias do_PUT    do_GET
      alias do_DELETE do_GET
    end

  end
end