2009-12-26 21:00:18 +01:00
|
|
|
require 'rack/sendfile'
|
2010-06-14 06:09:24 +02:00
|
|
|
require 'rack/mock'
|
2009-12-26 21:00:18 +01:00
|
|
|
|
2010-06-14 06:09:24 +02:00
|
|
|
describe Rack::File do
|
|
|
|
should "respond to #to_path" do
|
2009-12-26 21:00:18 +01:00
|
|
|
Rack::File.new(Dir.pwd).should.respond_to :to_path
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-06-14 06:09:24 +02:00
|
|
|
describe Rack::Sendfile do
|
2009-12-26 21:00:18 +01:00
|
|
|
def sendfile_body
|
|
|
|
res = ['Hello World']
|
|
|
|
def res.to_path ; "/tmp/hello.txt" ; end
|
|
|
|
res
|
|
|
|
end
|
|
|
|
|
|
|
|
def simple_app(body=sendfile_body)
|
|
|
|
lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
|
|
|
|
end
|
|
|
|
|
|
|
|
def sendfile_app(body=sendfile_body)
|
|
|
|
Rack::Sendfile.new(simple_app(body))
|
|
|
|
end
|
|
|
|
|
2010-06-14 06:09:24 +02:00
|
|
|
@request = Rack::MockRequest.new(sendfile_app)
|
2009-12-26 21:00:18 +01:00
|
|
|
|
|
|
|
def request(headers={})
|
|
|
|
yield @request.get('/', headers)
|
|
|
|
end
|
|
|
|
|
2010-06-14 06:09:24 +02:00
|
|
|
it "does nothing when no X-Sendfile-Type header present" do
|
2009-12-26 21:00:18 +01:00
|
|
|
request do |response|
|
|
|
|
response.should.be.ok
|
|
|
|
response.body.should.equal 'Hello World'
|
|
|
|
response.headers.should.not.include 'X-Sendfile'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-06-14 06:09:24 +02:00
|
|
|
it "sets X-Sendfile response header and discards body" do
|
2009-12-26 21:00:18 +01:00
|
|
|
request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response|
|
|
|
|
response.should.be.ok
|
|
|
|
response.body.should.be.empty
|
|
|
|
response.headers['X-Sendfile'].should.equal '/tmp/hello.txt'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-06-14 06:09:24 +02:00
|
|
|
it "sets X-Lighttpd-Send-File response header and discards body" do
|
2009-12-26 21:00:18 +01:00
|
|
|
request 'HTTP_X_SENDFILE_TYPE' => 'X-Lighttpd-Send-File' do |response|
|
|
|
|
response.should.be.ok
|
|
|
|
response.body.should.be.empty
|
|
|
|
response.headers['X-Lighttpd-Send-File'].should.equal '/tmp/hello.txt'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-06-14 06:09:24 +02:00
|
|
|
it "sets X-Accel-Redirect response header and discards body" do
|
2009-12-26 21:00:18 +01:00
|
|
|
headers = {
|
|
|
|
'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect',
|
|
|
|
'HTTP_X_ACCEL_MAPPING' => '/tmp/=/foo/bar/'
|
|
|
|
}
|
|
|
|
request headers do |response|
|
|
|
|
response.should.be.ok
|
|
|
|
response.body.should.be.empty
|
|
|
|
response.headers['X-Accel-Redirect'].should.equal '/foo/bar/hello.txt'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-06-14 06:09:24 +02:00
|
|
|
it 'writes to rack.error when no X-Accel-Mapping is specified' do
|
2009-12-26 21:00:18 +01:00
|
|
|
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
|
|
|
|
|
2010-06-14 06:09:24 +02:00
|
|
|
it 'does nothing when body does not respond to #to_path' do
|
2009-12-26 21:00:18 +01:00
|
|
|
@request = Rack::MockRequest.new(sendfile_app(['Not a file...']))
|
|
|
|
request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response|
|
|
|
|
response.body.should.equal 'Not a file...'
|
|
|
|
response.headers.should.not.include 'X-Sendfile'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|