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 に添付されている webrick の WEBrick::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