tilia-http 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.rspec +1 -0
- data/.rubocop.yml +35 -0
- data/.simplecov +4 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.sabre.md +235 -0
- data/CONTRIBUTING.md +25 -0
- data/Gemfile +18 -0
- data/Gemfile.lock +69 -0
- data/LICENSE +27 -0
- data/LICENSE.sabre +27 -0
- data/README.md +68 -0
- data/Rakefile +17 -0
- data/examples/asyncclient.rb +45 -0
- data/examples/basicauth.rb +39 -0
- data/examples/client.rb +20 -0
- data/examples/reverseproxy.rb +39 -0
- data/examples/stringify.rb +37 -0
- data/lib/tilia/http/auth/abstract_auth.rb +51 -0
- data/lib/tilia/http/auth/aws.rb +191 -0
- data/lib/tilia/http/auth/basic.rb +43 -0
- data/lib/tilia/http/auth/bearer.rb +37 -0
- data/lib/tilia/http/auth/digest.rb +187 -0
- data/lib/tilia/http/auth.rb +12 -0
- data/lib/tilia/http/client.rb +452 -0
- data/lib/tilia/http/client_exception.rb +15 -0
- data/lib/tilia/http/client_http_exception.rb +37 -0
- data/lib/tilia/http/http_exception.rb +21 -0
- data/lib/tilia/http/message.rb +241 -0
- data/lib/tilia/http/message_decorator_trait.rb +183 -0
- data/lib/tilia/http/message_interface.rb +154 -0
- data/lib/tilia/http/request.rb +235 -0
- data/lib/tilia/http/request_decorator.rb +160 -0
- data/lib/tilia/http/request_interface.rb +126 -0
- data/lib/tilia/http/response.rb +164 -0
- data/lib/tilia/http/response_decorator.rb +58 -0
- data/lib/tilia/http/response_interface.rb +36 -0
- data/lib/tilia/http/sapi.rb +165 -0
- data/lib/tilia/http/url_util.rb +70 -0
- data/lib/tilia/http/util.rb +51 -0
- data/lib/tilia/http/version.rb +9 -0
- data/lib/tilia/http.rb +416 -0
- data/test/http/auth/aws_test.rb +189 -0
- data/test/http/auth/basic_test.rb +60 -0
- data/test/http/auth/bearer_test.rb +47 -0
- data/test/http/auth/digest_test.rb +141 -0
- data/test/http/client_mock.rb +101 -0
- data/test/http/client_test.rb +331 -0
- data/test/http/message_decorator_test.rb +67 -0
- data/test/http/message_test.rb +163 -0
- data/test/http/request_decorator_test.rb +87 -0
- data/test/http/request_test.rb +132 -0
- data/test/http/response_decorator_test.rb +28 -0
- data/test/http/response_test.rb +38 -0
- data/test/http/sapi_mock.rb +12 -0
- data/test/http/sapi_test.rb +133 -0
- data/test/http/url_util_test.rb +155 -0
- data/test/http/util_test.rb +186 -0
- data/test/http_test.rb +102 -0
- data/test/test_helper.rb +6 -0
- data/tilia-http.gemspec +18 -0
- metadata +192 -0
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
module Tilia
|
5
|
+
module Http
|
6
|
+
class MessageTest < Minitest::Test
|
7
|
+
def test_construct
|
8
|
+
message = MessageMock.new
|
9
|
+
assert_kind_of(Message, message)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_stream_body
|
13
|
+
body = 'foo'
|
14
|
+
h = StringIO.new
|
15
|
+
h.write(body)
|
16
|
+
h.rewind
|
17
|
+
|
18
|
+
message = MessageMock.new
|
19
|
+
message.body = h
|
20
|
+
|
21
|
+
assert_equal(body, message.body_as_string)
|
22
|
+
h.rewind
|
23
|
+
assert_equal(body, message.body_as_stream.readlines.join(''))
|
24
|
+
h.rewind
|
25
|
+
assert_equal(body, message.body.readlines.join(''))
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_string_body
|
29
|
+
body = 'foo'
|
30
|
+
|
31
|
+
message = MessageMock.new
|
32
|
+
message.body = body
|
33
|
+
|
34
|
+
assert_equal(body, message.body_as_string)
|
35
|
+
assert_equal(body, message.body_as_stream.readlines.join(''))
|
36
|
+
assert_equal(body, message.body)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_get_empty_body_stream
|
40
|
+
message = MessageMock.new
|
41
|
+
body = message.body_as_stream
|
42
|
+
|
43
|
+
assert_equal('', body.readlines.join(''))
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_get_empty_body_string
|
47
|
+
message = MessageMock.new
|
48
|
+
body = message.body_as_string
|
49
|
+
|
50
|
+
assert_equal('', body)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_headers
|
54
|
+
message = MessageMock.new
|
55
|
+
message.update_header('X-Foo', 'bar')
|
56
|
+
|
57
|
+
# Testing caselessness
|
58
|
+
assert_equal('bar', message.header('X-Foo'))
|
59
|
+
assert_equal('bar', message.header('x-fOO'))
|
60
|
+
|
61
|
+
assert(message.remove_header('X-FOO'))
|
62
|
+
assert_nil(message.header('X-Foo'))
|
63
|
+
refute(message.remove_header('X-FOO'))
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_set_headers
|
67
|
+
message = MessageMock.new
|
68
|
+
|
69
|
+
headers = {
|
70
|
+
'X-Foo' => ['1'],
|
71
|
+
'X-Bar' => ['2']
|
72
|
+
}
|
73
|
+
|
74
|
+
message.update_headers(headers)
|
75
|
+
assert_equal(headers, message.headers)
|
76
|
+
|
77
|
+
message.update_headers(
|
78
|
+
'X-Foo' => ['3', '4'],
|
79
|
+
'X-Bar' => '5'
|
80
|
+
)
|
81
|
+
|
82
|
+
expected = {
|
83
|
+
'X-Foo' => ['3', '4'],
|
84
|
+
'X-Bar' => ['5']
|
85
|
+
}
|
86
|
+
|
87
|
+
assert_equal(expected, message.headers)
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_add_headers
|
91
|
+
message = MessageMock.new
|
92
|
+
|
93
|
+
headers = {
|
94
|
+
'X-Foo' => ['1'],
|
95
|
+
'X-Bar' => ['2']
|
96
|
+
}
|
97
|
+
|
98
|
+
message.add_headers(headers)
|
99
|
+
assert_equal(headers, message.headers)
|
100
|
+
|
101
|
+
message.add_headers(
|
102
|
+
'X-Foo' => ['3', '4'],
|
103
|
+
'X-Bar' => '5'
|
104
|
+
)
|
105
|
+
|
106
|
+
expected = {
|
107
|
+
'X-Foo' => ['1', '3', '4'],
|
108
|
+
'X-Bar' => ['2', '5']
|
109
|
+
}
|
110
|
+
|
111
|
+
assert_equal(expected, message.headers)
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_send_body
|
115
|
+
message = MessageMock.new
|
116
|
+
|
117
|
+
# String
|
118
|
+
message.body = 'foo'
|
119
|
+
|
120
|
+
# Stream
|
121
|
+
h = StringIO.new
|
122
|
+
h.write('bar')
|
123
|
+
h.rewind
|
124
|
+
message.body = h
|
125
|
+
|
126
|
+
body = message.body
|
127
|
+
body.rewind
|
128
|
+
|
129
|
+
assert_equal('bar', body.readlines.join(''))
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_multiple_headers
|
133
|
+
message = MessageMock.new
|
134
|
+
message.update_header('a', '1')
|
135
|
+
message.add_header('A', '2')
|
136
|
+
|
137
|
+
assert_equal('1,2', message.header('A'))
|
138
|
+
assert_equal('1,2', message.header('a'))
|
139
|
+
|
140
|
+
assert_equal(['1', '2'], message.header_as_array('A'))
|
141
|
+
assert_equal(['1', '2'], message.header_as_array('a'))
|
142
|
+
|
143
|
+
assert_equal([], message.header_as_array('B'))
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_has_headers
|
147
|
+
message = MessageMock.new
|
148
|
+
|
149
|
+
refute(message.header?('X-Foo'))
|
150
|
+
message.update_header('X-Foo', 'Bar')
|
151
|
+
assert(message.header?('X-Foo'))
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
class MessageMock
|
156
|
+
include Message
|
157
|
+
|
158
|
+
def initialize
|
159
|
+
initialize_message
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tilia
|
4
|
+
module Http
|
5
|
+
class RequestDecoratorTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
@inner = Request.new
|
8
|
+
@outer = RequestDecorator.new(@inner)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_method
|
12
|
+
@outer.method = 'FOO'
|
13
|
+
assert_equal('FOO', @inner.method)
|
14
|
+
assert_equal('FOO', @outer.method)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_url
|
18
|
+
@outer.url = '/foo'
|
19
|
+
assert_equal('/foo', @inner.url)
|
20
|
+
assert_equal('/foo', @outer.url)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_absolute_url
|
24
|
+
@outer.absolute_url = 'http://example.org/foo'
|
25
|
+
assert_equal('http://example.org/foo', @inner.absolute_url)
|
26
|
+
assert_equal('http://example.org/foo', @outer.absolute_url)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_base_url
|
30
|
+
@outer.base_url = '/foo'
|
31
|
+
assert_equal('/foo', @inner.base_url)
|
32
|
+
assert_equal('/foo', @outer.base_url)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_path
|
36
|
+
@outer.base_url = '/foo'
|
37
|
+
@outer.url = '/foo/bar'
|
38
|
+
assert_equal('bar', @inner.path)
|
39
|
+
assert_equal('bar', @outer.path)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_query_params
|
43
|
+
@outer.url = '/foo?a=b&c=d&e'
|
44
|
+
expected = {
|
45
|
+
'a' => 'b',
|
46
|
+
'c' => 'd',
|
47
|
+
'e' => nil
|
48
|
+
}
|
49
|
+
|
50
|
+
assert_equal(expected, @inner.query_parameters)
|
51
|
+
assert_equal(expected, @outer.query_parameters)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_post_data
|
55
|
+
post_data = {
|
56
|
+
'a' => 'b',
|
57
|
+
'c' => 'd',
|
58
|
+
'e' => nil
|
59
|
+
}
|
60
|
+
|
61
|
+
@outer.post_data = post_data
|
62
|
+
assert_equal(post_data, @outer.post_data)
|
63
|
+
assert_equal(post_data, @inner.post_data)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_server_data
|
67
|
+
server_data = { 'HTTPS' => 'On' }
|
68
|
+
|
69
|
+
@outer.raw_server_data = server_data
|
70
|
+
assert_equal('On', @inner.raw_server_value('HTTPS'))
|
71
|
+
assert_equal('On', @outer.raw_server_value('HTTPS'))
|
72
|
+
|
73
|
+
assert_nil(@inner.raw_server_value('FOO'))
|
74
|
+
assert_nil(@outer.raw_server_value('FOO'))
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_to_string
|
78
|
+
@inner.method = 'POST'
|
79
|
+
@inner.url = '/foo/bar/'
|
80
|
+
@inner.body = 'foo'
|
81
|
+
@inner.update_header('foo', 'bar')
|
82
|
+
|
83
|
+
assert_equal(@inner.to_s, @outer.to_s)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'http/sapi_mock'
|
3
|
+
|
4
|
+
module Tilia
|
5
|
+
module Http
|
6
|
+
class RequestTest < Minitest::Test
|
7
|
+
def test_construct
|
8
|
+
request = Request.new('GET', '/foo', 'User-Agent' => 'Evert')
|
9
|
+
assert_equal('GET', request.method)
|
10
|
+
assert_equal('/foo', request.url)
|
11
|
+
assert_equal({ 'User-Agent' => ['Evert'] }, request.headers)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_get_query_parameters
|
15
|
+
request = Request.new('GET', '/foo?a=b&c&d=e')
|
16
|
+
assert_equal(
|
17
|
+
{
|
18
|
+
'a' => 'b',
|
19
|
+
'c' => nil,
|
20
|
+
'd' => 'e'
|
21
|
+
},
|
22
|
+
request.query_parameters
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_get_query_parameters_no_data
|
27
|
+
request = Request.new('GET', '/foo')
|
28
|
+
assert_equal({}, request.query_parameters)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_create_from_php_request
|
32
|
+
sapi = SapiMock.new('REQUEST_METHOD' => 'PUT')
|
33
|
+
|
34
|
+
request = sapi.request
|
35
|
+
assert_equal('PUT', request.method)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_get_absolute_url
|
39
|
+
s = {
|
40
|
+
'HTTP_HOST' => 'sabredav.org',
|
41
|
+
'REQUEST_URI' => '/foo'
|
42
|
+
}
|
43
|
+
|
44
|
+
r = Sapi.create_from_server_array(s)
|
45
|
+
|
46
|
+
assert_equal('http://sabredav.org/foo', r.absolute_url)
|
47
|
+
|
48
|
+
s = {
|
49
|
+
'HTTP_HOST' => 'sabredav.org',
|
50
|
+
'REQUEST_URI' => '/foo',
|
51
|
+
'HTTPS' => 'on'
|
52
|
+
}
|
53
|
+
|
54
|
+
r = Sapi.create_from_server_array(s)
|
55
|
+
|
56
|
+
assert_equal('https://sabredav.org/foo', r.absolute_url)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_get_post_data
|
60
|
+
post = { 'bla' => 'foo' }
|
61
|
+
r = Request.new
|
62
|
+
r.post_data = post
|
63
|
+
assert_equal(post, r.post_data)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_get_path
|
67
|
+
request = Request.new
|
68
|
+
request.base_url = '/foo'
|
69
|
+
request.url = '/foo/bar/'
|
70
|
+
|
71
|
+
assert_equal('bar', request.path)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_get_path_stripped_query
|
75
|
+
request = Request.new
|
76
|
+
request.base_url = '/foo'
|
77
|
+
request.url = '/foo/bar/?a=b'
|
78
|
+
|
79
|
+
assert_equal('bar', request.path)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_get_path_missing_slash
|
83
|
+
request = Request.new
|
84
|
+
request.base_url = '/foo/'
|
85
|
+
request.url = '/foo'
|
86
|
+
|
87
|
+
assert_equal('', request.path)
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_get_path_outside_base_url
|
91
|
+
request = Request.new
|
92
|
+
request.base_url = '/foo/'
|
93
|
+
request.url = '/bar/'
|
94
|
+
|
95
|
+
assert_raises(RuntimeError) { request.path }
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_to_string
|
99
|
+
request = Request.new('PUT', '/foo/bar', 'Content-Type' => 'text/xml')
|
100
|
+
request.body = 'foo'
|
101
|
+
|
102
|
+
expected = <<HI
|
103
|
+
PUT /foo/bar HTTP/1.1\r
|
104
|
+
Content-Type: text/xml\r
|
105
|
+
\r
|
106
|
+
foo
|
107
|
+
HI
|
108
|
+
expected.chomp!
|
109
|
+
assert_equal(expected, request.to_s)
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_to_string_authorization
|
113
|
+
request = Request.new('PUT', '/foo/bar', 'Content-Type' => 'text/xml', 'Authorization' => 'Basic foobar')
|
114
|
+
request.body = 'foo'
|
115
|
+
|
116
|
+
expected = <<HI
|
117
|
+
PUT /foo/bar HTTP/1.1\r
|
118
|
+
Content-Type: text/xml\r
|
119
|
+
Authorization: Basic REDACTED\r
|
120
|
+
\r
|
121
|
+
foo
|
122
|
+
HI
|
123
|
+
expected.chomp!
|
124
|
+
assert_equal(expected, request.to_s)
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_constructor_with_array
|
128
|
+
assert_raises(ArgumentError) { Request.new([]) }
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tilia
|
4
|
+
module Http
|
5
|
+
class ResponseDecoratorTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
@inner = Response.new
|
8
|
+
@outer = ResponseDecorator.new(@inner)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_status
|
12
|
+
@outer.status = 201
|
13
|
+
assert_equal(201, @inner.status)
|
14
|
+
assert_equal(201, @outer.status)
|
15
|
+
assert_equal('Created', @inner.status_text)
|
16
|
+
assert_equal('Created', @outer.status_text)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_to_string
|
20
|
+
@inner.status = 201
|
21
|
+
@inner.body = 'foo'
|
22
|
+
@inner.update_header('foo', 'bar')
|
23
|
+
|
24
|
+
assert_equal(@inner.to_s, @outer.to_s)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tilia
|
4
|
+
module Http
|
5
|
+
class ResponseTest < Minitest::Test
|
6
|
+
def test_construct
|
7
|
+
response = Response.new(200, 'Content-Type' => 'text/xml')
|
8
|
+
assert_equal(200, response.status)
|
9
|
+
assert_equal('OK', response.status_text)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_set_status
|
13
|
+
response = Response.new
|
14
|
+
response.status = '402 Where\'s my money?'
|
15
|
+
assert_equal(402, response.status)
|
16
|
+
assert_equal('Where\'s my money?', response.status_text)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_invalid_status
|
20
|
+
assert_raises(ArgumentError) { Response.new(1000) }
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_to_string
|
24
|
+
response = Response.new(200, 'Content-Type' => 'text/xml')
|
25
|
+
response.body = 'foo'
|
26
|
+
|
27
|
+
expected = <<HI
|
28
|
+
HTTP/1.1 200 OK\r
|
29
|
+
Content-Type: text/xml\r
|
30
|
+
\r
|
31
|
+
foo
|
32
|
+
HI
|
33
|
+
expected.chomp!
|
34
|
+
assert_equal(expected, response.to_s)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'base64'
|
3
|
+
require 'stringio'
|
4
|
+
require 'http/sapi_mock'
|
5
|
+
|
6
|
+
module Tilia
|
7
|
+
module Http
|
8
|
+
class SapiTest < Minitest::Test
|
9
|
+
def test_construct_from_server_array
|
10
|
+
request = Sapi.create_from_server_array(
|
11
|
+
'REQUEST_URI' => '/foo',
|
12
|
+
'REQUEST_METHOD' => 'GET',
|
13
|
+
'HTTP_USER_AGENT' => 'Evert',
|
14
|
+
'CONTENT_TYPE' => 'text/xml',
|
15
|
+
'CONTENT_LENGTH' => '400',
|
16
|
+
'SERVER_PROTOCOL' => 'HTTP/1.0'
|
17
|
+
)
|
18
|
+
|
19
|
+
assert_equal('GET', request.method)
|
20
|
+
assert_equal('/foo', request.url)
|
21
|
+
assert_equal(
|
22
|
+
{
|
23
|
+
'User-Agent' => ['Evert'],
|
24
|
+
'Content-Type' => ['text/xml'],
|
25
|
+
'Content-Length' => ['400']
|
26
|
+
},
|
27
|
+
request.headers
|
28
|
+
)
|
29
|
+
|
30
|
+
assert_equal('1.0', request.http_version)
|
31
|
+
|
32
|
+
assert_equal('400', request.raw_server_value('CONTENT_LENGTH'))
|
33
|
+
assert_nil(request.raw_server_value('FOO'))
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_construct_php_auth
|
37
|
+
request = Sapi.create_from_server_array(
|
38
|
+
'REQUEST_URI' => '/foo',
|
39
|
+
'REQUEST_METHOD' => 'GET',
|
40
|
+
'PHP_AUTH_USER' => 'user',
|
41
|
+
'PHP_AUTH_PW' => 'pass'
|
42
|
+
)
|
43
|
+
|
44
|
+
assert_equal('GET', request.method)
|
45
|
+
assert_equal('/foo', request.url)
|
46
|
+
assert_equal(
|
47
|
+
{
|
48
|
+
'Authorization' => ["Basic #{Base64.strict_encode64('user:pass')}"]
|
49
|
+
},
|
50
|
+
request.headers
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_construct_php_auth_digest
|
55
|
+
request = Sapi.create_from_server_array(
|
56
|
+
'REQUEST_URI' => '/foo',
|
57
|
+
'REQUEST_METHOD' => 'GET',
|
58
|
+
'PHP_AUTH_DIGEST' => 'blabla'
|
59
|
+
)
|
60
|
+
|
61
|
+
assert_equal('GET', request.method)
|
62
|
+
assert_equal('/foo', request.url)
|
63
|
+
assert_equal(
|
64
|
+
{
|
65
|
+
'Authorization' => ['Digest blabla']
|
66
|
+
},
|
67
|
+
request.headers
|
68
|
+
)
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_construct_redirect_auth
|
72
|
+
request = Sapi.create_from_server_array(
|
73
|
+
'REQUEST_URI' => '/foo',
|
74
|
+
'REQUEST_METHOD' => 'GET',
|
75
|
+
'REDIRECT_HTTP_AUTHORIZATION' => 'Basic bla'
|
76
|
+
)
|
77
|
+
|
78
|
+
assert_equal('GET', request.method)
|
79
|
+
assert_equal('/foo', request.url)
|
80
|
+
assert_equal(
|
81
|
+
{
|
82
|
+
'Authorization' => ['Basic bla']
|
83
|
+
},
|
84
|
+
request.headers
|
85
|
+
)
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_send
|
89
|
+
response = Response.new(204, 'Content-Type' => 'text/xml;charset=UTF-8')
|
90
|
+
|
91
|
+
# Second Content-Type header. Normally this doesn't make sense.
|
92
|
+
response.add_header('Content-Type', 'application/xml')
|
93
|
+
response.body = 'foo'
|
94
|
+
|
95
|
+
(_status, headers, body) = Sapi.send_response(response)
|
96
|
+
|
97
|
+
assert_equal(
|
98
|
+
{
|
99
|
+
'Content-Type' => "text/xml;charset=UTF-8\napplication/xml"
|
100
|
+
},
|
101
|
+
headers
|
102
|
+
)
|
103
|
+
|
104
|
+
assert_equal('foo', body.readlines.join(''))
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_send_limited_by_content_length_string
|
108
|
+
response = Response.new(200)
|
109
|
+
|
110
|
+
response.add_header('Content-Length', 19)
|
111
|
+
response.body = 'Send this sentence. Ignore this one.'
|
112
|
+
|
113
|
+
(_status, _headers, body) = Sapi.send_response(response)
|
114
|
+
|
115
|
+
assert_equal('Send this sentence.', body.readlines.join(''))
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_send_limited_by_content_length_stream
|
119
|
+
response = Response.new(200, 'Content-Length' => 19)
|
120
|
+
|
121
|
+
body = StringIO.new
|
122
|
+
body.write('Ignore this. Send this sentence. Ignore this too.')
|
123
|
+
body.rewind
|
124
|
+
body.read(13)
|
125
|
+
response.body = body
|
126
|
+
|
127
|
+
(_status, _headers, body) = Sapi.send_response(response)
|
128
|
+
|
129
|
+
assert_equal('Send this sentence.', body.readlines.join(''))
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|