mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/open-uri.rb (OpenURI::Meta#content_type_parse): strip quotes.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24885 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a8998030fb
commit
0cde80d36a
3 changed files with 119 additions and 16 deletions
|
@ -1,3 +1,7 @@
|
|||
Sun Sep 13 11:06:12 2009 Tanaka Akira <akr@fsij.org>
|
||||
|
||||
* lib/open-uri.rb (OpenURI::Meta#content_type_parse): strip quotes.
|
||||
|
||||
Sun Sep 13 09:38:06 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* lib/prime.rb (EratosthenesGenerator#initialize): call super.
|
||||
|
|
|
@ -465,7 +465,9 @@ module OpenURI
|
|||
subtype = $2.downcase
|
||||
parameters = []
|
||||
$3.scan(/;#{RE_LWS}?(#{RE_TOKEN})#{RE_LWS}?=#{RE_LWS}?(?:(#{RE_TOKEN})|(#{RE_QUOTED_STRING}))/no) {|att, val, qval|
|
||||
val = qval.gsub(/[\r\n\t !#-\[\]-~\x80-\xff]+|(\\[\x00-\x7f])/n) { $1 ? $1[1,1] : $& } if qval
|
||||
if qval
|
||||
val = qval[1...-1].gsub(/[\r\n\t !#-\[\]-~\x80-\xff]+|(\\[\x00-\x7f])/n) { $1 ? $1[1,1] : $& }
|
||||
end
|
||||
parameters << [att.downcase, val]
|
||||
}
|
||||
["#{type}/#{subtype}", *parameters]
|
||||
|
|
|
@ -29,6 +29,17 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
}
|
||||
end
|
||||
|
||||
def with_env(h)
|
||||
begin
|
||||
old = {}
|
||||
h.each_key {|k| old[k] = ENV[k] }
|
||||
h.each {|k, v| ENV[k] = v }
|
||||
yield
|
||||
ensure
|
||||
h.each_key {|k| ENV[k] = old[k] }
|
||||
end
|
||||
end
|
||||
|
||||
def setup
|
||||
@proxies = %w[http_proxy ftp_proxy no_proxy]
|
||||
@old_proxies = @proxies.map {|k| ENV[k] }
|
||||
|
@ -78,6 +89,10 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
}
|
||||
end
|
||||
|
||||
def test_open_too_many_arg
|
||||
assert_raise(ArgumentError) { open("http://192.0.2.1/tma", "r", 0666, :extra) {} }
|
||||
end
|
||||
|
||||
def test_read_timeout
|
||||
TCPServer.open("127.0.0.1", 0) {|serv|
|
||||
port = serv.addr[1]
|
||||
|
@ -119,6 +134,13 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
assert_equal("mode", f.read)
|
||||
}
|
||||
assert_raise(ArgumentError) { open("#{url}/mode", "a") {} }
|
||||
open("#{url}/mode", "r:us-ascii") {|f|
|
||||
assert_equal(Encoding::US_ASCII, f.read.encoding)
|
||||
}
|
||||
open("#{url}/mode", "r:utf-8") {|f|
|
||||
assert_equal(Encoding::UTF_8, f.read.encoding)
|
||||
}
|
||||
assert_raise(ArgumentError) { open("#{url}/mode", "r:invalid-encoding") {} }
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -135,12 +157,30 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
}
|
||||
end
|
||||
|
||||
def test_header
|
||||
myheader1 = 'barrrr'
|
||||
myheader2 = nil
|
||||
with_http {|srv, dr, url|
|
||||
srv.mount_proc("/h/") {|req, res| myheader2 = req['myheader']; res.body = "foo" }
|
||||
open("#{url}/h/", 'MyHeader'=>myheader1) {|f|
|
||||
assert_equal("foo", f.read)
|
||||
assert_equal(myheader1, myheader2)
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def test_multi_proxy_opt
|
||||
assert_raise(ArgumentError) {
|
||||
open("http://127.0.0.1/", :proxy_http_basic_authentication=>true, :proxy=>true) {}
|
||||
}
|
||||
end
|
||||
|
||||
def test_non_http_proxy
|
||||
assert_raise(RuntimeError) {
|
||||
open("http://127.0.0.1/", :proxy=>URI("ftp://127.0.0.1/")) {}
|
||||
}
|
||||
end
|
||||
|
||||
def test_proxy
|
||||
with_http {|srv, dr, url|
|
||||
log = ''
|
||||
|
@ -154,15 +194,16 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
:BindAddress => '127.0.0.1',
|
||||
:Port => 0})
|
||||
_, proxy_port, _, proxy_host = proxy.listeners[0].addr
|
||||
proxy_url = "http://#{proxy_host}:#{proxy_port}/"
|
||||
begin
|
||||
th = proxy.start
|
||||
open("#{dr}/proxy", "w") {|f| f << "proxy" }
|
||||
open("#{url}/proxy", :proxy=>"http://#{proxy_host}:#{proxy_port}/") {|f|
|
||||
open("#{url}/proxy", :proxy=>proxy_url) {|f|
|
||||
assert_equal("200", f.status[0])
|
||||
assert_equal("proxy", f.read)
|
||||
}
|
||||
assert_match(/#{Regexp.quote url}/, log); log.clear
|
||||
open("#{url}/proxy", :proxy=>URI("http://#{proxy_host}:#{proxy_port}/")) {|f|
|
||||
open("#{url}/proxy", :proxy=>URI(proxy_url)) {|f|
|
||||
assert_equal("200", f.status[0])
|
||||
assert_equal("proxy", f.read)
|
||||
}
|
||||
|
@ -176,6 +217,14 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
open("#{url}/proxy", :proxy=>:invalid) {}
|
||||
}
|
||||
assert_equal("", log); log.clear
|
||||
with_env("http_proxy"=>proxy_url) {
|
||||
# should not use proxy for 127.0.0.0/8.
|
||||
open("#{url}/proxy") {|f|
|
||||
assert_equal("200", f.status[0])
|
||||
assert_equal("proxy", f.read)
|
||||
}
|
||||
}
|
||||
assert_equal("", log); log.clear
|
||||
ensure
|
||||
proxy.shutdown
|
||||
end
|
||||
|
@ -236,6 +285,14 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
}
|
||||
end
|
||||
|
||||
def test_redirect_loop
|
||||
with_http {|srv, dr, url|
|
||||
srv.mount_proc("/r1/") {|req, res| res.status = 301; res["location"] = "#{url}/r2"; res.body = "r1" }
|
||||
srv.mount_proc("/r2/") {|req, res| res.status = 301; res["location"] = "#{url}/r1"; res.body = "r2" }
|
||||
assert_raise(RuntimeError) { open("#{url}/r1/") {} }
|
||||
}
|
||||
end
|
||||
|
||||
def test_redirect_relative
|
||||
TCPServer.open("127.0.0.1", 0) {|serv|
|
||||
port = serv.addr[1]
|
||||
|
@ -391,6 +448,18 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
}
|
||||
end
|
||||
|
||||
def test_quoted_attvalue
|
||||
with_http {|srv, dr, url|
|
||||
content_u8 = "\u3042"
|
||||
srv.mount_proc("/qu8/") {|req, res| res.body = content_u8; res['content-type'] = 'text/plain; charset="utf\-8"' }
|
||||
open("#{url}/qu8/") {|f|
|
||||
assert_equal(content_u8, f.read)
|
||||
assert_equal("text/plain", f.content_type)
|
||||
assert_equal("utf-8", f.charset)
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def test_last_modified
|
||||
with_http {|srv, dr, url|
|
||||
srv.mount_proc("/data/") {|req, res| res.body = "foo"; res['last-modified'] = 'Fri, 07 Aug 2009 06:05:04 GMT' }
|
||||
|
@ -423,17 +492,6 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
}
|
||||
end
|
||||
|
||||
def with_env(h)
|
||||
begin
|
||||
old = {}
|
||||
h.each_key {|k| old[k] = ENV[k] }
|
||||
h.each {|k, v| ENV[k] = v }
|
||||
yield
|
||||
ensure
|
||||
h.each_key {|k| ENV[k] = old[k] }
|
||||
end
|
||||
end
|
||||
|
||||
# 192.0.2.0/24 is TEST-NET. [RFC3330]
|
||||
|
||||
def test_find_proxy
|
||||
|
@ -488,7 +546,7 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
begin
|
||||
s.print "220 Test FTP Server\r\n"
|
||||
assert_equal("USER anonymous\r\n", s.gets); s.print "331 name ok\r\n"
|
||||
assert_match(/\APASS .*\r\n/, s.gets); s.print "230 logged in\r\n"
|
||||
assert_match(/\APASS .*\r\n\z/, s.gets); s.print "230 logged in\r\n"
|
||||
assert_equal("TYPE I\r\n", s.gets); s.print "200 type set to I\r\n"
|
||||
assert_equal("CWD foo\r\n", s.gets); s.print "250 CWD successful\r\n"
|
||||
assert_equal("PASV\r\n", s.gets)
|
||||
|
@ -521,6 +579,45 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
}
|
||||
end
|
||||
|
||||
def test_ftp_active
|
||||
TCPServer.open("127.0.0.1", 0) {|serv|
|
||||
_, port, _, host = serv.addr
|
||||
th = Thread.new {
|
||||
s = serv.accept
|
||||
begin
|
||||
content = "content"
|
||||
s.print "220 Test FTP Server\r\n"
|
||||
assert_equal("USER anonymous\r\n", s.gets); s.print "331 name ok\r\n"
|
||||
assert_match(/\APASS .*\r\n\z/, s.gets); s.print "230 logged in\r\n"
|
||||
assert_equal("TYPE I\r\n", s.gets); s.print "200 type set to I\r\n"
|
||||
assert_equal("CWD foo\r\n", s.gets); s.print "250 CWD successful\r\n"
|
||||
assert(m = /\APORT 127,0,0,1,(\d+),(\d+)\r\n\z/.match(s.gets))
|
||||
active_port = m[1].to_i << 8 | m[2].to_i
|
||||
TCPSocket.open("127.0.0.1", active_port) {|data_sock|
|
||||
s.print "200 data connection opened\r\n"
|
||||
assert_equal("RETR bar\r\n", s.gets); s.print "150 file okay\r\n"
|
||||
begin
|
||||
data_sock << content
|
||||
ensure
|
||||
data_sock.close
|
||||
end
|
||||
s.print "226 transfer complete\r\n"
|
||||
assert_nil(s.gets)
|
||||
}
|
||||
ensure
|
||||
s.close if s
|
||||
end
|
||||
}
|
||||
begin
|
||||
content = URI("ftp://#{host}:#{port}/foo/bar").read(:ftp_active_mode=>true)
|
||||
assert_equal("content", content)
|
||||
ensure
|
||||
Thread.kill(th)
|
||||
th.join
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
def test_ftp_ascii
|
||||
TCPServer.open("127.0.0.1", 0) {|serv|
|
||||
_, port, _, host = serv.addr
|
||||
|
@ -530,7 +627,7 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
content = "content"
|
||||
s.print "220 Test FTP Server\r\n"
|
||||
assert_equal("USER anonymous\r\n", s.gets); s.print "331 name ok\r\n"
|
||||
assert_match(/\APASS .*\r\n/, s.gets); s.print "230 logged in\r\n"
|
||||
assert_match(/\APASS .*\r\n\z/, s.gets); s.print "230 logged in\r\n"
|
||||
assert_equal("TYPE I\r\n", s.gets); s.print "200 type set to I\r\n"
|
||||
assert_equal("CWD /foo\r\n", s.gets); s.print "250 CWD successful\r\n"
|
||||
assert_equal("TYPE A\r\n", s.gets); s.print "200 type set to A\r\n"
|
||||
|
|
Loading…
Reference in a new issue