晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/opt/alt/ruby20/lib64/ruby/gems/2.0.0/gems/rack-1.6.4/test/ |
| Current File : //opt/alt/ruby20/lib64/ruby/gems/2.0.0/gems/rack-1.6.4/test/spec_sendfile.rb |
require 'fileutils'
require 'rack/lint'
require 'rack/sendfile'
require 'rack/mock'
require 'tmpdir'
describe Rack::File do
should "respond to #to_path" do
Rack::File.new(Dir.pwd).should.respond_to :to_path
end
end
describe Rack::Sendfile do
def sendfile_body
FileUtils.touch File.join(Dir.tmpdir, "rack_sendfile")
res = ['Hello World']
def res.to_path ; File.join(Dir.tmpdir, "rack_sendfile") ; end
res
end
def simple_app(body=sendfile_body)
lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
end
def sendfile_app(body, mappings = [])
Rack::Lint.new Rack::Sendfile.new(simple_app(body), nil, mappings)
end
def request(headers={}, body=sendfile_body, mappings=[])
yield Rack::MockRequest.new(sendfile_app(body, mappings)).get('/', headers)
end
def open_file(path)
Class.new(File) do
unless method_defined?(:to_path)
alias :to_path :path
end
end.open(path, 'wb+')
end
it "does nothing when no X-Sendfile-Type header present" do
request do |response|
response.should.be.ok
response.body.should.equal 'Hello World'
response.headers.should.not.include 'X-Sendfile'
end
end
it "sets X-Sendfile response header and discards body" do
request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response|
response.should.be.ok
response.body.should.be.empty
response.headers['Content-Length'].should.equal '0'
response.headers['X-Sendfile'].should.equal File.join(Dir.tmpdir, "rack_sendfile")
end
end
it "sets X-Lighttpd-Send-File response header and discards body" do
request 'HTTP_X_SENDFILE_TYPE' => 'X-Lighttpd-Send-File' do |response|
response.should.be.ok
response.body.should.be.empty
response.headers['Content-Length'].should.equal '0'
response.headers['X-Lighttpd-Send-File'].should.equal File.join(Dir.tmpdir, "rack_sendfile")
end
end
it "sets X-Accel-Redirect response header and discards body" do
headers = {
'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect',
'HTTP_X_ACCEL_MAPPING' => "#{Dir.tmpdir}/=/foo/bar/"
}
request headers do |response|
response.should.be.ok
response.body.should.be.empty
response.headers['Content-Length'].should.equal '0'
response.headers['X-Accel-Redirect'].should.equal '/foo/bar/rack_sendfile'
end
end
it 'writes to rack.error when no X-Accel-Mapping is specified' do
request 'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect' do |response|
response.should.be.ok
response.body.should.equal 'Hello World'
response.headers.should.not.include 'X-Accel-Redirect'
response.errors.should.include 'X-Accel-Mapping'
end
end
it 'does nothing when body does not respond to #to_path' do
request({'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile'}, ['Not a file...']) do |response|
response.body.should.equal 'Not a file...'
response.headers.should.not.include 'X-Sendfile'
end
end
it "sets X-Accel-Redirect response header and discards body when initialized with multiple mappings" do
begin
dir1 = Dir.mktmpdir
dir2 = Dir.mktmpdir
first_body = open_file(File.join(dir1, 'rack_sendfile'))
first_body.puts 'hello world'
second_body = open_file(File.join(dir2, 'rack_sendfile'))
second_body.puts 'goodbye world'
mappings = [
["#{dir1}/", '/foo/bar/'],
["#{dir2}/", '/wibble/']
]
request({'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect'}, first_body, mappings) do |response|
response.should.be.ok
response.body.should.be.empty
response.headers['Content-Length'].should.equal '0'
response.headers['X-Accel-Redirect'].should.equal '/foo/bar/rack_sendfile'
end
request({'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect'}, second_body, mappings) do |response|
response.should.be.ok
response.body.should.be.empty
response.headers['Content-Length'].should.equal '0'
response.headers['X-Accel-Redirect'].should.equal '/wibble/rack_sendfile'
end
ensure
FileUtils.remove_entry_secure dir1
FileUtils.remove_entry_secure dir2
end
end
end
|