rack.git  about / heads / tags
a modular Ruby webserver interface
blob 8cfe2017b52702b55e9739e7360cc9cc8620a576 2547 bytes (raw)
$ git show rack.io:test/spec_rack_sendfile.rb	# shows this blob on the CLI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
 
require 'test/spec'
require 'rack/mock'
require 'rack/sendfile'

context "Rack::File" do
  specify "should respond to #to_path" do
    Rack::File.new(Dir.pwd).should.respond_to :to_path
  end
end

context "Rack::Sendfile" do
  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

  setup do
    @request = Rack::MockRequest.new(sendfile_app)
  end

  def request(headers={})
    yield @request.get('/', headers)
  end

  specify "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

  specify "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['X-Sendfile'].should.equal '/tmp/hello.txt'
    end
  end

  specify "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['X-Lighttpd-Send-File'].should.equal '/tmp/hello.txt'
    end
  end

  specify "sets X-Accel-Redirect response header and discards body" do
    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

  specify '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

  specify 'does nothing when body does not respond to #to_path' do
    @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

git clone https://yhbt.net/rack.git