ruby-ajp 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,548 @@
1
+ require 'test/unit'
2
+ require 'stringio'
3
+ require File.dirname(__FILE__) + '/../../lib/net/ajp13server'
4
+
5
+ class Net::AJP13::Server
6
+ unless method_defined?(:fcall)
7
+ alias :fcall :__send__
8
+ end
9
+ end
10
+
11
+ class Net::AJP13::Server::BodyInputTest < Test::Unit::TestCase
12
+ CONTENTS = [
13
+ # line <-> chunk packet
14
+ "\xf8\xef\x2e\x7e\x1e\x76\x2d\x63\x67\x6c",
15
+ "\xea\xa3\x6c\xfd\x32\x6e\x22\x49\xc6\x58",
16
+ "\x13\x23\x45\x72\xc2\x5b\x08\x2d\xd0\x90",
17
+ "\x91\x8e\xcc\x80\x66\x74\x6d\x61\xd8\x54",
18
+ "\xea\x6e\x27\xc4\x37\xc1\x15\xb5\x64\x73",
19
+ "\x2f\x77\x02\x77\x47\xab\x79\x9b\x91\xc8",
20
+ "\x97\x39\x12\xbb\xbf\x7b\x1c\xe3\x74\xd0",
21
+ "\x91\x7d\x47\x78\x9e\xc4\xfa\xd6\x05\x60",
22
+ "\xbb\x31\xe7\xb5\x0f\xb0\xb8\xd1\xaf\xe3",
23
+ "\x63\xb0\x27\x3e\x08\x45\x5e\x57\xbf\xab",
24
+ ].freeze # 100 bytes
25
+
26
+ class MockSocket
27
+ def initialize(contents)
28
+ @bodies = (
29
+ contents.map{|c| "\x12\x34#{[c.length].pack('n')}" + c } <<
30
+ "\x12\x34\x00\x00"
31
+ ).map {|str| StringIO.new(str)}
32
+ @write_buf = ''
33
+ @written_packets = []
34
+ end
35
+ attr_reader :written_packets
36
+
37
+ def read(length)
38
+ io = @bodies[@io_index ||= 0]
39
+ str = io.read(length)
40
+ raise 'packet over run' if str.length != length
41
+ @io_index += 1 if io.eof?
42
+ str
43
+ end
44
+ alias :readpartial :read
45
+
46
+ def write(str)
47
+ @write_buf << str
48
+ end
49
+
50
+ def eof?
51
+ @io_index >= @bodies.length
52
+ end
53
+ def flush
54
+ @written_packets << @write_buf
55
+ @write_buf = ''
56
+ end
57
+ attr_accessor :sync
58
+ def ungetc(char)
59
+ if eof?
60
+ @io_index = @bodies.length - 1
61
+ elsif @bodies[@io_index].pos == 0
62
+ raise IOError, "can't ungetc" if @io_index == 0
63
+ @io_index -= 1
64
+ end
65
+ @bodies[@io_index].ungetc(char)
66
+ end
67
+ end
68
+
69
+ def setup
70
+ @mock_sock = MockSocket.new(CONTENTS)
71
+ @body_input = Net::AJP13::Server::BodyInput.new(@mock_sock, 100)
72
+ end
73
+
74
+ def test_length
75
+ assert_equal 100, @body_input.length
76
+ assert_equal 100, @body_input.size
77
+ end
78
+
79
+ def test_binmode
80
+ assert_same @body_input, @body_input.binmode
81
+ end
82
+ def test_clone
83
+ assert_raise(TypeError) { @body_input.clone }
84
+ end
85
+ def test_dup
86
+ assert_raise(TypeError) { @body_input.dup }
87
+ end
88
+
89
+ def test_close
90
+ @body_input.close
91
+ assert_raise(IOError) { @body_input.read(1) }
92
+ end
93
+
94
+ def test_freeze
95
+ assert !@body_input.frozen?
96
+ @body_input.freeze
97
+ assert @body_input.frozen?
98
+ assert_raise(TypeError) { @body_input.read(1) }
99
+ end
100
+
101
+ def test_close_read
102
+ @body_input.close_read
103
+ assert_raise(IOError) { @body_input.read(1) }
104
+ end
105
+
106
+ def test_closed?
107
+ assert !@body_input.closed?
108
+ @body_input.close
109
+ assert @body_input.closed?
110
+ end
111
+
112
+ def test_each_byte
113
+ i = 0
114
+ @body_input.each_byte do |byte|
115
+ assert_equal CONTENTS[i/10][i%10], byte
116
+ i += 1
117
+ end
118
+ end
119
+
120
+ def test_eof?
121
+ assert !@body_input.eof?
122
+ @body_input.read(100)
123
+ assert @body_input.eof?
124
+ end
125
+ def test_eof
126
+ assert !@body_input.eof
127
+ @body_input.read(37)
128
+ @body_input.read(63)
129
+ assert @body_input.eof
130
+ end
131
+
132
+ def test_fcntl
133
+ require 'fcntl'
134
+ assert_raise(NotImplementedError){@body_input.fcntl(Fcntl::F_DUPFD)}
135
+ end
136
+
137
+ def test_fileno
138
+ assert_nil @body_input.fileno
139
+ assert_nil @body_input.to_i
140
+ end
141
+
142
+ def test_getc
143
+ assert_equal [], @mock_sock.written_packets
144
+ assert_equal CONTENTS[0][0], @body_input.getc
145
+ assert_equal CONTENTS[0][1], @body_input.getc
146
+ assert_equal CONTENTS[0][2], @body_input.getc
147
+ assert_equal CONTENTS[0][3], @body_input.getc
148
+ assert_equal CONTENTS[0][4], @body_input.getc
149
+ assert_equal CONTENTS[0][5], @body_input.getc
150
+ assert_equal CONTENTS[0][6], @body_input.getc
151
+ assert_equal CONTENTS[0][7], @body_input.getc
152
+ assert_equal CONTENTS[0][8], @body_input.getc
153
+ assert_equal CONTENTS[0][9], @body_input.getc
154
+ assert_equal [], @mock_sock.written_packets
155
+
156
+ assert_equal CONTENTS[1][0], @body_input.getc
157
+ assert_equal ["\x41\x42\x00\x03\x06\x00\x5A"], @mock_sock.written_packets
158
+
159
+ 88.times do @body_input.getc end
160
+
161
+ assert_equal [
162
+ "\x41\x42\x00\x03\x06\x00\x5A",
163
+ "\x41\x42\x00\x03\x06\x00\x50",
164
+ "\x41\x42\x00\x03\x06\x00\x46",
165
+ "\x41\x42\x00\x03\x06\x00\x3C",
166
+ "\x41\x42\x00\x03\x06\x00\x32",
167
+ "\x41\x42\x00\x03\x06\x00\x28",
168
+ "\x41\x42\x00\x03\x06\x00\x1E",
169
+ "\x41\x42\x00\x03\x06\x00\x14",
170
+ "\x41\x42\x00\x03\x06\x00\x0A"
171
+ ], @mock_sock.written_packets
172
+
173
+ assert_equal CONTENTS[9][9], @body_input.getc
174
+ assert_nil @body_input.getc
175
+ assert_equal [
176
+ "\x41\x42\x00\x03\x06\x00\x5A",
177
+ "\x41\x42\x00\x03\x06\x00\x50",
178
+ "\x41\x42\x00\x03\x06\x00\x46",
179
+ "\x41\x42\x00\x03\x06\x00\x3C",
180
+ "\x41\x42\x00\x03\x06\x00\x32",
181
+ "\x41\x42\x00\x03\x06\x00\x28",
182
+ "\x41\x42\x00\x03\x06\x00\x1E",
183
+ "\x41\x42\x00\x03\x06\x00\x14",
184
+ "\x41\x42\x00\x03\x06\x00\x0A"
185
+ ], @mock_sock.written_packets
186
+ end
187
+
188
+ def test_read_all
189
+ assert !@body_input.eof?
190
+ assert_equal [], @mock_sock.written_packets
191
+ assert_equal CONTENTS.join, @body_input.read
192
+ assert @body_input.eof?
193
+ assert_equal [
194
+ "\x41\x42\x00\x03\x06\x00\x5A",
195
+ "\x41\x42\x00\x03\x06\x00\x50",
196
+ "\x41\x42\x00\x03\x06\x00\x46",
197
+ "\x41\x42\x00\x03\x06\x00\x3C",
198
+ "\x41\x42\x00\x03\x06\x00\x32",
199
+ "\x41\x42\x00\x03\x06\x00\x28",
200
+ "\x41\x42\x00\x03\x06\x00\x1E",
201
+ "\x41\x42\x00\x03\x06\x00\x14",
202
+ "\x41\x42\x00\x03\x06\x00\x0A"
203
+ ], @mock_sock.written_packets
204
+
205
+ assert_equal '', @body_input.read
206
+ assert_equal [
207
+ "\x41\x42\x00\x03\x06\x00\x5A",
208
+ "\x41\x42\x00\x03\x06\x00\x50",
209
+ "\x41\x42\x00\x03\x06\x00\x46",
210
+ "\x41\x42\x00\x03\x06\x00\x3C",
211
+ "\x41\x42\x00\x03\x06\x00\x32",
212
+ "\x41\x42\x00\x03\x06\x00\x28",
213
+ "\x41\x42\x00\x03\x06\x00\x1E",
214
+ "\x41\x42\x00\x03\x06\x00\x14",
215
+ "\x41\x42\x00\x03\x06\x00\x0A"
216
+ ], @mock_sock.written_packets
217
+ end
218
+
219
+ def test_read_with_length
220
+ assert_equal [], @mock_sock.written_packets
221
+ assert !@body_input.eof?
222
+ # 0...1.
223
+ assert_equal CONTENTS[0][0,1], @body_input.read(1)
224
+ assert_equal [], @mock_sock.written_packets
225
+ assert !@body_input.eof?
226
+ # 1...9
227
+ assert_equal CONTENTS[0][1,8], @body_input.read(8)
228
+ assert_equal [], @mock_sock.written_packets
229
+ assert !@body_input.eof?
230
+ # 9...53
231
+ assert_equal CONTENTS[0][9,1] + CONTENTS[1...5].join + CONTENTS[5][0,3],
232
+ @body_input.read(44)
233
+ assert !@body_input.eof?
234
+ assert_equal [
235
+ "\x41\x42\x00\x03\x06\x00\x5A",
236
+ "\x41\x42\x00\x03\x06\x00\x50",
237
+ "\x41\x42\x00\x03\x06\x00\x46",
238
+ "\x41\x42\x00\x03\x06\x00\x3C",
239
+ "\x41\x42\x00\x03\x06\x00\x32"
240
+ ], @mock_sock.written_packets
241
+ # 53...60
242
+ assert_equal CONTENTS[5][3,7], @body_input.read(7)
243
+ assert !@body_input.eof?
244
+ assert_equal [
245
+ "\x41\x42\x00\x03\x06\x00\x5A",
246
+ "\x41\x42\x00\x03\x06\x00\x50",
247
+ "\x41\x42\x00\x03\x06\x00\x46",
248
+ "\x41\x42\x00\x03\x06\x00\x3C",
249
+ "\x41\x42\x00\x03\x06\x00\x32"
250
+ ], @mock_sock.written_packets
251
+ # 60...70
252
+ assert_equal CONTENTS[6], @body_input.read(10)
253
+ assert !@body_input.eof?
254
+ assert_equal [
255
+ "\x41\x42\x00\x03\x06\x00\x5A",
256
+ "\x41\x42\x00\x03\x06\x00\x50",
257
+ "\x41\x42\x00\x03\x06\x00\x46",
258
+ "\x41\x42\x00\x03\x06\x00\x3C",
259
+ "\x41\x42\x00\x03\x06\x00\x32",
260
+ "\x41\x42\x00\x03\x06\x00\x28"
261
+ ], @mock_sock.written_packets
262
+ # 70...81
263
+ assert_equal CONTENTS[7] + CONTENTS[8][0,1], @body_input.read(11)
264
+ assert !@body_input.eof?
265
+ assert_equal [
266
+ "\x41\x42\x00\x03\x06\x00\x5A",
267
+ "\x41\x42\x00\x03\x06\x00\x50",
268
+ "\x41\x42\x00\x03\x06\x00\x46",
269
+ "\x41\x42\x00\x03\x06\x00\x3C",
270
+ "\x41\x42\x00\x03\x06\x00\x32",
271
+ "\x41\x42\x00\x03\x06\x00\x28",
272
+ "\x41\x42\x00\x03\x06\x00\x1E",
273
+ "\x41\x42\x00\x03\x06\x00\x14"
274
+ ], @mock_sock.written_packets
275
+ # 81...91
276
+ assert_equal CONTENTS[8][1,9] + CONTENTS[9][0,1], @body_input.read(10)
277
+ assert !@body_input.eof?
278
+ assert_equal [
279
+ "\x41\x42\x00\x03\x06\x00\x5A",
280
+ "\x41\x42\x00\x03\x06\x00\x50",
281
+ "\x41\x42\x00\x03\x06\x00\x46",
282
+ "\x41\x42\x00\x03\x06\x00\x3C",
283
+ "\x41\x42\x00\x03\x06\x00\x32",
284
+ "\x41\x42\x00\x03\x06\x00\x28",
285
+ "\x41\x42\x00\x03\x06\x00\x1E",
286
+ "\x41\x42\x00\x03\x06\x00\x14",
287
+ "\x41\x42\x00\x03\x06\x00\x0A"
288
+ ], @mock_sock.written_packets
289
+ # 91...110(100)
290
+ assert_equal CONTENTS[9][1,9], @body_input.read(19)
291
+ assert @body_input.eof?
292
+ assert_equal [
293
+ "\x41\x42\x00\x03\x06\x00\x5A",
294
+ "\x41\x42\x00\x03\x06\x00\x50",
295
+ "\x41\x42\x00\x03\x06\x00\x46",
296
+ "\x41\x42\x00\x03\x06\x00\x3C",
297
+ "\x41\x42\x00\x03\x06\x00\x32",
298
+ "\x41\x42\x00\x03\x06\x00\x28",
299
+ "\x41\x42\x00\x03\x06\x00\x1E",
300
+ "\x41\x42\x00\x03\x06\x00\x14",
301
+ "\x41\x42\x00\x03\x06\x00\x0A"
302
+ ], @mock_sock.written_packets
303
+
304
+ assert_nil @body_input.read(100000)
305
+ assert_equal "", @body_input.read
306
+ assert_equal [
307
+ "\x41\x42\x00\x03\x06\x00\x5A",
308
+ "\x41\x42\x00\x03\x06\x00\x50",
309
+ "\x41\x42\x00\x03\x06\x00\x46",
310
+ "\x41\x42\x00\x03\x06\x00\x3C",
311
+ "\x41\x42\x00\x03\x06\x00\x32",
312
+ "\x41\x42\x00\x03\x06\x00\x28",
313
+ "\x41\x42\x00\x03\x06\x00\x1E",
314
+ "\x41\x42\x00\x03\x06\x00\x14",
315
+ "\x41\x42\x00\x03\x06\x00\x0A"
316
+ ], @mock_sock.written_packets
317
+ end
318
+
319
+ def test_read_with_length_and_buffer
320
+ assert !@body_input.eof?
321
+
322
+ buf = '\0' * 23
323
+ # 0...23
324
+ actual = @body_input.read(23, buf)
325
+ assert !@body_input.eof?
326
+ assert_same buf, actual
327
+ assert_equal CONTENTS[0] + CONTENTS[1] + CONTENTS[2][0,3], actual
328
+ # 23...46
329
+ actual = @body_input.read(23, buf)
330
+ assert !@body_input.eof?
331
+ assert_same buf, actual
332
+ assert_equal CONTENTS[2][3,7] + CONTENTS[3] + CONTENTS[4][0,6], actual
333
+ # 46...69
334
+ actual = @body_input.read(23, buf)
335
+ assert !@body_input.eof?
336
+ assert_same buf, actual
337
+ assert_equal CONTENTS[4][6,4] + CONTENTS[5] + CONTENTS[6][0,9], actual
338
+ # 69...92
339
+ actual = @body_input.read(23, buf)
340
+ assert !@body_input.eof?
341
+ assert_same buf, actual
342
+ assert_equal CONTENTS[6][9,1] + CONTENTS[7] +
343
+ CONTENTS[8] + CONTENTS[9][0,2], actual
344
+ # 92...115(100)
345
+ actual = @body_input.read(23, buf)
346
+ assert @body_input.eof?
347
+ assert_same buf, actual
348
+ assert_equal CONTENTS[9][2,8], actual
349
+ # 115...138 (out of range)
350
+ actual = @body_input.read(23,buf)
351
+ assert_nil actual
352
+ assert_equal "", buf
353
+ assert @body_input.eof?
354
+
355
+ assert_equal "", @body_input.read
356
+ end
357
+
358
+ def test_readchar
359
+ assert !@body_input.eof?
360
+ assert_equal CONTENTS[0][0], @body_input.readchar
361
+ assert_equal CONTENTS[0][1], @body_input.readchar
362
+ assert_equal CONTENTS[0][2], @body_input.readchar
363
+ assert_equal CONTENTS[0][3], @body_input.readchar
364
+ assert_equal CONTENTS[0][4], @body_input.readchar
365
+ assert_equal CONTENTS[0][5], @body_input.readchar
366
+ assert_equal CONTENTS[0][6], @body_input.readchar
367
+ assert_equal CONTENTS[0][7], @body_input.readchar
368
+ assert_equal CONTENTS[0][8], @body_input.readchar
369
+ assert_equal CONTENTS[0][9], @body_input.readchar
370
+
371
+ assert_equal CONTENTS[1][0], @body_input.readchar
372
+ 88.times do @body_input.readchar end
373
+ assert_equal CONTENTS[9][9], @body_input.readchar
374
+ assert_raise(EOFError) { @body_input.readchar }
375
+ assert @body_input.eof?
376
+ end
377
+
378
+ def test_readline
379
+ mock_sock = MockSocket.new([
380
+ "123456789ABC\n571",
381
+ "string\nfragment\n",
382
+ "This is a long l",
383
+ "ine.\nThis is a m",
384
+ "ore more long li",
385
+ "ne.\nAnd this is ",
386
+ "the last line :P"
387
+ ])
388
+ body_input = Net::AJP13::Server::BodyInput.new(mock_sock, 0x70)
389
+ assert_nil body_input.lineno
390
+ assert_equal "123456789ABC\n", body_input.readline
391
+ assert_equal 1, body_input.lineno
392
+ assert_equal "571string\n", body_input.readline
393
+ assert_equal 2, body_input.lineno
394
+ assert_equal "fragment\n", body_input.readline
395
+ assert_equal 3, body_input.lineno
396
+ assert_equal "This is a long line.\n", body_input.readline
397
+ assert_equal 4, body_input.lineno
398
+ assert_equal "This is a more more long line.\n", body_input.readline
399
+ assert_equal 5, body_input.lineno
400
+ assert_equal "And this is the last line :P", body_input.readline
401
+ assert_equal 6, body_input.lineno
402
+ end
403
+
404
+ def test_each_line
405
+ mock_sock = MockSocket.new([
406
+ "123456789ABC\n571",
407
+ "string\nfragment\n",
408
+ "This is a long l",
409
+ "ine.\nThis is a m",
410
+ "ore more long li",
411
+ "ne.\nAnd this is ",
412
+ "the last line :P"
413
+ ])
414
+ body_input = Net::AJP13::Server::BodyInput.new(mock_sock, 0x70)
415
+ expected = [
416
+ "123456789ABC\n", "571string\n", "fragment\n",
417
+ "This is a long line.\n", "This is a more more long line.\n",
418
+ "And this is the last line :P"
419
+ ]
420
+
421
+ i = 0
422
+ body_input.each_line do |line|
423
+ assert_equal expected[i], line
424
+ assert_equal i+1, body_input.lineno
425
+ i += 1
426
+ end
427
+ end
428
+
429
+ def test_sync
430
+ @mock_sock.sync = expected = Object.new
431
+ assert_equal expected, @body_input.sync
432
+
433
+ expected = Object.new
434
+ assert_equal expected, (@body_input.sync = expected)
435
+ assert_equal expected, @mock_sock.sync
436
+ end
437
+
438
+ def test_ungetc
439
+ c = @body_input.getc
440
+ assert_nil @body_input.ungetc(c)
441
+ assert_equal c, @body_input.getc
442
+
443
+ assert_equal CONTENTS[0][1,9], @body_input.read(9)
444
+ assert_nil @body_input.ungetc(c)
445
+ assert_equal c, @body_input.getc
446
+
447
+ assert_equal CONTENTS[1,9].join, @body_input.read(90)
448
+ assert_nil @body_input.ungetc(c)
449
+ assert_equal c, @body_input.getc
450
+ assert_nil @body_input.getc
451
+ end
452
+ end
453
+
454
+
455
+ class Net::AJP13::ServerTest < Test::Unit::TestCase
456
+ TEST_PORT = 3009
457
+ def setup
458
+ @serv = Net::AJP13::Server.new('localhost', TEST_PORT)
459
+ end
460
+
461
+ def test_new
462
+ assert_equal 'localhost', @serv.host
463
+ assert_equal TEST_PORT, @serv.service
464
+
465
+ serv = Net::AJP13::Server.new(TEST_PORT)
466
+ assert_nil serv.host
467
+ assert_equal TEST_PORT, serv.service
468
+
469
+ serv = Net::AJP13::Server.new
470
+ assert_nil serv.host
471
+ assert_equal Net::AJP13::Constants::DEFAULT_PORT, serv.service
472
+
473
+ assert_raise(ArgumentError, 'wrong number of arguments (3 for 0..2)') {
474
+ serv = Net::AJP13::Server.new 'localhost', 3009, 'extra arg'
475
+ }
476
+ end
477
+
478
+ def test_process_ping
479
+ ping = "\x12\x34\x00\x01\x0A" # CPING
480
+ io = StringIO.new(ping.dup)
481
+ @serv.fcall(:process, io)
482
+ io.pos = ping.length
483
+ assert_equal "\x41\x42\x00\x01\x09", io.read
484
+ end
485
+
486
+ def test_process_shutdown
487
+ shutdown = "\x12\x34\x00\x01\x07" # SHUTDOWN
488
+ io = StringIO.new(shutdown.dup)
489
+ def io.addr
490
+ ['AF_INET', 3009, 'localhost.localdomain', '127.0.0.1']
491
+ end
492
+ def io.peeraddr
493
+ ['AF_INET', 12345, 'localhost.localdomain', '127.0.0.1']
494
+ end
495
+
496
+ @serv.fcall(:process, io)
497
+
498
+ io.pos = shutdown.length
499
+ assert_equal "", io.read
500
+ end
501
+
502
+ def test_process_request
503
+ req = "" +
504
+ "\x12\x34\x00\x5c" + # payload
505
+ "\x02\x03" + # FORWARD_REQUEST HEAD
506
+ "\x00\x08HTTP/1.1\x00" + # protocol = HTTP/1.1
507
+ "\x00\x01/\x00" + # request_path = /
508
+ "\x00\x09127.0.0.1\x00" + # remote_addr = 127.0.0.1
509
+ "\x00\x09localhost\x00" + # remote_host = localhost
510
+ "\x00\x09localhost\x00" + # server_name = localhost
511
+ "\x00\x50" + # server_port = 80
512
+ "\x00" + # is_ssl = false
513
+ "\x00\x01" + # num_headers = 1
514
+ "\xA0\x0B" + # Host:
515
+ "\x00\x09localhost\0" + # localhost
516
+ "\x05" + # QUERY_STRING =
517
+ "\x00\x0Fq=something&a=1\x00"+# "q=something&a=1"
518
+ "\xFF" + # TERMINATOR
519
+ ""
520
+ io = StringIO.new(req.dup)
521
+
522
+ assert_raise(Net::AJP13::Server::ProcessRequestNotImplementedError) {
523
+ @serv.fcall(:process, io)
524
+ }
525
+
526
+ io = StringIO.new(req.dup)
527
+ class << @serv
528
+ def process_request(req)
529
+ res = Net::AJP13::Response.new(204)
530
+ end
531
+ end
532
+
533
+ @serv.fcall(:process, io)
534
+ io.pos = req.length
535
+ assert_equal "" +
536
+ "\x41\x42\x00\x12" + # prefix length
537
+ "\x04" + # SEND_HEADERS
538
+ "\x00\xCC\x00\x0ANo Content\x00" + # 204 No Content
539
+ "\x00\x00" + # num_headers = 0
540
+ "" +
541
+ "\x41\x42\x00\x02" + # prefix length
542
+ "\x05" + # END_RESPONSE
543
+ "\x01" + # reuse = true
544
+ "",
545
+ io.read
546
+ end
547
+ end
548
+
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.11
3
+ specification_version: 1
4
+ name: ruby-ajp
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.5
7
+ date: 2006-01-09 00:00:00 +09:00
8
+ summary: An implementation of Apache Jserv Protocol 1.3 in Ruby
9
+ require_paths:
10
+ - lib
11
+ email: yugui@yugui.sakura.ne.jp
12
+ homepage:
13
+ rubyforge_project: ruby-ajp
14
+ description:
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.3
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ authors:
29
+ - Yugui
30
+ files:
31
+ - lib/net/ajp13server.rb
32
+ - lib/net/ajp13.rb
33
+ - lib/net/ajp13client.rb
34
+ - test/net/test_ajp13request.rb
35
+ - test/net/test_ajp13server.rb
36
+ - test/net/test_ajp13response.rb
37
+ - test/net/test_ajp13client.rb
38
+ - test/net/test_ajp13packet.rb
39
+ - test/net/data/rand
40
+ - test/net/data/ajp13request-data.1
41
+ - test/net/data/ajp13response-header.1
42
+ - test/net/data/ajp13response-webdav.1
43
+ - test/net/data/ajp13response-webdav.2
44
+ - example/error-server.rb
45
+ - example/dump-server.rb
46
+ - example/hello-server.rb
47
+ - NEWS.en
48
+ - NEWS.ja
49
+ - Install.en
50
+ - Install.ja
51
+ - README.en
52
+ - README.ja
53
+ - Rakefile
54
+ - ruby-ajp.gemspec
55
+ - setup.rb
56
+ - COPYING
57
+ test_files:
58
+ - test/net/test_ajp13packet.rb
59
+ - test/net/test_ajp13request.rb
60
+ - test/net/test_ajp13response.rb
61
+ - test/net/test_ajp13client.rb
62
+ rdoc_options: []
63
+
64
+ extra_rdoc_files: []
65
+
66
+ executables: []
67
+
68
+ extensions: []
69
+
70
+ requirements: []
71
+
72
+ dependencies: []
73
+