[#14715] HTTP Client with Ruby — TAKAHASHI Masayoshi <maki@...>
高橋征義です。
なひです.
高橋征義です。
ごとけんです
なひです.
高橋です。みなさまどうもありがとうございます。
なひです.
前橋です。
なひです.
なひです.すいません,駄目です.^^;
[#14747] Ruby-gtk の Text Widget について — Takano Naoki <takanon@...>
はじめまして。
[#14763] do end + do end — Wakou Aoyama <wakou@...>
青山です。
[#14765] ruby 1.3.4 with ipv6 — Yasunari Momoi <momo@...>
ruby 1.3.4 を入れたんですが,IPv6 対応しているんですね (^^).
[#14766] ruby 1.3.4 on BSD/OS 3.1 — Yasunari Momoi <momo@...>
BSD/OS 3.1 (with kame) で ruby-1.3.4 を作ろうとしているんで
まつもと ゆきひろです
前田です。
わたなべです.
[#14790] Microsoft Perl ? — ARIMA Yasuhiro <fit0298@...>
有馬です。
[#14833] Regacy scripts depend the ruby old version. — ARIMA Yasuhiro <fit0298@...>
有馬です。
[#14842] texinfo document for ruby-1.3 — Koji Arai <JCA02266@...>
新井です。
まつもと ゆきひろです
新井です。
From: Koji Arai <JCA02266@nifty.ne.jp>
[#14854] Rubyfaq-990607 — Akira Endo <akendo@...3.rim.or.jp>
遠藤です.
[#14860] CVSup server — Yasuhiro Fukuma <yasuf@...>
福間%未読メールどっさり@福岡 です。
[#14863] OO Software Construction by Meyer — Akira Endo <akendo@...3.rim.or.jp>
遠藤です.
[#14874] ruby-gtk trouble — Jun Adachi <adachi@...>
安達@沖データと申します。
[#14900] Rubyfaq-990608 — Akira Endo <akendo@...3.rim.or.jp>
遠藤です.
[#14917] Ruby/Tk and Threads — Tomoyuki Kosimizu <greentea@...2.so-net.ne.jp>
こんにちは、越水です。
[#14953] 男親なら誰でも思う — 中村暁史 <anakamur@...>
[#14957] textarea with CGI.rb — HATTORI Masashi <hattori@...>
服部といいます。こんにちは。
[#14970] thread with curses — HATTORI Masashi <hattori@...>
服部といいます。こんにちは。
[#14980] 初期化メソッドの追加 — ARIMA Yasuhiro <fit0298@...>
有馬です。
[#15003] 文字列から数値への変換失敗を検出したい — ARIMA Yasuhiro <fit0298@...>
有馬です。
[#15012] ext ML の過去ログはいずこ? — 中村暁史 <anakamur@...>
原です。
akaishi です。
わたなべです.
前田です。
[#15045] mail library — Minero Aoki <aamine@...>
あおきです。
あおきです。
あおきです。
まつもと ゆきひろです
わたなべです.
まつもと ゆきひろです
石橋秀仁です.
あおきです。
まつもと ゆきひろです
あおきです。
なひです.
あおきです。
なひです.
松尾です。
なひです.
松尾です。
有馬@FITECです。
松尾です。
はじめまして、岩間です。
なひです.mod_rubyと格闘中です.
なひです.mod_rubyネタはruby-listでよいでしょうか?
前田です。
なひです.
前田です。
なひです.
小松です。
前田です。
小松です。
前田です。
小松です。
前田です。
小松です。
まつもと ゆきひろです
たむら です。
あおきです。
まつもと ゆきひろです
あおきです。
まつもと ゆきひろです
あおきです。
[#15057] 複雑?な構造体の定義方法 — Koichi Shigematsu <shige@...>
しげまつ と申します。 とっても久しぶりの投稿です。
まつもと ゆきひろです
しげまつ です。
まつもと ゆきひろです
ごとけんです
まつもと ゆきひろです
ごとけんです
まつもと ゆきひろです
In message "[ruby-list:15078] Re: pattern (Re: 複雑?な構造体の定義方法)"
[#15093] String#rindex with arbitrary starting point — kjana@... (YANAGAWA Kazuhisa)
「String#rindex の第二引数ってば,探索を『始める』ポイントじゃなくて
前田です。
[#15112] pty on NeXTSTEP3.3J — SHIROYAMA Takayuki <psi@...>
[#15116] irb & ruby — Takashi Nishimoto <g96p0935@...>
ruby の最新版 (990625) を /usr/local 以下にインストールしたのですが、
[#15121] ruby-gtk-0.19 released — Hiroshi Igarashi <igarashi@...>
いがらし%Ruby/GTKメンテナ です。
From: Hiroshi Igarashi <igarashi@ueda.info.waseda.ac.jp>
いがらしです。
[#15131] game of life: ruby/gtk version — Takahiro Maebashi <maebashi@...>
前橋です。
[#15160] undefined method `-@' for Fixnum (NameError) — Tomoyuki Kosimizu <greentea@...2.so-net.ne.jp>
こんにちは、越水です。
まつもと ゆきひろです
[ruby-list:14950] Re: HTTP Client with Ruby
なひです.
http-access-0.0.1(originalバージョン)へのpatchです.
- ポート番号付きURL対応
- HTTP/1.0対応
- HTTPヘッダ区切りがLFのみであるサーバ対応(余計なお世話
の,つもりです.混乱させたみなさん,どうもすいません.
Persistent Connections対応強化ということで,
うっかりcloseし忘れるとソケットハンドルリークを起こすので,
ご利用の場合は注意してくださいね.^^;
/ / /
diff -ur http-access-0.0.1.dist/http-access.rb http-access-0.0.1/http-access.rb
--- http-access-0.0.1.dist/http-access.rb Wed Mar 3 16:23:02 1999
+++ http-access-0.0.1/http-access.rb Wed Jun 9 13:37:18 1999
@@ -29,7 +29,7 @@
def initialize(host, port=HTTP_Port, proxy=nil)
@host = host
- @port = port
+ @port = port || HTTP_Port
@state = :INIT
@requests = []
@uagent = format("HTTPAccess/0.0.1 (%s; %s)",
@@ -54,8 +54,8 @@
header = {} unless header.kind_of? Hash
header['Host'] = @host unless header['Host']
header['User-Agent'] = @uagent unless header['User-Agent']
- #header['Connection'] = 'Keep-Alive' unless header['Connection']
- #header['Accept'] = '*/*' unless header['Accept']
+ header['Connection'] = 'Keep-Alive' unless header['Connection']
+ header['Accept'] = '*/*' unless header['Accept']
header.each {|k, v|
@socket.putheader(k, v)
}
@@ -84,7 +84,7 @@
# close the connection
def close
- @socket.close
+ @socket.close unless @socket.closed?
@state = :INIT
end
@@ -97,8 +97,8 @@
req = @requests.shift
- @status_line = @socket.gets("\r\n")
- unless /(HTTP\/1\.\d+)\s+(\d\d\d)\s+(.*)/ =~ @status_line
+ @status_line = @socket.gets
+ unless /^(HTTP\/1\.\d+)\s+(\d\d\d)\s+(.*)\r?$/ =~ @status_line
raise HTTPBadResponse
end
@http_version = $1
@@ -107,7 +107,7 @@
@next_connection = true if @http_version == 'HTTP/1.1'
@headers = []
- until (line = @socket.gets("\r\n")) == "\r\n"
+ until (line = @socket.gets) =~ /^\r?$/
if line == /^\s/
@headers[-1] << line
else
@@ -117,6 +117,7 @@
@content_length = nil
@chunked = false
+ @next_connection = false
@headers.each {|line|
case line
when /^Content-Length:\s+(\d+)/i
@@ -139,6 +140,11 @@
@state = :DATA
if req[0] == 'HEAD'
@content_length = 0
+ if @next_connection
+ @state = :WAIT
+ else
+ close
+ end
end
@next_connection = false unless @content_length
@@ -148,7 +154,9 @@
def get_header(&block)
get_response if @state == :META
- raise HTTPInvalidState, 'state != DATA' unless @state == :DATA
+ # @state might be :INIT now
+ # because the session could be closed in get_response when HTTP/1.0.
+ #raise HTTPInvalidState, 'state != DATA' unless @state == :DATA
if block
@headers.each {|line|
block.call(line)
@@ -171,14 +179,25 @@
def get_data(maxbytes=nil, &block)
get_response if @state == :META
+ return nil if eof?
raise HTTPInvalidState, 'state != DATA' unless @state == :DATA
+ data = nil
if block
until eof?
block.call(read_body(maxbytes))
end
+ data = nil # calling with block returns nil.
else
- read_body(maxbytes)
+ data = read_body(maxbytes)
+ end
+ if eof?
+ if @next_connection
+ @state = :WAIT
+ else
+ close
+ end
end
+ data
end
def read_body(maxbytes=nil)
@@ -254,11 +273,31 @@
url = URL.new(urlstr)
#exit
- h = HTTPAccess.new(url.netloc)
+ h = HTTPAccess.new(url.host, url.port)
+ #
+ p "get_header with block"
h.request_head(url.path)
- h.request_get(url.path, 'User-Agent'=>'FooBar/1.0')
h.get_response
h.get_header {|line| p line}
+ #
+ p "get_header without block"
+ h.request_head(url.path)
h.get_response
+ p h.get_header
+ #
+ p "get_data with block"
+ h.request_get(url.path, 'User-Agent'=>'FooBar/1.0')
+ h.get_response
+ h.get_header {|line| p line}
h.get_data(8192) {|data| p data}
+ #
+ p "get_data without block"
+ h.request_get(url.path, 'User-Agent'=>'FooBar/1.0')
+ h.get_response
+ h.get_header {|line| p line}
+ str = ""
+ while ( str = h.get_data( 1024 ))
+ p str
+ end
+ h.close
end
diff -ur http-access-0.0.1.dist/url-parse.rb http-access-0.0.1/url-parse.rb
--- http-access-0.0.1.dist/url-parse.rb Wed Mar 3 16:20:08 1999
+++ http-access-0.0.1/url-parse.rb Tue Jun 8 10:17:41 1999
@@ -1,6 +1,6 @@
# Parse URLs.
class URL
- attr_reader :urlstr, :scheme, :netloc, :path, :params, :query, :fragment
+ attr_reader :urlstr, :scheme, :netloc, :host, :port, :path, :params, :query, :fragment
Uses_netloc = ['ftp', 'http', 'gopher', 'nntp', 'telnet', 'wais',
'https', 'shttp', 'snews', 'prospero', '']
@@ -14,15 +14,20 @@
# [scheme]://[netloc]/[path];[params]?[query]#[fragment]
def parse(url, scheme = nil, allow_fragments = true)
@scheme = scheme
- @netloc = @params = @query = @fragment = nil
+ @netloc = @host = @port = @params = @query = @fragment = nil
if url =~ /^([-+\.\w]+):/
@scheme, url = $1, $' #'
end
if url =~ /^(\/\/)?([^\/]+)/ && Uses_netloc.include?(@scheme)
- # //[netloc]
+ # //[netloc] a.k.a. hostport ::= host [ : port ] in RFC1630
@netloc, url = $2, $' #'
+ if @netloc =~ /^([^:]+):(\d*)$/ # Is this valid like 'http://foo:/bar'?
+ @host, @port = $1, $2
+ else
+ @host = @netloc
+ end
elsif url =~ /^(\/|~)/
@scheme = 'file'
else