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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
require_relative 'test_helper'
require 'stringio'
class RequestTest < Minitest::Test
it 'responds to #user_agent' do
request = Sinatra::Request.new({'HTTP_USER_AGENT' => 'Test'})
assert request.respond_to?(:user_agent)
assert_equal 'Test', request.user_agent
end
it 'parses POST params when Content-Type is form-dataish' do
request = Sinatra::Request.new(
'REQUEST_METHOD' => 'PUT',
'CONTENT_TYPE' => 'application/x-www-form-urlencoded',
'rack.input' => StringIO.new('foo=bar')
)
assert_equal 'bar', request.params['foo']
end
it 'raises Sinatra::BadRequest when multipart/form-data request has no content' do
request = Sinatra::Request.new(
'REQUEST_METHOD' => 'POST',
'CONTENT_TYPE' => 'multipart/form-data; boundary=dummy',
'rack.input' => StringIO.new('')
)
assert_raises(Sinatra::BadRequest) { request.params }
end
it 'is secure when the url scheme is https' do
request = Sinatra::Request.new('rack.url_scheme' => 'https')
assert request.secure?
end
it 'is not secure when the url scheme is http' do
request = Sinatra::Request.new('rack.url_scheme' => 'http')
assert !request.secure?
end
it 'respects X-Forwarded-Host header' do
request = Sinatra::Request.new('HTTP_X_FORWARDED_HOST' => 'example.com')
assert request.forwarded?
end
it 'respects Forwarded header with host key' do
request = Sinatra::Request.new('HTTP_FORWARDED' => 'host=example.com')
assert request.forwarded?
request = Sinatra::Request.new('HTTP_FORWARDED' => 'for=192.0.2.60;proto=http;by=203.0.113.43')
refute request.forwarded?
end
it 'respects X-Forwarded-Proto header for proxied SSL' do
request = Sinatra::Request.new('HTTP_X_FORWARDED_PROTO' => 'https')
assert request.secure?
end
it 'is possible to marshal params' do
request = Sinatra::Request.new(
'REQUEST_METHOD' => 'PUT',
'CONTENT_TYPE' => 'application/x-www-form-urlencoded',
'rack.input' => StringIO.new('foo=bar')
)
Sinatra::IndifferentHash[request.params]
dumped = Marshal.dump(request.params)
assert_equal 'bar', Marshal.load(dumped)['foo']
end
it "exposes the preferred type's parameters" do
request = Sinatra::Request.new(
'HTTP_ACCEPT' => 'image/jpeg; compress=0.25'
)
assert_equal({ 'compress' => '0.25' }, request.preferred_type.params)
end
it "raises Sinatra::BadRequest when params contain conflicting types" do
request = Sinatra::Request.new 'QUERY_STRING' => 'foo=&foo[]='
assert_raises(Sinatra::BadRequest) { request.params }
end
it "makes accept types behave like strings" do
request = Sinatra::Request.new('HTTP_ACCEPT' => 'image/jpeg; compress=0.25')
assert request.accept?('image/jpeg')
assert_equal 'image/jpeg', request.preferred_type.to_s
assert_equal 'image/jpeg; compress=0.25', request.preferred_type.to_s(true)
assert_equal 'image/jpeg', request.preferred_type.to_str
assert_equal 'image', request.preferred_type.split('/').first
String.instance_methods.each do |method|
next unless "".respond_to? method
assert request.preferred_type.respond_to?(method), "responds to #{method}"
end
end
it "accepts types when wildcards are requested" do
request = Sinatra::Request.new('HTTP_ACCEPT' => 'image/*')
assert request.accept?('image/jpeg')
end
it "properly decodes MIME type parameters" do
request = Sinatra::Request.new(
'HTTP_ACCEPT' => 'image/jpeg;unquoted=0.25;quoted="0.25";chartest="\";,\x"'
)
expected = { 'unquoted' => '0.25', 'quoted' => '0.25', 'chartest' => '";,x' }
assert_equal(expected, request.preferred_type.params)
end
it 'accepts */* when HTTP_ACCEPT is not present in the request' do
request = Sinatra::Request.new Hash.new
assert_equal 1, request.accept.size
assert request.accept?('text/html')
assert_equal '*/*', request.preferred_type.to_s
assert_equal '*/*', request.preferred_type.to_s(true)
end
it 'accepts */* when HTTP_ACCEPT is blank in the request' do
request = Sinatra::Request.new 'HTTP_ACCEPT' => ''
assert_equal 1, request.accept.size
assert request.accept?('text/html')
assert_equal '*/*', request.preferred_type.to_s
assert_equal '*/*', request.preferred_type.to_s(true)
end
it 'will not accept types not specified in HTTP_ACCEPT when HTTP_ACCEPT is provided' do
request = Sinatra::Request.new 'HTTP_ACCEPT' => 'application/json'
assert !request.accept?('text/html')
end
it 'will accept types that fulfill HTTP_ACCEPT parameters' do
request = Sinatra::Request.new 'HTTP_ACCEPT' => 'application/rss+xml; version="http://purl.org/rss/1.0/"'
assert request.accept?('application/rss+xml; version="http://purl.org/rss/1.0/"')
assert request.accept?('application/rss+xml; version="http://purl.org/rss/1.0/"; charset=utf-8')
assert !request.accept?('application/rss+xml; version="https://cyber.harvard.edu/rss/rss.html"')
end
it 'will accept more generic types that include HTTP_ACCEPT parameters' do
request = Sinatra::Request.new 'HTTP_ACCEPT' => 'application/rss+xml; charset=utf-8; version="http://purl.org/rss/1.0/"'
assert request.accept?('application/rss+xml')
assert request.accept?('application/rss+xml; version="http://purl.org/rss/1.0/"')
end
it 'will accept types matching HTTP_ACCEPT when parameters in arbitrary order' do
request = Sinatra::Request.new 'HTTP_ACCEPT' => 'application/rss+xml; charset=utf-8; version="http://purl.org/rss/1.0/"'
assert request.accept?('application/rss+xml; version="http://purl.org/rss/1.0/"; charset=utf-8')
end
end
|