ruby-ajp 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +504 -0
- data/Install.en +231 -0
- data/Install.ja +250 -0
- data/NEWS.en +13 -0
- data/NEWS.ja +12 -0
- data/README.en +56 -0
- data/README.ja +54 -0
- data/Rakefile +24 -0
- data/example/dump-server.rb +68 -0
- data/example/error-server.rb +13 -0
- data/example/hello-server.rb +18 -0
- data/lib/net/ajp13.rb +815 -0
- data/lib/net/ajp13client.rb +361 -0
- data/lib/net/ajp13server.rb +430 -0
- data/ruby-ajp.gemspec +27 -0
- data/setup.rb +1585 -0
- data/test/net/data/ajp13request-data.1 +0 -0
- data/test/net/data/ajp13response-header.1 +0 -0
- data/test/net/data/ajp13response-webdav.1 +0 -0
- data/test/net/data/ajp13response-webdav.2 +0 -0
- data/test/net/data/rand +0 -0
- data/test/net/test_ajp13client.rb +353 -0
- data/test/net/test_ajp13packet.rb +320 -0
- data/test/net/test_ajp13request.rb +177 -0
- data/test/net/test_ajp13response.rb +162 -0
- data/test/net/test_ajp13server.rb +548 -0
- metadata +73 -0
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'stringio'
|
3
|
+
require File.dirname(__FILE__) + '/../../lib/net/ajp13'
|
4
|
+
|
5
|
+
class Net::AJP13::RequestTest < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
@req = Net::AJP13::Request.new('/')
|
8
|
+
end
|
9
|
+
def test_new
|
10
|
+
assert_kind_of Net::AJP13::Request, @req
|
11
|
+
assert_equal '/', @req.path
|
12
|
+
|
13
|
+
req_with_another_path = Net::AJP13::Request.new('/path/to/somewhere')
|
14
|
+
assert_equal '/path/to/somewhere', req_with_another_path.path
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_header
|
18
|
+
assert_nil @req['accept-language']
|
19
|
+
assert_nil @req['content-type']
|
20
|
+
assert_nil @req['content-length']
|
21
|
+
|
22
|
+
@req['accept-laguage'] = 'ja,en_US,en'
|
23
|
+
assert_equal 'ja,en_US,en', @req['accept-laguage']
|
24
|
+
@req['AcCePt-lAgUaGe'] = 'fr,de,es'
|
25
|
+
assert_equal 'fr,de,es', @req['accept-laguage']
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_attribute
|
29
|
+
assert_nil @req.get_attributes('query_string')
|
30
|
+
assert_nil @req.get_attributes('something-unrecognized')
|
31
|
+
|
32
|
+
@req.set_attribute('QUERY_STRING', "a=1&b=c")
|
33
|
+
assert_equal ["a=1&b=c"], @req.get_attributes('qUeRy_StRiNg')
|
34
|
+
|
35
|
+
@req.add_attribute('something-unrecognized', 'abcde')
|
36
|
+
@req.add_attribute('something-unrecognized', 'fghij')
|
37
|
+
assert_equal ['abcde', 'fghij'], @req.get_attributes('something-unrecognized')
|
38
|
+
|
39
|
+
@req.set_attribute('something-unrecognized', 'something else')
|
40
|
+
assert_equal ['something else'], @req.get_attributes('something-unrecognized')
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_new
|
44
|
+
get = Net::AJP13::GetRequest.new('/path/to/somewhere',
|
45
|
+
'Accept' => 'text/xml')
|
46
|
+
assert_equal 'GET', get.method
|
47
|
+
assert_equal '/path/to/somewhere', get.path
|
48
|
+
assert !get.request_body_permitted?
|
49
|
+
assert get.response_body_permitted?
|
50
|
+
assert_equal 'text/xml', get['accept']
|
51
|
+
assert_same false, get.is_ssl?
|
52
|
+
|
53
|
+
post = Net::AJP13::PostRequest.new('/path/to/somewhere/else',
|
54
|
+
'Accept' => 'application/x-dvi')
|
55
|
+
assert_equal 'POST', post.method
|
56
|
+
assert_equal '/path/to/somewhere/else', post.path
|
57
|
+
assert post.request_body_permitted?
|
58
|
+
assert post.response_body_permitted?
|
59
|
+
assert_equal 'application/x-dvi', post['accept']
|
60
|
+
|
61
|
+
head = Net::AJP13::HeadRequest.new('/path/to/yet/another/place',
|
62
|
+
'Accept' => 'application/x-pdf')
|
63
|
+
assert_equal 'HEAD', head.method
|
64
|
+
assert_equal '/path/to/yet/another/place', head.path
|
65
|
+
assert !head.request_body_permitted?
|
66
|
+
assert !head.response_body_permitted?
|
67
|
+
assert_equal 'application/x-pdf', head['accept']
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_send_to
|
71
|
+
req = Net::AJP13::HeadRequest.new('/?q=something&a=1',
|
72
|
+
'Host' => 'localhost')
|
73
|
+
req.protocol = 'HTTP/1.1'
|
74
|
+
req.remote_addr = '127.0.0.1'
|
75
|
+
req.remote_host = 'localhost'
|
76
|
+
req.server_name = 'localhost'
|
77
|
+
req.server_port = 80
|
78
|
+
io = StringIO.new
|
79
|
+
req.send_to(io)
|
80
|
+
io.rewind
|
81
|
+
assert_equal \
|
82
|
+
"\x12\x34\x00\x5c" + # payload
|
83
|
+
"\x02\x03" + # FORWARD_REQUEST HEAD
|
84
|
+
"\x00\x08HTTP/1.1\x00" + # protocol = HTTP/1.1
|
85
|
+
"\x00\x01/\x00" + # request_path = /
|
86
|
+
"\x00\x09127.0.0.1\x00" + # remote_addr = 127.0.0.1
|
87
|
+
"\x00\x09localhost\x00" + # remote_host = localhost
|
88
|
+
"\x00\x09localhost\x00" + # server_name = localhost
|
89
|
+
"\x00\x50" + # server_port = 80
|
90
|
+
"\x00" + # is_ssl = false
|
91
|
+
"\x00\x01" + # num_headers = 1
|
92
|
+
"\xA0\x0B" + # Host:
|
93
|
+
"\x00\x09localhost\0" + # localhost
|
94
|
+
"\x05" + # QUERY_STRING =
|
95
|
+
"\x00\x0Fq=something&a=1\x00"+# "q=something&a=1"
|
96
|
+
"\xFF" + # TERMINATOR
|
97
|
+
"",
|
98
|
+
io.read
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_from_io
|
102
|
+
packet =
|
103
|
+
"\x12\x34\x00\x5c" + # payload
|
104
|
+
"\x02\x03" + # FORWARD_REQUEST HEAD
|
105
|
+
"\x00\x08HTTP/1.1\x00" + # protocol = HTTP/1.1
|
106
|
+
"\x00\x01/\x00" + # request_path = /
|
107
|
+
"\x00\x09127.0.0.1\x00" + # remote_addr = 127.0.0.1
|
108
|
+
"\x00\x09localhost\x00" + # remote_host = localhost
|
109
|
+
"\x00\x09localhost\x00" + # server_name = localhost
|
110
|
+
"\x00\x50" + # server_port = 80
|
111
|
+
"\x00" + # is_ssl = false
|
112
|
+
"\x00\x01" + # num_headers = 1
|
113
|
+
"\xA0\x0B" + # Host:
|
114
|
+
"\x00\x09localhost\x00" + # localhost
|
115
|
+
"\x05" + # QUERY_STRING =
|
116
|
+
"\x00\x0Fq=something&a=1\x00"+# "q=something&a=1"
|
117
|
+
"\xFF" + # TERMINATOR
|
118
|
+
""
|
119
|
+
io = StringIO.new(packet)
|
120
|
+
assert !io.eof?
|
121
|
+
req = Net::AJP13::Request.from_io(io)
|
122
|
+
assert io.eof?
|
123
|
+
assert_equal "HEAD", req.method
|
124
|
+
assert_equal "/", req.path
|
125
|
+
assert_equal "127.0.0.1", req.remote_addr
|
126
|
+
assert_equal "localhost", req.remote_host
|
127
|
+
assert_equal "localhost", req.server_name
|
128
|
+
assert_equal 80, req.server_port
|
129
|
+
assert_same false, req.is_ssl?
|
130
|
+
assert_equal 1, req.length
|
131
|
+
assert_equal "localhost", req['host']
|
132
|
+
|
133
|
+
File.open(File.dirname(__FILE__) + '/data/ajp13request-data.1') {|f|
|
134
|
+
assert !f.eof?
|
135
|
+
req = Net::AJP13::Request.from_io(f)
|
136
|
+
assert f.eof?
|
137
|
+
assert_equal "GET", req.method
|
138
|
+
assert_equal "HTTP/1.1", req.protocol
|
139
|
+
assert_equal "/admin/", req.path
|
140
|
+
assert_equal "127.0.0.1", req.remote_addr
|
141
|
+
assert_nil req.remote_host
|
142
|
+
assert_equal "localhost", req.server_name
|
143
|
+
assert_equal 80, req.server_port
|
144
|
+
assert_same false, req.is_ssl?
|
145
|
+
assert_equal 11, req.length
|
146
|
+
req.each do |name, value|
|
147
|
+
case name.downcase
|
148
|
+
when 'user-agent'
|
149
|
+
assert_equal "Opera/8.51 (X11; Linux i686; U; ja)", value
|
150
|
+
when 'host'
|
151
|
+
assert_equal "localhost", value
|
152
|
+
when 'accept'
|
153
|
+
assert_equal "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1", value
|
154
|
+
when 'accept-language'
|
155
|
+
assert_equal "ja,en;q=0.9", value
|
156
|
+
when 'accept-charset'
|
157
|
+
assert_equal "shift_jis, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1", value
|
158
|
+
when 'accept-encoding'
|
159
|
+
assert_equal "deflate, gzip, x-gzip, identity, *;q=0", value
|
160
|
+
when 'cookie'
|
161
|
+
assert_block {
|
162
|
+
"JSESSIONID=54104A3A77560CEF8967D263F1A7193" == value or
|
163
|
+
"$Version=1" == value
|
164
|
+
}
|
165
|
+
when 'cache-control'
|
166
|
+
assert_equal "no-cache", value
|
167
|
+
when 'connection'
|
168
|
+
assert_equal "Keep-Alive, TE", value
|
169
|
+
when 'TE'
|
170
|
+
assert_equal "deflate, gzip, chunked, identity, trailers", value
|
171
|
+
when 'content-length'
|
172
|
+
assert_equal "0", value
|
173
|
+
end
|
174
|
+
end
|
175
|
+
}
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'stringio'
|
3
|
+
require File.dirname(__FILE__) + '/../../lib/net/ajp13'
|
4
|
+
|
5
|
+
class Net::AJP13::ResponseTest < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
@res = Net::AJP13::Response.new(301)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_new
|
11
|
+
assert_equal 301, @res.status
|
12
|
+
assert_equal "301", @res.code
|
13
|
+
assert_equal 'Moved Permanently', @res.message
|
14
|
+
assert_equal 'Moved Permanently', @res.reason_phrase
|
15
|
+
assert_same @res.message, @res.reason_phrase
|
16
|
+
assert_nil @res.body
|
17
|
+
assert_nil @res.body_stream
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_from_io
|
21
|
+
packet =
|
22
|
+
"\x41\x42\x00\x2e" + # "AB" length
|
23
|
+
"\x04" + # SEND_HEADERS
|
24
|
+
"\x00\xC8\x00\x02OK\x00" + # 200 OK
|
25
|
+
"\x00\x02" + # num_headers = 2
|
26
|
+
"\xA0\x01" + # Content-Type:
|
27
|
+
"\x00\x18text/html;" +
|
28
|
+
" charset=UTF-8\x00" + # text/html; charset=UTF-8
|
29
|
+
"\xA0\x03" + # Content-Length:
|
30
|
+
"\x00\x0241\x00" + # 41
|
31
|
+
""
|
32
|
+
io = StringIO.new(packet)
|
33
|
+
assert !io.eof?
|
34
|
+
res = Net::AJP13::Response.from_io(io)
|
35
|
+
assert io.eof?
|
36
|
+
assert_equal 200, res.status
|
37
|
+
assert_equal '200', res.code
|
38
|
+
assert_equal 'OK', res.message
|
39
|
+
assert !res.key?('Exprires')
|
40
|
+
assert_equal 'text/html; charset=UTF-8', res['content-type']
|
41
|
+
assert_equal '41', res['Content-Length']
|
42
|
+
assert_nil res.body
|
43
|
+
assert_nil res.body_stream
|
44
|
+
|
45
|
+
packet =
|
46
|
+
"\x41\x42\x00\x11" + # "AB" length
|
47
|
+
"\x04" + # SEND_HEADERS
|
48
|
+
"\x00\xC8\x00\x02OK\x00" + # 200 OK
|
49
|
+
"\x00\x01" + # num_headers = 1
|
50
|
+
"\xA0\x3c" + # UNRECOGNIZED HEADER CODE
|
51
|
+
"\x00\x0241\x00" + # 41
|
52
|
+
""
|
53
|
+
assert_raise(Net::AJP13::AJPPacketError) {
|
54
|
+
res = Net::AJP13::Response.from_io(StringIO.new(packet))
|
55
|
+
}
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
# WebDAV response without body
|
60
|
+
File.open(File.dirname(__FILE__) + '/data/ajp13response-webdav.1') { |f|
|
61
|
+
assert !f.eof?
|
62
|
+
res = Net::AJP13::Response.from_io(f)
|
63
|
+
assert !f.eof? # because of END_RESPONSE packet
|
64
|
+
|
65
|
+
assert_equal 200, res.status
|
66
|
+
assert_equal "200", res.code
|
67
|
+
assert_equal "OK", res.reason_phrase
|
68
|
+
assert_equal "1,2", res['dav']
|
69
|
+
assert_equal "OPTIONS, GET, HEAD, POST, DELETE, TRACE, PROPPATCH, COPY, MOVE, LOCK, UNLOCK, PROPFIND", res['ALLOW']
|
70
|
+
assert_equal "DAV", res['MS-Author-Via']
|
71
|
+
assert_equal 0, res.content_length
|
72
|
+
assert_nil res['no-such-header']
|
73
|
+
assert_nil res.body
|
74
|
+
assert_nil res.body_stream
|
75
|
+
}
|
76
|
+
|
77
|
+
|
78
|
+
# WebDAV response with body
|
79
|
+
File.open(File.dirname(__FILE__) + '/data/ajp13response-webdav.2') { |f|
|
80
|
+
assert !f.eof?
|
81
|
+
res = Net::AJP13::Response.from_io(f)
|
82
|
+
assert !f.eof? # because of BODY_CHUNK packets and END_RESPONSE packet.
|
83
|
+
|
84
|
+
assert_equal 207, res.status
|
85
|
+
assert_equal 'Multi-Status', res.message
|
86
|
+
assert_equal 'text/xml;charset=UTF-8', res['content-type']
|
87
|
+
assert_equal '390', res['content-length']
|
88
|
+
assert_equal 390, res.content_length
|
89
|
+
assert_nil res['no-such-header']
|
90
|
+
assert_nil res.body
|
91
|
+
assert_nil res.body_stream
|
92
|
+
#assert_equal %Q(<?xml version="1.0" encoding="utf-8" ?>\n<multistatus xmlns="DAV:"><response><href>/webdav/</href>\n<propstat><prop><resourcetype><collection/></resourcetype>\n</prop>\n<status>HTTP/1.1 200 OK</status>\n</propstat>\n<propstat><prop><getcontentlength/><getlastmodified/><executable/><checked-in/><checked-out/></prop>\n<status>HTTP/1.1 404 Not Found</status>\n</propstat>\n</response>\n</multistatus>\n), res.body
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
def test_message
|
98
|
+
res = Net::AJP13::Response.new(500, :reason_phrase => 'Internal Servlet Container Error :P')
|
99
|
+
assert_equal "Internal Servlet Container Error :P", res.message
|
100
|
+
assert_equal 500, res.status
|
101
|
+
assert_equal "500", res.code
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_body
|
105
|
+
assert_nil @res.body
|
106
|
+
@res.body = "test body"
|
107
|
+
assert_equal "test body", @res.body
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_body_stream
|
111
|
+
assert_nil @res.body
|
112
|
+
assert_nil @res.body_stream
|
113
|
+
@res.body_stream = io = StringIO.new('test body stream')
|
114
|
+
assert_same io, @res.body_stream
|
115
|
+
assert_nil @res.body
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_send_to
|
119
|
+
res = Net::AJP13::Response.new(200, :reason_phrase => 'Yeah!')
|
120
|
+
res['content-length'] = '30'
|
121
|
+
|
122
|
+
io = StringIO.new
|
123
|
+
res.send_to(io)
|
124
|
+
io.rewind
|
125
|
+
assert_equal "" +
|
126
|
+
"\x41\x42\x00\x14" + # "AB" length
|
127
|
+
"\x04" + # SEND_HEADERS
|
128
|
+
"\x00\xC8\x00\x05Yeah!\x00" +# 200 Yeah!
|
129
|
+
"\x00\x01" + # num_headers = 1
|
130
|
+
"\xA0\x03" + # Content-Length
|
131
|
+
"\x00\x0230\x00" + # 30
|
132
|
+
"",
|
133
|
+
io.read
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_send_to_and_from_io
|
137
|
+
res = Net::AJP13::Response.new(500, :reason_phrase => 'Something in the Servlet is wrong')
|
138
|
+
res['content-length'] = '50'
|
139
|
+
res['X-Framework'] = 'No such Framework T_T'
|
140
|
+
res['ConTent-tYpe'] = 'text/html; charset=BIG-5'
|
141
|
+
res['Content-Language'] = 'zh-CN'
|
142
|
+
res['Servlet-Engine'] = 'No such engine :P'
|
143
|
+
|
144
|
+
io = StringIO.new
|
145
|
+
res.send_to(io)
|
146
|
+
io.rewind
|
147
|
+
|
148
|
+
assert !io.eof?
|
149
|
+
res = Net::AJP13::Response.from_io(io)
|
150
|
+
assert io.eof?
|
151
|
+
assert_equal 500, res.status
|
152
|
+
assert_equal '500', res.code
|
153
|
+
assert_equal '50', res['Content-Length']
|
154
|
+
assert_equal 50, res.content_length
|
155
|
+
assert_equal 'zh-CN', res['Content-Language']
|
156
|
+
assert_equal 'text/html; charset=BIG-5', res['Content-Type']
|
157
|
+
assert_equal 'No such engine :P', res['Servlet-Engine']
|
158
|
+
assert_equal 'No such Framework T_T', res['X-Framework']
|
159
|
+
assert_nil res['No-Such-Header']
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|