ひだかです。

At 2002/02/08 01:30:10 Minero Aoki wrote:
> あおきです。
> 
> このまえ Dave Thomas にも「WebDAV 実装したいんで好きなメソッド
> 投げられるようにしてくれない?」と言われて send_request という
> メソッドを実装しました (ただし 1.6.5 以上限定)。それを使うと
> net/http を拡張しなくてもいけます。こんな感じです。

 なるほど。このためにあるのでしたか。というか Daveさんには
仕事の速さでは絶対勝てないぽいですね・・。

> これはまだドキュメント化してないので、今リクエストをくだされば
> こっちのほうを変えられますので遠慮なくどうぞ。こういう機能が
> 欲しいぞ、というのでも構いません。

 でもなんとなく、ほかのメソッドと合わせておいたほうが、
あとからほかの人が使ったり拡張したりするときに有利なのかなとか
思っていまの構成にしています。

 ruby-1.6.5 の頃のふるい http.rb では、define_http_method_interface で
メソッドを作っていたのを新しいのではやめてしまったようなのですけど、
この手のものを復活させるというのは面倒ですか? とりあえずいまは
以下のようなものを勝手に追加して試してみています。

module Net
  class HTTP
    public
    def self.define_http_method_interface2( klass )
      cname = klass.name.gsub(/^.*::/, '')
      name = cname.downcase
      hasdata = klass::REQUEST_HAS_BODY
      hasdest = klass::RESPONSE_HAS_BODY
      lineno = __LINE__ + 2

      src = <<"      ----"
        def #{name}( path, #{hasdata ? 'data,' : ''}
		    initheader = nil #{hasdest ? ', dest = nil, &block' : ''} )
          res = nil
	  #{hasdest ? '' : 'res = '}
          request(
            #{cname}.new( path, initheader ) #{hasdata ? ',data' : ''}
          ) #{hasdest ? 'do |res| res.read_body( dest, &block ) end 
            unless @newimpl then 
              res.value 
              return res, res.body 
            end 
          ' : ' 
	  @newimpl or res.value'}
          res
        end

        def request_#{name}( path, #{hasdata ? 'data,' : ''} initheader = nil, &block )
	  request #{cname}.new(path, initheader), #{hasdata ? 'data, ' : ''} &block
        end			   
      ----
      module_eval src, __FILE__, lineno
    end
  end
end

-- 
ひだかたかひろ