[#29170] Call for Papers Linux Conference 2001 — akira yamada / やまだあきら <akira@...>

18 messages 2001/04/10
[#30213] Re: Call for Papers Linux Conference 2001 — akira yamada / やまだあきら <akira@...> 2001/06/13

[#29190] Time Stamp Copy of File.copy — "たけ(tk)" <ggb03124@...>

 ftools.rb の move では utime を行っていて日付が同じになりますが、copy

42 messages 2001/04/11
[#29193] Re: Time Stamp Copy of File.copy — matz@... (Yukihiro Matsumoto) 2001/04/11

まつもと ゆきひろです

[#29201] Re: Time Stamp Copy of File.copy — " たけ (tk)" <ggb03124@...> 2001/04/11

たけ(tk)です。

[#29203] Re: Time Stamp Copy of File.copy — WATANABE Hirofumi <eban@...> 2001/04/11

わたなべです.

[#29212] Re: Time Stamp Copy of File.copy — Minero Aoki <aamine@...> 2001/04/12

あおきです。

[#29215] Re: Time Stamp Copy of File.copy — " たけ (tk)" <ggb03124@...> 2001/04/12

たけ(tk)です。

[#29220] Re: Time Stamp Copy of File.copy — Minero Aoki <aamine@...> 2001/04/12

あおきです。

[#29234] Re: Time Stamp Copy of File.copy — " たけ (tk)" <ggb03124@...> 2001/04/13

たけ(tk)です。

[#29236] Re: Time Stamp Copy of File.copy — matz@... (Yukihiro Matsumoto) 2001/04/13

まつもと ゆきひろです

[#29238] Array#include! — " たけ (tk)" <ggb03124@...> 2001/04/13

たけ(tk)です。

[#29244] Re: Array#include! — matz@... (Yukihiro Matsumoto) 2001/04/13

まつもと ゆきひろです

[#29348] Open3 — NISHIO Mizuho <mzh@...>

どうも西尾です。

16 messages 2001/04/20

[#29397] rnet.rb 〜高レベルネットライブラリ〜 — rubikitch <rubikitch@...>

るびきちです。

11 messages 2001/04/24

[ruby-list:29397] rnet.rb 〜高レベルネットライブラリ〜

From: rubikitch <rubikitch@...>
Date: 2001-04-24 17:32:21 UTC
List: ruby-list #29397
るびきちです。

ネットを扱うクラスでちょっと高レベルなインターフェースが欲しかったので、
書いてみました。
net/* とは違ってURIで指定してあれこれするやつです。
現在はHTTPしか実装してませんが、FTPも仕様が決まれば簡単に
追加できるようになってるはずです。

#!/usr/bin/env ruby
=begin
= RNet
高レベルネットクラス。要uri.rb。
URIで指定してネットワークをいじくる。

== メソッド
--- RNet.new(arg)
      RNetオブジェクトを作る。
      argは文字列かURIオブジェクトでURIを指定。
      URIによりスキームを決定し、それに応じたメソッドが使えるようになる。

=== HTTP
--- RNet.head(header0={})
      HEADリクエストを発行。HTTPResponseオブジェクトを返す。
--- RNet.get(header0={})
      GETリクエストを発行。HTTPResponseオブジェクトを返す。
--- RNet.post(data, header0={})
      POSTリクエストを発行。dataは文字列かハッシュ。
      HTTPResponseオブジェクトを返す。
=end
      

require 'net/http'
require 'uri'
require 'kconv'
require 'cgi'

class RNet
  module Http
    @@HeadHeader = {}
    @@GetHeader = {
      'Accept'=> 'text/*, image/*, audio/*, application/*',
      'Accept-Language'=> 'ja; q=1.0, en; q=0.5',
    }
    @@PostHeader = {
      'Accept'=> 'text/*, image/*, audio/*, application/*',
      'Accept-Language'=> 'ja; q=1.0, en; q=0.5',
      'Content-type'=>'application/x-www-form-urlencoded',
    }
  end
  
  module Ftp
  end
end

class RNet
  def initialize(arg)
    case arg
    when URI
      @uri = arg
    when String
      @uri = URI::create(arg)
    else
      raise TypeError, "RNet.new expected URI or String"
    end
    
    extend self.type.const_get(@uri.scheme.capitalize)
    setup
  end
  
  ################ HTTP
  module Http
    def setup
      @host, @port, @path = @uri.host, @uri.port, @uri.path
      @net = Net::HTTP::new @host, @port
    end
    private :setup
    
    def head(header0={})
      header = @@HeadHeader.dup.update(header0)
      @net.head2 @path, header
    end

    def get(header0={})
      header = @@GetHeader.dup.update(header0)
      @net.get2(@path, header) do |res|
        if res.code =~ /^3[0-9][0-9]$/
          return RNet::new(res['location']).get(header0)
        end
      end
    end
    
    def hash2data(hash)
      data = ''
      hash.each_pair do |name, value|
        case value
        when Array
          value.each do |vv|
            data << "#{name}=#{CGI::escape(Kconv::tosjis vv)}&"
          end
        when NilClass
        else
          data << "#{name}=#{CGI::escape(Kconv::tosjis value)}&"
        end
      end
      data.chop!
      data
    end
    private :hash2data

    def post(data, header0={})
      case data
      when String
        datastr = data
      when Hash
        datastr = hash2data(data)
      else
        raise TypeError, "RNet#post: expected String or Hash!"
      end
      
      header = @@PostHeader.dup.update(header0)
      @net.post2(@path, datastr, header) do |res|
        if res.code =~ /^3[0-9][0-9]$/
          return RNet::new(res['location']).get(header0)
        end
      end
    end
  end
end

if __FILE__ == $0
  get = RNet::new('http://www.ruby-lang.org/en').get
  get.body
  p get.code
  get.each do |h,v|
    p [h,v]
  end
  
end
  

In This Thread

Prev Next