emonti-rbkb 0.6.2.1 → 0.6.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/History.txt +32 -0
  2. data/README.rdoc +10 -7
  3. data/Rakefile +47 -0
  4. data/bin/feed +5 -0
  5. data/bin/plugsrv +3 -3
  6. data/cli_usage.rdoc +44 -9
  7. data/doctor-bag.jpg +0 -0
  8. data/lib/rbkb.rb +47 -2
  9. data/lib/rbkb/cli.rb +8 -6
  10. data/lib/rbkb/cli/b64.rb +5 -0
  11. data/lib/rbkb/cli/bgrep.rb +14 -9
  12. data/lib/rbkb/cli/chars.rb +2 -1
  13. data/lib/rbkb/cli/crc32.rb +4 -1
  14. data/lib/rbkb/cli/d64.rb +3 -0
  15. data/lib/rbkb/cli/dedump.rb +5 -3
  16. data/lib/rbkb/cli/feed.rb +223 -0
  17. data/lib/rbkb/cli/hexify.rb +3 -3
  18. data/lib/rbkb/cli/len.rb +12 -9
  19. data/lib/rbkb/cli/rstrings.rb +13 -10
  20. data/lib/rbkb/cli/slice.rb +1 -0
  21. data/lib/rbkb/cli/telson.rb +21 -57
  22. data/lib/rbkb/cli/unhexify.rb +2 -6
  23. data/lib/rbkb/cli/urldec.rb +1 -0
  24. data/lib/rbkb/cli/urlenc.rb +1 -0
  25. data/lib/rbkb/extends.rb +41 -6
  26. data/lib/rbkb/http.rb +20 -0
  27. data/lib/rbkb/http/base.rb +172 -0
  28. data/lib/rbkb/http/body.rb +214 -0
  29. data/lib/rbkb/http/common.rb +74 -0
  30. data/lib/rbkb/http/headers.rb +356 -0
  31. data/lib/rbkb/http/parameters.rb +101 -0
  32. data/lib/rbkb/http/request.rb +58 -0
  33. data/lib/rbkb/http/response.rb +86 -0
  34. data/lib/rbkb/plug.rb +3 -3
  35. data/lib/rbkb/plug/cli.rb +83 -0
  36. data/lib/rbkb/plug/feed_import.rb +74 -0
  37. data/lib/rbkb/plug/plug.rb +36 -19
  38. data/lib/rbkb/plug/unix_domain.rb +75 -0
  39. data/rbkb.gemspec +38 -0
  40. data/spec/rbkb_spec.rb +7 -0
  41. data/spec/spec_helper.rb +16 -0
  42. data/tasks/ann.rake +80 -0
  43. data/tasks/bones.rake +20 -0
  44. data/tasks/gem.rake +201 -0
  45. data/tasks/git.rake +40 -0
  46. data/tasks/notes.rake +27 -0
  47. data/tasks/post_load.rake +34 -0
  48. data/tasks/rdoc.rake +51 -0
  49. data/tasks/rubyforge.rake +55 -0
  50. data/tasks/setup.rb +292 -0
  51. data/tasks/spec.rake +54 -0
  52. data/tasks/svn.rake +47 -0
  53. data/tasks/test.rake +40 -0
  54. data/test/test_cli_b64.rb +35 -0
  55. data/test/test_cli_bgrep.rb +137 -0
  56. data/test/test_cli_blit.rb +11 -0
  57. data/test/test_cli_chars.rb +21 -0
  58. data/test/test_cli_crc32.rb +108 -0
  59. data/test/test_cli_d64.rb +22 -0
  60. data/test/test_cli_dedump.rb +118 -0
  61. data/test/test_cli_feed.rb +11 -0
  62. data/test/test_cli_helper.rb +96 -0
  63. data/test/test_cli_hexify.rb +63 -0
  64. data/test/test_cli_len.rb +96 -0
  65. data/test/test_cli_rstrings.rb +15 -0
  66. data/test/test_cli_slice.rb +73 -0
  67. data/test/test_cli_telson.rb +11 -0
  68. data/test/test_cli_unhexify.rb +43 -0
  69. data/test/test_cli_urldec.rb +50 -0
  70. data/test/test_cli_urlenc.rb +44 -0
  71. data/test/test_cli_xor.rb +71 -0
  72. data/test/test_helper.rb +5 -0
  73. data/test/test_http.rb +27 -0
  74. data/test/test_http_helper.rb +60 -0
  75. data/test/test_http_request.rb +136 -0
  76. data/test/test_http_response.rb +222 -0
  77. data/test/test_rbkb.rb +19 -0
  78. metadata +127 -21
@@ -0,0 +1,44 @@
1
+ require File.join(File.dirname(__FILE__), "test_cli_helper.rb")
2
+ require 'rbkb/cli/urlenc'
3
+
4
+ class TestCliUrlenc < Test::Unit::TestCase
5
+ include CliTest
6
+
7
+ def setup
8
+ @cli_class = Rbkb::Cli::Urlenc
9
+ super()
10
+ end
11
+
12
+ def test_basic_string_arg
13
+ assert_equal 0, run_with_args(["foo"])
14
+ assert_equal "foo\n", @stdout_io.string
15
+ end
16
+
17
+ def test_basic_string_arg_space_default
18
+ assert_equal 0, run_with_args(["fo o"])
19
+ assert_equal "fo%20o\n", @stdout_io.string
20
+ end
21
+
22
+ def test_basic_string_arg_space_with_p
23
+ assert_equal 0, run_with_args(["-p", "fo o"])
24
+ assert_equal "fo+o\n", @stdout_io.string
25
+ end
26
+
27
+ def test_basic_string_arg_space_with_plus
28
+ assert_equal 0, run_with_args(["--plus", "fo o"])
29
+ assert_equal "fo+o\n", @stdout_io.string
30
+ end
31
+
32
+ def test_basic_string_arg_space_with_noplus
33
+ assert_equal 0, run_with_args(["--no-plus", "fo o"])
34
+ assert_equal "fo%20o\n", @stdout_io.string
35
+ end
36
+
37
+ def test_allchars
38
+ allchars_dec = (0..255).map {|c| c.chr}.join
39
+ allchars_enc = "%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f%20%21%22%23%24%25%26%27%28%29%2a%2b%2c-.%2f0123456789%3a%3b%3c%3d%3e%3f%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5b%5c%5d%5e_%60abcdefghijklmnopqrstuvwxyz%7b%7c%7d~%7f%80%81%82%83%84%85%86%87%88%89%8a%8b%8c%8d%8e%8f%90%91%92%93%94%95%96%97%98%99%9a%9b%9c%9d%9e%9f%a0%a1%a2%a3%a4%a5%a6%a7%a8%a9%aa%ab%ac%ad%ae%af%b0%b1%b2%b3%b4%b5%b6%b7%b8%b9%ba%bb%bc%bd%be%bf%c0%c1%c2%c3%c4%c5%c6%c7%c8%c9%ca%cb%cc%cd%ce%cf%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%da%db%dc%dd%de%df%e0%e1%e2%e3%e4%e5%e6%e7%e8%e9%ea%eb%ec%ed%ee%ef%f0%f1%f2%f3%f4%f5%f6%f7%f8%f9%fa%fb%fc%fd%fe%ff"
40
+ assert_equal 0, run_with_args([allchars_dec])
41
+ assert_equal allchars_enc, @stdout_io.string.chomp
42
+ end
43
+
44
+ end
@@ -0,0 +1,71 @@
1
+ require File.join(File.dirname(__FILE__), "test_cli_helper.rb")
2
+ require 'rbkb/cli/xor'
3
+
4
+ class TestCliXor < Test::Unit::TestCase
5
+ include CliTest
6
+
7
+ def setup
8
+ @cli_class = Rbkb::Cli::Xor
9
+ super()
10
+
11
+ @tst_dat = "my secrets are very secret"
12
+ @tst_key_str = "sneaky"
13
+ @tst_key_hex = "736e65616b79"
14
+ @tst_xored = "\036\027E\022\016\032\001\v\021\022K\030\001\vE\027\016\v\nN\026\004\b\v\026\032"
15
+ end
16
+
17
+ def test_string_arg_str_key
18
+ assert_equal 0, go_with_args(["-s", @tst_key_str, @tst_dat])
19
+ assert_equal @tst_xored, @stdout_io.string
20
+ end
21
+
22
+ def test_string_arg_str_key
23
+ assert_equal 0, go_with_args(["-x", @tst_key_hex, @tst_dat])
24
+ assert_equal @tst_xored, @stdout_io.string
25
+ end
26
+
27
+ def test_string_arg_xor_zeroes_out
28
+ assert_equal 0, go_with_args(%w(-s foo foo))
29
+ assert_equal "\x00"*3, @stdout_io.string
30
+ end
31
+
32
+ def test_string_arg_xor_zeroes_out_repeating
33
+ assert_equal 0, go_with_args(%w(-s A AAAAAAAAAA))
34
+ assert_equal "\x00"*10, @stdout_io.string
35
+ end
36
+
37
+ def test_string_arg_str_key_reverse
38
+ assert_equal 0, go_with_args(["-s", @tst_key_str, @tst_xored])
39
+ assert_equal @tst_dat, @stdout_io.string
40
+ end
41
+
42
+ def test_string_arg_str_key_reverse
43
+ assert_equal 0, go_with_args(["-x", @tst_key_hex, @tst_xored])
44
+ assert_equal @tst_dat, @stdout_io.string
45
+ end
46
+
47
+ def test_stdin
48
+ @stdin_io.write(@tst_dat) ; @stdin_io.rewind
49
+ assert_equal 0, go_with_args(["-s", @tst_key_str])
50
+ assert_equal @tst_xored, @stdout_io.string
51
+ end
52
+
53
+ def test_file_input
54
+ with_testfile do |fname, f|
55
+ f.write(@tst_dat); f.close
56
+ assert_equal 0, go_with_args(["-s", @tst_key_str, "-f", fname])
57
+ assert_equal @tst_xored, @stdout_io.string
58
+ end
59
+ end
60
+
61
+ def test_string_arg_no_key_error
62
+ assert_equal 1, go_with_args(%w(foo))
63
+ assert_match(/you must specify a key/i, @stderr_io.string)
64
+ end
65
+
66
+ def test_one_key_opt_error
67
+ assert_equal 1, go_with_args(%w(-x foo -s foo foo))
68
+ assert_match(/only one key option/i, @stderr_io.string)
69
+ end
70
+
71
+ end
@@ -0,0 +1,5 @@
1
+ require 'pp'
2
+ require 'stringio'
3
+ require 'test/unit'
4
+ $:.unshift File.dirname(__FILE__) + '/../lib'
5
+
data/test/test_http.rb ADDED
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/test_http_helper.rb'
2
+
3
+ class TestHttp < Test::Unit::TestCase
4
+ include Rbkb::Http
5
+
6
+ def test_names
7
+ assert_equal CommonInterface, Rbkb::Http::CommonInterface
8
+ assert_equal Base, Rbkb::Http::Base
9
+
10
+ assert_equal Response, Rbkb::Http::Response
11
+ assert_equal Request, Rbkb::Http::Request
12
+ assert_equal Parameters, Rbkb::Http::Parameters
13
+ assert_equal FormUrlencodedParams, Rbkb::Http::FormUrlencodedParams
14
+
15
+ assert_equal Headers, Rbkb::Http::Headers
16
+ assert_equal RequestHeaders, Rbkb::Http::RequestHeaders
17
+ assert_equal RequestAction, Rbkb::Http::RequestAction
18
+ assert_equal ResponseHeaders, Rbkb::Http::ResponseHeaders
19
+ assert_equal ResponseStatus, Rbkb::Http::ResponseStatus
20
+
21
+ assert_equal Body, Rbkb::Http::Body
22
+ assert_equal BoundBody, Rbkb::Http::BoundBody
23
+ assert_equal ChunkedBody, Rbkb::Http::ChunkedBody
24
+ end
25
+
26
+ end
27
+
@@ -0,0 +1,60 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+ require 'rbkb/http'
3
+
4
+ module HttpTestHelper
5
+ # contains various test cases to test common interface features
6
+ module CommonInterfaceTests
7
+
8
+ def setup()
9
+ raise "Helper stub called. Override setup() in TestCase"
10
+ end
11
+
12
+ def do_type_tests(x)
13
+ raise "Helper stub called. Override do_type_tests() in TestCase"
14
+ end
15
+
16
+ def do_type_tests(x)
17
+ raise "Helper stub called. Override do_capture_value_tests() in TestCase"
18
+ end
19
+
20
+ def test_init_parse
21
+ req = @obj_klass.new(@rawdat, @obj_opts)
22
+ do_capture_value_tests(req)
23
+ do_type_tests(req)
24
+ end
25
+
26
+ def test_parse
27
+ req = @obj_klass.parse(@rawdat, @obj_opts)
28
+ do_capture_value_tests(req)
29
+ do_type_tests(req)
30
+ end
31
+
32
+ def test_capture
33
+ req = @obj.capture(@rawdat)
34
+ do_capture_value_tests(req)
35
+ do_type_tests(req)
36
+ end
37
+
38
+ def test_back_to_raw
39
+ req = @obj.capture(@rawdat)
40
+ assert_equal @rawdat_crlf, req.to_raw
41
+ end
42
+
43
+ def test_capture_and_reuse_nondestructive
44
+ @obj.capture(@rawdat_crlf)
45
+ @obj.reset_capture
46
+ @obj.capture(@rawdat_crlf)
47
+ do_capture_value_tests(@obj)
48
+ do_type_tests(@obj)
49
+ end
50
+
51
+ def test_capture_and_reuse_destructive
52
+ @obj.capture(@rawdat_crlf)
53
+ @obj.reset_capture!
54
+ @obj.capture(@rawdat_crlf)
55
+ do_capture_value_tests(@obj)
56
+ do_type_tests(@obj)
57
+ end
58
+
59
+ end
60
+ end
@@ -0,0 +1,136 @@
1
+ require File.dirname(__FILE__) + '/test_http_helper.rb'
2
+
3
+ class TestHttpRequest < Test::Unit::TestCase
4
+ include HttpTestHelper::CommonInterfaceTests
5
+
6
+ include Rbkb::Http
7
+
8
+ def setup
9
+ @obj_klass = Request
10
+ @obj = @obj_klass.new
11
+
12
+ @rawdat =<<_EOF_
13
+ GET /csi?v=3&s=webhp&action=&tran=undefined HTTP/1.1
14
+ Host: www.google.com
15
+ User-Agent: Mozilla/5.0
16
+ Accept: image/png,image/*;q=0.8,*/*;q=0.5
17
+ Accept-Language: en-us,en;q=0.5
18
+ Accept-Encoding: gzip,deflate
19
+ Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
20
+ Keep-Alive: 300
21
+ Proxy-Connection: keep-alive
22
+ Referer: http://www.google.com/
23
+ Cookie: PREFID=NNNN:LM=1237996892:S=YYYYY; NID=111
24
+
25
+ _EOF_
26
+
27
+ @hstr, @body = @rawdat.split(/^\n/, 2)
28
+ @rawdat_crlf = @hstr.gsub("\n", "\r\n") + "\r\n" + @body
29
+
30
+ @verb = "GET"
31
+ @uri = "/csi?v=3&s=webhp&action=&tran=undefined"
32
+ @path, @query = @uri.split('?',2)
33
+ @req_parameters = [
34
+ ["v", "3"],
35
+ ["s", "webhp"],
36
+ ["action", ""],
37
+ ["tran", "undefined"]
38
+ ]
39
+ @version = "HTTP/1.1"
40
+
41
+ @headers = [
42
+ ["Host", "www.google.com"],
43
+ ["User-Agent", "Mozilla/5.0"],
44
+ ["Accept", "image/png,image/*;q=0.8,*/*;q=0.5"],
45
+ ["Accept-Language", "en-us,en;q=0.5"],
46
+ ["Accept-Encoding", "gzip,deflate"],
47
+ ["Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"],
48
+ ["Keep-Alive", "300"],
49
+ ["Proxy-Connection", "keep-alive"],
50
+ ["Referer", "http://www.google.com/"],
51
+ ["Cookie", "PREFID=NNNN:LM=1237996892:S=YYYYY; NID=111"],
52
+ ]
53
+ end
54
+
55
+ def do_type_tests(req)
56
+ assert_kind_of Request, req
57
+ assert_kind_of Headers, req.headers
58
+ assert_kind_of Body, req.body
59
+ assert_kind_of RequestAction, req.action
60
+ assert_kind_of RequestHeaders, req.headers
61
+ end
62
+
63
+ def do_capture_value_tests(req)
64
+ assert_equal @headers, req.headers
65
+ assert_equal @body, req.body.to_s
66
+ assert_equal @uri, req.action.uri.to_s
67
+ assert_equal @path, req.action.uri.path
68
+ assert_equal @query, req.action.uri.query
69
+ assert_equal @verb, req.action.verb
70
+ assert_equal @version, req.action.version
71
+ assert_equal @req_parameters, req.request_parameters
72
+ end
73
+
74
+ def test_capture_crlf_headers
75
+ req = @obj.capture(@rawdat_crlf)
76
+ do_capture_value_tests(req)
77
+ do_type_tests(req)
78
+ assert_equal @rawdat_crlf, req.to_raw
79
+ end
80
+
81
+ def test_captured_body_type
82
+ @obj.capture(@rawdat)
83
+ assert_kind_of Body, @obj.body
84
+ end
85
+
86
+ end
87
+
88
+
89
+ class TestHttpPostRequest < TestHttpRequest
90
+
91
+ def setup
92
+ @obj_klass = Request
93
+ @obj = @obj_klass.new
94
+
95
+ @rawdat =<<_EOF_
96
+ POST /path/script.cgi?qtype=foo HTTP/1.0
97
+ From: frog@jmarshall.com
98
+ HasColon: this_has_a_colon:yikes
99
+ User-Agent: HTTPTool/1.0
100
+ Content-Type: application/x-www-form-urlencoded
101
+ Content-Length: 32
102
+
103
+ home=Cosby&favorite+flavor=flies
104
+ _EOF_
105
+ @rawdat.chomp!
106
+
107
+ @hstr, @body = @rawdat.split(/^\n/, 2)
108
+ @rawdat_crlf = @hstr.gsub("\n", "\r\n") + "\r\n" + @body
109
+
110
+ @verb = "POST"
111
+ @uri = "/path/script.cgi?qtype=foo"
112
+ @path, @query = @uri.split('?',2)
113
+ @req_parameters = [
114
+ ["qtype", "foo"],
115
+ ]
116
+ @version = "HTTP/1.0"
117
+
118
+ @headers = [
119
+ ["From", "frog@jmarshall.com"],
120
+ ["HasColon", "this_has_a_colon:yikes"],
121
+ ["User-Agent", "HTTPTool/1.0"],
122
+ ["Content-Type", "application/x-www-form-urlencoded"],
123
+ ["Content-Length", "32"],
124
+ ]
125
+
126
+ @post_parameters = [["home", "Cosby"], ["favorite+flavor", "flies"]]
127
+ end
128
+
129
+ def test_captured_body_type
130
+ @obj.capture(@rawdat)
131
+ assert_kind_of BoundBody, @obj.body
132
+ end
133
+
134
+
135
+ end
136
+
@@ -0,0 +1,222 @@
1
+ require File.dirname(__FILE__) + '/test_http_helper.rb'
2
+
3
+ class TestHttpResponse < Test::Unit::TestCase
4
+ include HttpTestHelper::CommonInterfaceTests
5
+
6
+ include Rbkb::Http
7
+
8
+ def setup
9
+ @obj_klass = Response
10
+ @obj_opts = nil
11
+ @obj = @obj_klass.new(nil, @obj_opts)
12
+
13
+ @rawdat =<<_EOF_
14
+ HTTP/1.0 404 Not Found
15
+ Date: Thu, 26 Mar 2009 01:18:52 GMT
16
+ Server: Apache
17
+ Content-Type: text/html; charset=iso-8859-1
18
+ Content-Length: 190
19
+ Connection: Keep-Alive
20
+
21
+ <html><head>
22
+ <title>Error report</title></head>
23
+ <body><h1>HTTP Status 404</h1><HR size="1" noshade><p><u>The requested resource is not available.</u></p><HR size="1" noshade>
24
+ </body></html>
25
+ _EOF_
26
+
27
+ @hstr, @body = @rawdat.split(/^\n/, 2)
28
+ @rawdat_crlf = @hstr.gsub("\n", "\r\n") + "\r\n" + @body
29
+
30
+ @code = 404
31
+ @text = "Not Found"
32
+ @version = "HTTP/1.0"
33
+
34
+ @headers = [
35
+ ["Date", "Thu, 26 Mar 2009 01:18:52 GMT"],
36
+ ["Server", "Apache"],
37
+ ["Content-Type", "text/html; charset=iso-8859-1"],
38
+ ["Content-Length", "190"],
39
+ ["Connection", "Keep-Alive"]
40
+ ]
41
+
42
+ @content_length = 190
43
+ end
44
+
45
+ def do_type_tests(rsp)
46
+ assert_kind_of Response, rsp
47
+ assert_kind_of Headers, rsp.headers
48
+ assert_kind_of Body, rsp.body
49
+ assert_kind_of ResponseStatus, rsp.status
50
+ assert_kind_of ResponseHeaders, rsp.headers
51
+ end
52
+
53
+ def do_capture_value_tests(rsp)
54
+ assert_equal @headers, rsp.headers
55
+ assert_equal @body, rsp.body
56
+ assert_equal @code, rsp.status.code
57
+ assert_equal @text, rsp.status.text
58
+ assert_equal @version, rsp.status.version
59
+ assert_equal @content_length, rsp.content_length
60
+ end
61
+
62
+ def test_capture_crlf_headers
63
+ @obj.capture(@rawdat_crlf)
64
+ do_capture_value_tests(@obj)
65
+ do_type_tests(@obj)
66
+ assert_equal @rawdat_crlf, @obj.to_raw
67
+ end
68
+
69
+ def test_captured_body_type
70
+ @obj.capture(@rawdat)
71
+ assert_kind_of BoundBody, @obj.body
72
+ end
73
+ end
74
+
75
+
76
+ class TestHttpResponseChunked < TestHttpResponse
77
+ include Rbkb::Http
78
+
79
+ def setup
80
+ @obj_klass = Response
81
+ @obj_opts = {}
82
+ @obj = @obj_klass.new
83
+
84
+ @rawdat =<<_EOF_
85
+ HTTP/1.1 200 OK
86
+ Date: Thu, 26 Mar 2009 01:18:52 GMT
87
+ Server: Apache
88
+ Content-Type: text/html; charset=iso-8859-1
89
+ Transfer-Encoding: chunked
90
+ Connection: Keep-Alive
91
+
92
+ 20
93
+ This is a test of a chunked-enco
94
+
95
+ 10
96
+ ded HTTP request
97
+
98
+ 0
99
+ _EOF_
100
+
101
+ @hstr, @rawbody = @rawdat.split(/^\n/, 2)
102
+ @rawdat_crlf = @rawdat.gsub("\n", "\r\n")
103
+ @hdrs_crlf = @hstr.gsub("\n", "\r\n")
104
+
105
+ @body = "This is a test of a chunked-encoded HTTP request"
106
+
107
+ @code = 200
108
+ @text = "OK"
109
+ @version = "HTTP/1.1"
110
+
111
+ @headers = [
112
+ ["Date", "Thu, 26 Mar 2009 01:18:52 GMT"],
113
+ ["Server", "Apache"],
114
+ ["Content-Type", "text/html; charset=iso-8859-1"],
115
+ ["Transfer-Encoding", "chunked"],
116
+ ["Connection", "Keep-Alive"]
117
+ ]
118
+
119
+ @content_length = nil
120
+ @tc_chunk_size = 0x20
121
+ end
122
+
123
+ def test_captured_body_type
124
+ @obj.capture(@rawdat)
125
+ assert_kind_of ChunkedBody, @obj.body
126
+ end
127
+
128
+ def test_back_to_raw
129
+ @obj.capture(@rawdat)
130
+ do_capture_value_tests(@obj)
131
+ do_type_tests(@obj)
132
+ @obj.body.opts[:output_chunk_size] = @tc_chunk_size
133
+ assert_equal @rawdat_crlf, @obj.to_raw
134
+ end
135
+
136
+ def test_capture_crlf_headers
137
+ @obj.capture(@rawdat_crlf)
138
+ do_capture_value_tests(@obj)
139
+ do_type_tests(@obj)
140
+ @obj.body.opts[:output_chunk_size] = @tc_chunk_size
141
+ assert_equal @rawdat_crlf, @obj.to_raw
142
+ end
143
+
144
+ def test_default_chunk_size
145
+ if @body.size > ChunkedBody::DEFAULT_CHUNK_SIZE
146
+ assert "TESTCASE ERROR!!!", "make the setup() @body < DEFAULT_CHUNK_SIZE"
147
+ end
148
+ raw_tc = "#{@hdrs_crlf}\r\n#{@body.size.to_s(16)}\r\n#{@body}\r\n\r\n0\r\n"
149
+ @obj.capture(@rawdat_crlf)
150
+ do_capture_value_tests(@obj)
151
+ do_type_tests(@obj)
152
+ assert_equal raw_tc, @obj.to_raw
153
+ end
154
+ end
155
+
156
+ # This test-case simulates a HTTP response to a HEAD request. This type of
157
+ # response is special since it returns Content-Length: NNN or
158
+ # Transfer-Encoding: chunked headers without any actual body data.
159
+ # To handle this special situation, we use the 'ignore_content_length' and
160
+ # 'ignore_chunked_encoding' options.
161
+ class TestHttpResponseToHead < TestHttpResponse
162
+ def setup
163
+ @obj_klass = Response
164
+
165
+ # Technically, a server should only respond to HEAD with one of
166
+ # content length *or* chunked encoding. However, we ignore them both.
167
+ @obj_opts = {
168
+ :ignore_content_length => true,
169
+ :ignore_chunked_encoding => true
170
+ }
171
+ @obj = @obj_klass.new(nil, @obj_opts)
172
+
173
+ # Note, our test-case includes both content length and chunked encoding.
174
+ # A real server probably wouldn't do this, but we want to make sure
175
+ # we handle both.
176
+ @rawdat =<<_EOF_
177
+ HTTP/1.1 200 OK
178
+ Cache-Control: private, max-age=0
179
+ Date: Fri, 27 Mar 2009 04:27:27 GMT
180
+ Expires: -1
181
+ Content-Length: 9140
182
+ Content-Type: text/html; charset=ISO-8859-1
183
+ Server: Booble
184
+ Transfer-Encoding: chunked
185
+
186
+ _EOF_
187
+
188
+ @hstr, @body = @rawdat.split(/^\n/, 2)
189
+ @rawdat_crlf = @hstr.gsub("\n", "\r\n") + "\r\n" + @body
190
+
191
+ @code = 200
192
+ @text = "OK"
193
+ @version = "HTTP/1.1"
194
+
195
+ @headers = [
196
+ ["Cache-Control", "private, max-age=0"],
197
+ ["Date", "Fri, 27 Mar 2009 04:27:27 GMT"],
198
+ ["Expires", "-1"],
199
+ ["Content-Length", "9140"],
200
+ ["Content-Type", "text/html; charset=ISO-8859-1"],
201
+ ["Server", "Booble"],
202
+ ["Transfer-Encoding", "chunked"]
203
+ ]
204
+
205
+ # Content length should get ignored
206
+ @content_length = nil
207
+ end
208
+
209
+ def test_capture_crlf_headers
210
+ @obj.capture(@rawdat_crlf)
211
+ do_capture_value_tests(@obj)
212
+ do_type_tests(@obj)
213
+ assert_equal @rawdat_crlf, @obj.to_raw
214
+ end
215
+
216
+ def test_captured_body_type
217
+ @obj.capture(@rawdat)
218
+ assert_kind_of Body, @obj.body
219
+ end
220
+
221
+ end
222
+