mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
aamine
* lib/net/protocol.rb, smtp.rb, pop.rb, http.rb: 1.1.28. * lib/net/http.rb: HTTPReadAdapter -> HTTPResponseReceiver * lib/net/http.rb (connecting): response is got in receive() git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@951 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
13243e5ad1
commit
616c1cd971
5 changed files with 153 additions and 83 deletions
|
@ -1,3 +1,11 @@
|
|||
Thu Sep 21 15:59:23 2000 Minero Aoki <aamine@dp.u-netsurf.ne.jp>
|
||||
|
||||
* lib/net/protocol.rb, smtp.rb, pop.rb, http.rb: 1.1.28.
|
||||
|
||||
* lib/net/http.rb: HTTPReadAdapter -> HTTPResponseReceiver
|
||||
|
||||
* lib/net/http.rb (connecting): response is got in receive()
|
||||
|
||||
Wed Sep 20 23:21:38 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* ruby.c (load_file): two Ctrl-D was required to stop ruby at the
|
||||
|
|
175
lib/net/http.rb
175
lib/net/http.rb
|
@ -1,6 +1,6 @@
|
|||
=begin
|
||||
|
||||
= net/http.rb version 1.1.28
|
||||
= net/http.rb version 1.1.29
|
||||
|
||||
maintained by Minero Aoki <aamine@dp.u-netsurf.ne.jp>
|
||||
This file is derived from "http-access.rb".
|
||||
|
@ -9,6 +9,10 @@ This program is free software.
|
|||
You can distribute/modify this program under
|
||||
the terms of the Ruby Distribute License.
|
||||
|
||||
Japanese version of this document is in "net" full package.
|
||||
You can get it from RAA
|
||||
(Ruby Application Archive: http://www.ruby-lang.org/en/raa.html).
|
||||
|
||||
|
||||
= class HTTP
|
||||
|
||||
|
@ -33,7 +37,7 @@ the terms of the Ruby Distribute License.
|
|||
: start {|http| .... }
|
||||
creates a new Net::HTTP object and starts HTTP session.
|
||||
|
||||
When this method is called with a block, gives HTTP object to block
|
||||
When this method is called with block, gives HTTP object to block
|
||||
and close HTTP session after block call finished.
|
||||
|
||||
: get( path, header = nil, dest = '' )
|
||||
|
@ -46,22 +50,21 @@ the terms of the Ruby Distribute License.
|
|||
# example
|
||||
response, body = http.get( '/index.html' )
|
||||
|
||||
If called with a block, give a part String of entity body.
|
||||
If called with block, give a part String of entity body.
|
||||
|
||||
Note:
|
||||
If status is not 2xx(success), ProtocolError exception is
|
||||
raised. At that time, you can get Response object from
|
||||
raised. At that time, you can get HTTPResponse object from
|
||||
execption object. (same in head/post)
|
||||
|
||||
# example
|
||||
begin
|
||||
response, body = http.get(...)
|
||||
response, body = http.get( '/index.html' )
|
||||
rescue Net::ProtoRetriableError
|
||||
response = $!.data
|
||||
...
|
||||
end
|
||||
|
||||
|
||||
: head( path, header = nil )
|
||||
get only header from "path" on connecting host.
|
||||
"header" is a Hash like { 'Accept' => '*/*', ... }.
|
||||
|
@ -81,45 +84,75 @@ the terms of the Ruby Distribute License.
|
|||
"header" must be a Hash like { 'Accept' => '*/*', ... }.
|
||||
This method returns Net::HTTPResponse object and "dest".
|
||||
|
||||
If called with a block, gives a part String of entity body.
|
||||
If called with block, gives a part String of entity body.
|
||||
|
||||
: get2( path, header = nil ) {|adapter| .... }
|
||||
: get2( path, header = nil )
|
||||
: get2( path, header = nil ) {|recv| .... }
|
||||
send GET request for "path".
|
||||
"header" must be a Hash like { 'Accept' => '*/*', ... }.
|
||||
This method gives HTTPReadAdapter object to block.
|
||||
If this method is called with block, one gives
|
||||
a HTTPResponseReceiver object to block.
|
||||
|
||||
ex.
|
||||
# example
|
||||
http.get2( '/index.html' ) do |recv|
|
||||
# "recv" is a HTTPResponseReceiver object
|
||||
recv.header
|
||||
recv.body
|
||||
end
|
||||
|
||||
http.get2( '/index.html' ) do |f|
|
||||
# f is a HTTPReadAdapter object
|
||||
f.header
|
||||
f.body
|
||||
# another way
|
||||
response = http.get2( '/index.html' )
|
||||
response['content-type']
|
||||
response.body
|
||||
|
||||
# this is wrong
|
||||
http.get2( '/index.html' ) do |recv|
|
||||
print recv.header.body # body is not read yet!!!
|
||||
end
|
||||
|
||||
# but this is ok
|
||||
http.get2( '/index.html' ) do |recv|
|
||||
recv.body # read body and set recv.header.body
|
||||
print recv.header.body # ref
|
||||
end
|
||||
|
||||
: head2( path, header = nil )
|
||||
: head2( path, header = nil ) {|recv| .... }
|
||||
send HEAD request for "path".
|
||||
"header" must be a Hash like { 'Accept' => '*/*', ... }.
|
||||
The difference between "head" method is that
|
||||
"head2" does not raise exceptions.
|
||||
|
||||
ex.
|
||||
If this method is called with block, one gives
|
||||
a HTTPResponseReceiver object to block.
|
||||
|
||||
http.head2( '/index.html' ) do |f|
|
||||
f.header
|
||||
# example
|
||||
response = http.head2( '/index.html' )
|
||||
|
||||
# another way
|
||||
http.head2( '/index.html' ) do |recv|
|
||||
recv.response
|
||||
end
|
||||
|
||||
: post2( path, data, header = nil ) {|adapter| .... }
|
||||
: post2( path, data, header = nil )
|
||||
: post2( path, data, header = nil ) {|recv| .... }
|
||||
post "data"(must be String now) to "path".
|
||||
"header" must be a Hash like { 'Accept' => '*/*', ... }.
|
||||
This method gives HTTPReadAdapter object to block.
|
||||
If this method is called with block, one gives
|
||||
a HTTPResponseReceiver object to block.
|
||||
|
||||
ex.
|
||||
|
||||
http.post2( '/index.html', 'data data data...' ) do |adapter|
|
||||
adapter.header
|
||||
adapter.body
|
||||
# example
|
||||
http.post2( '/anycgi.rb', 'data data data...' ) do |recv|
|
||||
# "recv" is a HTTPResponseReceiver object
|
||||
recv.header
|
||||
recv.body
|
||||
end
|
||||
|
||||
# another way
|
||||
response = http.post2( '/anycgi.rb', 'important data' )
|
||||
response['content-type']
|
||||
response.body
|
||||
|
||||
|
||||
= class HTTPResponse
|
||||
|
||||
|
@ -152,7 +185,8 @@ All "key" is case-insensitive.
|
|||
: message
|
||||
HTTP result message. For example, 'Not Found'
|
||||
|
||||
= class HTTPReadAdapter
|
||||
|
||||
= class HTTPResponseReceiver
|
||||
|
||||
== Methods
|
||||
|
||||
|
@ -165,8 +199,8 @@ All "key" is case-insensitive.
|
|||
entity body. A body is written to "dest" using "<<" method.
|
||||
|
||||
: body {|str| ... }
|
||||
get entity body by using block.
|
||||
If this method is called twice, block is not called and
|
||||
gets entity body with block.
|
||||
If this method is called twice, block is not executed and
|
||||
returns first "dest".
|
||||
|
||||
|
||||
|
@ -283,8 +317,9 @@ module Net
|
|||
end
|
||||
|
||||
def get2( path, u_header = nil, &block )
|
||||
connecting( u_header, block ) {|uh|
|
||||
connecting( u_header ) {|uh|
|
||||
@command.get edit_path(path), uh
|
||||
receive true, block
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -295,10 +330,10 @@ module Net
|
|||
resp
|
||||
end
|
||||
|
||||
def head2( path, u_header = nil )
|
||||
connecting( u_header, nil ) {|uh|
|
||||
def head2( path, u_header = nil, &block )
|
||||
connecting( u_header ) {|uh|
|
||||
@command.head edit_path(path), uh
|
||||
@command.get_response_no_body
|
||||
receive false, block
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -311,8 +346,9 @@ module Net
|
|||
end
|
||||
|
||||
def post2( path, data, u_header = nil, &block )
|
||||
connecting( u_header, block ) {|uh|
|
||||
connecting( u_header ) {|uh|
|
||||
@command.post edit_path(path), uh, data
|
||||
receive true, block
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -325,8 +361,9 @@ module Net
|
|||
end
|
||||
|
||||
def put2( path, src, u_header = nil, &block )
|
||||
connecting( u_header, block ) {|uh|
|
||||
connecting( u_header ) {|uh|
|
||||
@command.put path, uh, src
|
||||
receive true, block
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -334,14 +371,7 @@ module Net
|
|||
private
|
||||
|
||||
|
||||
# called when connecting
|
||||
def do_finish
|
||||
unless @socket.closed? then
|
||||
head2 '/', { 'Connection' => 'close' }
|
||||
end
|
||||
end
|
||||
|
||||
def connecting( u_header, ublock )
|
||||
def connecting( u_header )
|
||||
u_header = procheader( u_header )
|
||||
if not @socket then
|
||||
u_header['Connection'] = 'close'
|
||||
|
@ -351,11 +381,6 @@ module Net
|
|||
end
|
||||
|
||||
resp = yield( u_header )
|
||||
if ublock then
|
||||
adapter = HTTPReadAdapter.new( @command )
|
||||
ublock.call adapter
|
||||
resp = adapter.off
|
||||
end
|
||||
|
||||
unless keep_alive? u_header, resp then
|
||||
@socket.close
|
||||
|
@ -397,22 +422,37 @@ module Net
|
|||
end
|
||||
|
||||
|
||||
def receive( body_exist, block )
|
||||
recv = HTTPResponseReceiver.new( @command, body_exist )
|
||||
block.call recv if block
|
||||
recv.terminate
|
||||
recv.header
|
||||
end
|
||||
|
||||
|
||||
# called when connecting
|
||||
def do_finish
|
||||
unless @socket.closed? then
|
||||
head2 '/', { 'Connection' => 'close' }
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def edit_path( path )
|
||||
path
|
||||
end
|
||||
|
||||
class << self
|
||||
def Proxy( p_addr, p_port )
|
||||
def HTTP.Proxy( p_addr, p_port = nil )
|
||||
klass = super
|
||||
klass.module_eval %-
|
||||
def edit_path( path )
|
||||
'http://' + address +
|
||||
(@port == #{self.port} ? '' : ':' + @port.to_s) + path
|
||||
(@port == HTTP.port ? '' : ":#{@port}") +
|
||||
path
|
||||
end
|
||||
-
|
||||
klass
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
@ -521,10 +561,11 @@ module Net
|
|||
HTTPVersionNotSupported = HTTPFatalErrorCode.mkchild
|
||||
|
||||
|
||||
class HTTPReadAdapter
|
||||
class HTTPResponseReceiver
|
||||
|
||||
def initialize( command )
|
||||
def initialize( command, body_exist )
|
||||
@command = command
|
||||
@body_exist = body_exist
|
||||
@header = @body = nil
|
||||
end
|
||||
|
||||
|
@ -534,7 +575,9 @@ module Net
|
|||
|
||||
def header
|
||||
unless @header then
|
||||
@header = @command.get_response
|
||||
stream_check
|
||||
@header = @body_exist ? @command.get_response :
|
||||
@command.get_response_no_body
|
||||
end
|
||||
@header
|
||||
end
|
||||
|
@ -543,20 +586,31 @@ module Net
|
|||
def body( dest = nil, &block )
|
||||
dest, ret = HTTP.procdest( dest, block )
|
||||
unless @body then
|
||||
@body = @command.get_body( response, dest )
|
||||
stream_check
|
||||
@body = @command.get_body( header, dest )
|
||||
end
|
||||
@body
|
||||
end
|
||||
alias entity body
|
||||
|
||||
def off
|
||||
body
|
||||
def terminate
|
||||
header
|
||||
body if @body_exist
|
||||
@command = nil
|
||||
@header
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def stream_check
|
||||
unless @command then
|
||||
raise IOError, 'receiver was used out of block'
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
HTTPReadAdapter = HTTPResponseReceiver
|
||||
|
||||
|
||||
|
||||
module NetPrivate
|
||||
|
@ -570,11 +624,8 @@ module Net
|
|||
@http_version = HTTPVersion
|
||||
|
||||
@in_header = {}
|
||||
if sock.port == HTTP.port
|
||||
@in_header[ 'Host' ] = sock.addr
|
||||
else
|
||||
@in_header[ 'Host' ] = sock.addr + ':' + sock.port
|
||||
end
|
||||
@in_header[ 'Host' ] = sock.addr +
|
||||
((sock.port == HTTP.port) ? '' : ":#{sock.port}")
|
||||
@in_header[ 'Connection' ] = 'Keep-Alive'
|
||||
@in_header[ 'Accept' ] = '*/*'
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
=begin
|
||||
|
||||
= net/pop.rb version 1.1.28
|
||||
= net/pop.rb version 1.1.29
|
||||
|
||||
written by Minero Aoki <aamine@dp.u-netsurf.ne.jp>
|
||||
|
||||
|
@ -8,6 +8,10 @@ This program is free software.
|
|||
You can distribute/modify this program under
|
||||
the terms of the Ruby Distribute License.
|
||||
|
||||
Japanese version of this document is in "net" full package.
|
||||
You can get it from RAA
|
||||
(Ruby Application Archive: http://www.ruby-lang.org/en/raa.html).
|
||||
|
||||
|
||||
== Net::POP3
|
||||
|
||||
|
@ -31,7 +35,7 @@ Net::Protocol
|
|||
: start( account, password ) {|pop| .... }
|
||||
starts POP3 session.
|
||||
|
||||
When called with a block, give a POP3 object to block and
|
||||
When called with block, give a POP3 object to block and
|
||||
close session after block call is finished.
|
||||
|
||||
: each {|popmail| .... }
|
||||
|
@ -80,7 +84,7 @@ Object
|
|||
end
|
||||
|
||||
: all {|str| .... }
|
||||
You can use all/pop/mail with a block.
|
||||
You can call all/pop/mail with block.
|
||||
argument 'str' is a read string (a part of mail).
|
||||
|
||||
# usage example
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
=begin
|
||||
|
||||
= net/protocol.rb version 1.1.28
|
||||
= net/protocol.rb version 1.1.29
|
||||
|
||||
written by Minero Aoki <aamine@dp.u-netsurf.ne.jp>
|
||||
|
||||
|
@ -8,6 +8,10 @@ This program is free software.
|
|||
You can distribute/modify this program under
|
||||
the terms of the Ruby Distribute License.
|
||||
|
||||
Japanese version of this document is in "net" full package.
|
||||
You can get it from RAA
|
||||
(Ruby Application Archive: http://www.ruby-lang.org/en/raa.html).
|
||||
|
||||
|
||||
== Net::Protocol
|
||||
|
||||
|
@ -46,7 +50,7 @@ Object
|
|||
|
||||
'*args' are specified in subclasses.
|
||||
|
||||
When is called with a block, gives Protocol object to block and
|
||||
When is called with block, gives Protocol object to block and
|
||||
close session when block finished.
|
||||
|
||||
: finish
|
||||
|
@ -65,7 +69,7 @@ module Net
|
|||
|
||||
class Protocol
|
||||
|
||||
Version = '1.1.28'
|
||||
Version = '1.1.29'
|
||||
|
||||
|
||||
class << self
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
=begin
|
||||
|
||||
= net/smtp.rb version 1.1.28
|
||||
= net/smtp.rb version 1.1.29
|
||||
|
||||
written by Minero Aoki <aamine@dp.u-netsurf.ne.jp>
|
||||
|
||||
|
@ -8,6 +8,10 @@ This program is free software.
|
|||
You can distribute/modify this program under
|
||||
the terms of the Ruby Distribute License.
|
||||
|
||||
Japanese version of this document is in "net" full package.
|
||||
You can get it from RAA
|
||||
(Ruby Application Archive: http://www.ruby-lang.org/en/raa.html).
|
||||
|
||||
|
||||
== Net::SMTP
|
||||
|
||||
|
@ -33,7 +37,7 @@ Net::Protocol
|
|||
opens TCP connection and starts SMTP session.
|
||||
If protocol had been started, do nothing and return false.
|
||||
|
||||
When this methods is called with a block, give a SMTP object to block and
|
||||
When this methods is called with block, give a SMTP object to block and
|
||||
close session after block call finished.
|
||||
|
||||
If account and password are given, is trying to get authentication
|
||||
|
@ -42,7 +46,7 @@ Net::Protocol
|
|||
: send_mail( mailsrc, from_addr, *to_addrs )
|
||||
: sendmail( mailsrc, from_addr, *to_addrs )
|
||||
This method sends 'mailsrc' as mail. SMTP read strings
|
||||
from 'mailsrc' by calling 'each' method, and convert them
|
||||
from 'mailsrc' by calling 'each' iterator, and convert them
|
||||
into "\r\n" terminated string when write.
|
||||
|
||||
from_addr must be String.
|
||||
|
@ -62,8 +66,7 @@ Net::Protocol
|
|||
|
||||
: ready( from_addr, to_addrs ) {|adapter| .... }
|
||||
This method stands by the SMTP object for sending mail.
|
||||
In the block of this method, you can call ONLY 'write' method
|
||||
for 'adapter'.
|
||||
"adapter" object accepts only "write" method.
|
||||
|
||||
# usage example
|
||||
|
||||
|
|
Loading…
Reference in a new issue