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
|
# frozen_string_literal: true
require 'webrick'
RSpec.shared_examples_for 'all server drafts' do
def validate_request
handshake << client_request
expect(handshake.error).to be_nil
expect(handshake).to be_finished
expect(handshake).to be_valid
expect(handshake.to_s).to eql(server_response)
end
it 'is valid' do
handshake << client_request
expect(handshake.error).to be_nil
expect(handshake).to be_finished
expect(handshake).to be_valid
end
it 'returns valid version' do
handshake << client_request
expect(handshake.version).to eql(version)
end
it 'returns valid host' do
@request_params = { host: 'www.test.cc' }
handshake << client_request
expect(handshake.host).to eql('www.test.cc')
end
it 'returns valid path' do
@request_params = { path: '/custom' }
handshake << client_request
expect(handshake.path).to eql('/custom')
end
it 'returns valid query' do
@request_params = { path: '/custom?aaa=bbb' }
handshake << client_request
expect(handshake.query).to eql('aaa=bbb')
end
it 'returns default port' do
handshake << client_request
expect(handshake.port).to be(80)
end
it 'returns valid port' do
@request_params = { port: 123 }
handshake << client_request
expect(handshake.port).to be(123)
end
it 'returns valid response' do
validate_request
end
it 'allows custom path' do
@request_params = { path: '/custom' }
validate_request
end
it 'allows query in path' do
@request_params = { path: '/custom?test=true' }
validate_request
end
it 'allows custom port' do
@request_params = { port: 123 }
validate_request
end
it 'recognizes unfinished requests' do
handshake << client_request[0..-10]
expect(handshake).not_to be_finished
expect(handshake).not_to be_valid
end
it 'disallows requests with invalid request method' do
handshake << client_request.gsub('GET', 'POST')
expect(handshake).to be_finished
expect(handshake).not_to be_valid
expect(handshake.error).to be(:get_request_required)
end
it 'parses a rack request' do
request = WEBrick::HTTPRequest.new(ServerSoftware: 'rspec')
expect(request.parse(StringIO.new(client_request))).to be true
rest = client_request.slice((request.to_s.length..-1))
handshake.from_rack(request.meta_vars.merge(
'rack.input' => StringIO.new(rest),
:random_key => :random_value
))
validate_request
end
it 'parses a hash request' do
request = WEBrick::HTTPRequest.new(ServerSoftware: 'rspec')
expect(request.parse(StringIO.new(client_request))).to be true
body = client_request.slice((request.to_s.length..-1))
path = request.path
query = request.query_string
headers = request.header.each_with_object({}) do |header, hash|
hash[header[0]] = header[1].first if header[0] && header[1]
end
handshake.from_hash(headers: headers,
path: path,
query: query,
body: body)
validate_request
end
end
|