raw 0.49.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. data/doc/CONTRIBUTORS +106 -0
  2. data/doc/LICENSE +32 -0
  3. data/doc/coding_conventions.txt +11 -0
  4. data/lib/raw.rb +42 -0
  5. data/lib/raw/adapter.rb +113 -0
  6. data/lib/raw/adapter/cgi.rb +41 -0
  7. data/lib/raw/adapter/fastcgi.rb +48 -0
  8. data/lib/raw/adapter/mongrel.rb +146 -0
  9. data/lib/raw/adapter/script.rb +94 -0
  10. data/lib/raw/adapter/webrick.rb +144 -0
  11. data/lib/raw/adapter/webrick/vcr.rb +91 -0
  12. data/lib/raw/cgi.rb +323 -0
  13. data/lib/raw/cgi/cookie.rb +47 -0
  14. data/lib/raw/cgi/http.rb +62 -0
  15. data/lib/raw/compiler.rb +138 -0
  16. data/lib/raw/compiler/filter/cleanup.rb +21 -0
  17. data/lib/raw/compiler/filter/elements.rb +166 -0
  18. data/lib/raw/compiler/filter/elements/element.rb +210 -0
  19. data/lib/raw/compiler/filter/localization.rb +23 -0
  20. data/lib/raw/compiler/filter/markup.rb +32 -0
  21. data/lib/raw/compiler/filter/morph.rb +123 -0
  22. data/lib/raw/compiler/filter/morph/each.rb +34 -0
  23. data/lib/raw/compiler/filter/morph/for.rb +11 -0
  24. data/lib/raw/compiler/filter/morph/if.rb +26 -0
  25. data/lib/raw/compiler/filter/morph/selected_if.rb +43 -0
  26. data/lib/raw/compiler/filter/morph/standard.rb +55 -0
  27. data/lib/raw/compiler/filter/morph/times.rb +27 -0
  28. data/lib/raw/compiler/filter/script.rb +116 -0
  29. data/lib/raw/compiler/filter/squeeze.rb +16 -0
  30. data/lib/raw/compiler/filter/static_include.rb +74 -0
  31. data/lib/raw/compiler/filter/template.rb +121 -0
  32. data/lib/raw/compiler/reloader.rb +96 -0
  33. data/lib/raw/context.rb +154 -0
  34. data/lib/raw/context/flash.rb +157 -0
  35. data/lib/raw/context/global.rb +88 -0
  36. data/lib/raw/context/request.rb +338 -0
  37. data/lib/raw/context/response.rb +57 -0
  38. data/lib/raw/context/session.rb +198 -0
  39. data/lib/raw/context/session/drb.rb +11 -0
  40. data/lib/raw/context/session/file.rb +15 -0
  41. data/lib/raw/context/session/memcached.rb +13 -0
  42. data/lib/raw/context/session/memory.rb +12 -0
  43. data/lib/raw/context/session/og.rb +15 -0
  44. data/lib/raw/context/session/pstore.rb +13 -0
  45. data/lib/raw/control.rb +18 -0
  46. data/lib/raw/control/attribute.rb +91 -0
  47. data/lib/raw/control/attribute/checkbox.rb +25 -0
  48. data/lib/raw/control/attribute/datetime.rb +21 -0
  49. data/lib/raw/control/attribute/file.rb +20 -0
  50. data/lib/raw/control/attribute/fixnum.rb +26 -0
  51. data/lib/raw/control/attribute/float.rb +26 -0
  52. data/lib/raw/control/attribute/options.rb +38 -0
  53. data/lib/raw/control/attribute/password.rb +16 -0
  54. data/lib/raw/control/attribute/text.rb +16 -0
  55. data/lib/raw/control/attribute/textarea.rb +16 -0
  56. data/lib/raw/control/none.rb +16 -0
  57. data/lib/raw/control/relation.rb +59 -0
  58. data/lib/raw/control/relation/belongs_to.rb +0 -0
  59. data/lib/raw/control/relation/has_many.rb +97 -0
  60. data/lib/raw/control/relation/joins_many.rb +0 -0
  61. data/lib/raw/control/relation/many_to_many.rb +0 -0
  62. data/lib/raw/control/relation/refers_to.rb +29 -0
  63. data/lib/raw/controller.rb +37 -0
  64. data/lib/raw/controller/publishable.rb +160 -0
  65. data/lib/raw/dispatcher.rb +209 -0
  66. data/lib/raw/dispatcher/format.rb +108 -0
  67. data/lib/raw/dispatcher/format/atom.rb +31 -0
  68. data/lib/raw/dispatcher/format/css.rb +0 -0
  69. data/lib/raw/dispatcher/format/html.rb +42 -0
  70. data/lib/raw/dispatcher/format/json.rb +31 -0
  71. data/lib/raw/dispatcher/format/rss.rb +33 -0
  72. data/lib/raw/dispatcher/format/xoxo.rb +31 -0
  73. data/lib/raw/dispatcher/mounter.rb +60 -0
  74. data/lib/raw/dispatcher/router.rb +111 -0
  75. data/lib/raw/errors.rb +19 -0
  76. data/lib/raw/helper.rb +86 -0
  77. data/lib/raw/helper/benchmark.rb +23 -0
  78. data/lib/raw/helper/buffer.rb +60 -0
  79. data/lib/raw/helper/cookie.rb +32 -0
  80. data/lib/raw/helper/debug.rb +28 -0
  81. data/lib/raw/helper/default.rb +16 -0
  82. data/lib/raw/helper/feed.rb +451 -0
  83. data/lib/raw/helper/form.rb +284 -0
  84. data/lib/raw/helper/javascript.rb +59 -0
  85. data/lib/raw/helper/layout.rb +40 -0
  86. data/lib/raw/helper/navigation.rb +87 -0
  87. data/lib/raw/helper/pager.rb +305 -0
  88. data/lib/raw/helper/table.rb +247 -0
  89. data/lib/raw/helper/xhtml.rb +218 -0
  90. data/lib/raw/helper/xml.rb +125 -0
  91. data/lib/raw/mixin/magick.rb +35 -0
  92. data/lib/raw/mixin/sweeper.rb +71 -0
  93. data/lib/raw/mixin/thumbnails.rb +1 -0
  94. data/lib/raw/mixin/webfile.rb +165 -0
  95. data/lib/raw/render.rb +271 -0
  96. data/lib/raw/render/builder.rb +26 -0
  97. data/lib/raw/render/caching.rb +81 -0
  98. data/lib/raw/render/call.rb +43 -0
  99. data/lib/raw/render/send_file.rb +46 -0
  100. data/lib/raw/render/stream.rb +39 -0
  101. data/lib/raw/scaffold.rb +13 -0
  102. data/lib/raw/scaffold/controller.rb +25 -0
  103. data/lib/raw/scaffold/model.rb +157 -0
  104. data/lib/raw/test.rb +5 -0
  105. data/lib/raw/test/assertions.rb +169 -0
  106. data/lib/raw/test/context.rb +55 -0
  107. data/lib/raw/test/testcase.rb +79 -0
  108. data/lib/raw/util/attr.rb +128 -0
  109. data/lib/raw/util/encode_uri.rb +149 -0
  110. data/lib/raw/util/html_filter.rb +538 -0
  111. data/lib/raw/util/markup.rb +130 -0
  112. data/test/glue/tc_webfile.rb +1 -0
  113. data/test/nitro/CONFIG.rb +3 -0
  114. data/test/nitro/adapter/raw_post1.bin +9 -0
  115. data/test/nitro/adapter/tc_webrick.rb +16 -0
  116. data/test/nitro/cgi/tc_cookie.rb +14 -0
  117. data/test/nitro/cgi/tc_request.rb +61 -0
  118. data/test/nitro/compiler/tc_client_morpher.rb +47 -0
  119. data/test/nitro/compiler/tc_compiler.rb +25 -0
  120. data/test/nitro/dispatcher/tc_mounter.rb +47 -0
  121. data/test/nitro/helper/tc_feed.rb +135 -0
  122. data/test/nitro/helper/tc_navbar.rb +74 -0
  123. data/test/nitro/helper/tc_pager.rb +35 -0
  124. data/test/nitro/helper/tc_table.rb +68 -0
  125. data/test/nitro/helper/tc_xhtml.rb +19 -0
  126. data/test/nitro/tc_caching.rb +19 -0
  127. data/test/nitro/tc_cgi.rb +222 -0
  128. data/test/nitro/tc_context.rb +17 -0
  129. data/test/nitro/tc_controller.rb +103 -0
  130. data/test/nitro/tc_controller_aspect.rb +32 -0
  131. data/test/nitro/tc_controller_params.rb +885 -0
  132. data/test/nitro/tc_dispatcher.rb +109 -0
  133. data/test/nitro/tc_element.rb +85 -0
  134. data/test/nitro/tc_flash.rb +59 -0
  135. data/test/nitro/tc_helper.rb +47 -0
  136. data/test/nitro/tc_render.rb +119 -0
  137. data/test/nitro/tc_router.rb +61 -0
  138. data/test/nitro/tc_server.rb +35 -0
  139. data/test/nitro/tc_session.rb +66 -0
  140. data/test/nitro/tc_template.rb +71 -0
  141. data/test/nitro/util/tc_encode_url.rb +87 -0
  142. data/test/nitro/util/tc_markup.rb +31 -0
  143. data/test/public/blog/another/very_litle/index.xhtml +1 -0
  144. data/test/public/blog/inc1.xhtml +2 -0
  145. data/test/public/blog/inc2.xhtml +1 -0
  146. data/test/public/blog/list.xhtml +9 -0
  147. data/test/public/dummy_mailer/registration.xhtml +5 -0
  148. metadata +244 -0
@@ -0,0 +1,74 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
2
+
3
+ require 'test/unit'
4
+ require 'nitro/helper/navigation'
5
+
6
+
7
+ class TC_NavigationHelper < Test::Unit::TestCase # :nodoc: all
8
+ include Nitro
9
+ include NavigationHelper
10
+ FirstController = Class.new(Controller) do
11
+ def self.mount_path() "controller1" end
12
+ end
13
+ Second = Class.new(Controller) do
14
+ def self.mount_path() "controller2" end
15
+ end
16
+ MockRequest=Struct.new(:path)
17
+ attr :request
18
+ def setup
19
+ @request=MockRequest.new("controller1")
20
+ end
21
+ def check_div(text)
22
+ #offsets accomodate \n
23
+ assert_equal '<div id="navcontainer">',text[0,23]
24
+ assert_equal '</div>',text[-8,6]
25
+ end
26
+ def check_ul(text)
27
+ assert_equal '<ul id="navlist">',text[25,17]
28
+ assert_equal '</ul>',text[-14,5]
29
+ end
30
+ def test_navfor_around_html
31
+ text= menu_for(FirstController)
32
+ check_div(text)
33
+ check_ul(text)
34
+ end
35
+
36
+ def test_navfor_inner_html_single
37
+ text= menu_for(FirstController)
38
+ text.gsub!(%r{</?(div|ul).*?>},'')
39
+ text.gsub!("\n",'')
40
+ assert_equal '<li id="active"><a href="controller1" id="current"> TC_NavigationHelper::First </a></li>',
41
+ text.strip
42
+ end
43
+ def test_navfor_inner_html_many
44
+ text = menu_for(FirstController,Second)
45
+ assert_match %r|href="controller1" id="current">| , text
46
+ assert_match %r|href="controller2">| , text
47
+ assert_match %r| TC_NavigationHelper::First | , text
48
+ assert_match %r| TC_NavigationHelper::Second |, text
49
+ end
50
+
51
+ def test_navfor_yielding
52
+ text= menu_for(FirstController,Second) do |controller|
53
+ controller==FirstController ? 'first' : 'second'
54
+ end
55
+ assert_match %r|<a href="controller1".*first </a>|,text
56
+ assert_match %r|<a href="controller2".*second </a>|,text
57
+ end
58
+ def test_navforhash_around_html
59
+ text= menu_from_hash('path'=>'text')
60
+ check_div(text)
61
+ check_ul(text)
62
+ end
63
+
64
+ def test_navforhash_inner_html_single
65
+ text= menu_from_hash('link'=>'text')
66
+ text.gsub!(%r{</?(div|ul).*?>},'')
67
+ text.gsub!("\n",'')
68
+ assert_equal '<li><a href="link"> text </a></li>',
69
+ text.strip
70
+ end
71
+
72
+
73
+
74
+ end
@@ -0,0 +1,35 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
2
+
3
+ require 'test/unit'
4
+
5
+ require 'nitro/helper/pager'
6
+
7
+ class TC_Pager < Test::Unit::TestCase # :nodoc: all
8
+ include Nitro
9
+ include Nitro::PagerHelper
10
+
11
+ class RequestMock < Hash
12
+ attr_accessor :query
13
+
14
+ def initialize
15
+ @query = {}
16
+ end
17
+
18
+ def get(k, default)
19
+ return self[k] || default
20
+ end
21
+ end
22
+
23
+ def request
24
+ RequestMock.new
25
+ end
26
+
27
+ def test_all
28
+ stuff = [1, 2, 3, 4, 5, 6, 7, 8, 9]
29
+
30
+ items, pager = paginate(stuff, :per_page => 2)
31
+ assert_equal 2, items.size
32
+ assert_equal 9, pager.total_count
33
+ end
34
+
35
+ end
@@ -0,0 +1,68 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
2
+
3
+ require 'test/unit'
4
+ require 'nitro/helper/table'
5
+
6
+ class TC_TableHelper < Test::Unit::TestCase # :nodoc: all
7
+ include Nitro
8
+ include TableHelper
9
+
10
+ User = Struct.new(:name, :password, :email)
11
+
12
+ def setup
13
+ @headers = %w{Name Password Email}
14
+ @users = [
15
+ User.new('gmosx', 'huh?', 'gm@nowhere.com'),
16
+ User.new('renos', 'nah', 'renos@nowhere.com'),
17
+ User.new('stella', 'hoh', 'stella@love.com')
18
+ ]
19
+ end
20
+
21
+ def teardown
22
+ @users = nil
23
+ end
24
+
25
+ def test_table
26
+ values = @users.collect { |u| [u.name, u.password, u.email] }
27
+ table = build_table(:id => 'test', :headers => @headers, :values => values)
28
+ res = %|<table id="test"><tr><th>Name</th><th>Password</th><th>Email</th></tr><tr><td>gmosx</td><td>huh?</td><td>gm@nowhere.com</td></tr><tr><td>renos</td><td>nah</td><td>renos@nowhere.com</td></tr><tr><td>stella</td><td>hoh</td><td>stella@love.com</td></tr></table>|
29
+ assert_equal res, table
30
+ end
31
+
32
+ def test_table_footer
33
+ values = @users.collect { |u| [u.name, u.password, u.email] }
34
+ footers = ["#{@users.size}users", '', '']
35
+
36
+ table = build_table(:id => 'test2', :headers => @headers, :values => values, :footers => footers)
37
+
38
+ res = %|<table id="test2"><thead><tr><th>Name</th><th>Password</th><th>Email</th></tr></thead><tfoot><tr><td>3users</td><td></td><td></td></tr></tfoot><tr><td>gmosx</td><td>huh?</td><td>gm@nowhere.com</td></tr><tr><td>renos</td><td>nah</td><td>renos@nowhere.com</td></tr><tr><td>stella</td><td>hoh</td><td>stella@love.com</td></tr></table>|
39
+ assert_equal res, table
40
+ end
41
+
42
+ def test_table_tbody
43
+ values = []
44
+ values << @users[0...1].collect { |u| [u.name, u.password, u.email] }
45
+ values << @users[1..2].collect { |u| [u.name, u.password, u.email] }
46
+ table = build_table(:id => 'test', :headers => @headers, :values => values)
47
+ res = %|<table id="test"><thead><tr><th>Name</th><th>Password</th><th>Email</th></tr></thead><tbody><tr><td>gmosx</td><td>huh?</td><td>gm@nowhere.com</td></tr></tbody><tbody><tr><td>renos</td><td>nah</td><td>renos@nowhere.com</td></tr><tr><td>stella</td><td>hoh</td><td>stella@love.com</td></tr></tbody></table>|
48
+ assert_equal res, table
49
+ end
50
+
51
+ def test_table_alternating_rows
52
+ values = @users.collect { |u| [u.name, u.password, u.email] }
53
+ table = build_table(:id => 'test', :headers => @headers, :values => values, :alternating_rows => true)
54
+ res = %|<table id="test"><tr><th>Name</th><th>Password</th><th>Email</th></tr><tr class="row_odd"><td>gmosx</td><td>huh?</td><td>gm@nowhere.com</td></tr><tr class="row_even"><td>renos</td><td>nah</td><td>renos@nowhere.com</td></tr><tr class="row_odd"><td>stella</td><td>hoh</td><td>stella@love.com</td></tr></table>|
55
+ assert_equal res, table
56
+ end
57
+
58
+ def test_table_alternating_rows_tbody
59
+ values = []
60
+ values << @users[0...1].collect { |u| [u.name, u.password, u.email] }
61
+ values << @users[1..2].collect { |u| [u.name, u.password, u.email] }
62
+ table = build_table(:id => 'test', :headers => @headers, :values => values, :alternating_rows => true)
63
+ res = %|<table id="test"><thead><tr><th>Name</th><th>Password</th><th>Email</th></tr></thead><tbody><tr class="row_odd"><td>gmosx</td><td>huh?</td><td>gm@nowhere.com</td></tr></tbody><tbody><tr class="row_even"><td>renos</td><td>nah</td><td>renos@nowhere.com</td></tr><tr class="row_odd"><td>stella</td><td>hoh</td><td>stella@love.com</td></tr></tbody></table>|
64
+ assert_equal res, table
65
+ end
66
+ end
67
+
68
+
@@ -0,0 +1,19 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
2
+
3
+ require 'test/unit'
4
+ require 'nitro/helper/xhtml'
5
+
6
+ class TC_XhtmlHelper < Test::Unit::TestCase # :nodoc: all
7
+ include Nitro
8
+ include XhtmlHelper
9
+
10
+ def test_all
11
+ end
12
+
13
+ def test_popup
14
+ res = popup :text => 'Pop', :url => 'add-comment', :scrollbars => true
15
+ exp = %{<a href="#" onclick="javascript: var pwl = (screen.width - 320) / 2; var pwt = (screen.height - 240) / 2; window.open('add-comment', 'Popup', 'width=320,height=240,top='+pwt+',left='+pwl+', resizable=no,scrollbars=yes'); return false;"">Pop</a>}
16
+ assert_equal exp, res
17
+ end
18
+
19
+ end
@@ -0,0 +1,19 @@
1
+ require File.join(File.dirname(__FILE__), 'CONFIG.rb')
2
+
3
+ require 'test/unit'
4
+
5
+ require 'nitro/caching'
6
+
7
+ class TC_Caching < Test::Unit::TestCase # :nodoc: all
8
+ include Nitro
9
+
10
+ class DummyCa
11
+ include Nitro::Caching
12
+ end
13
+
14
+ def test_all
15
+ # bug:
16
+ assert_equal [], Caching.public_instance_methods
17
+ assert_equal [], DummyCa.public_instance_methods.grep(/caching/)
18
+ end
19
+ end
@@ -0,0 +1,222 @@
1
+ require File.join(File.dirname(__FILE__), 'CONFIG.rb')
2
+
3
+ require 'stringio'
4
+ require 'tempfile'
5
+ require 'socket'
6
+ require 'ostruct'
7
+ require 'test/unit'
8
+
9
+ require 'facets/core/kernel/assign_with'
10
+
11
+ require 'nitro/cgi'
12
+ require 'nitro/cgi/cookie'
13
+
14
+ class String
15
+ class << self
16
+
17
+ begin
18
+ require 'inline'
19
+
20
+ inline do |builder|
21
+ builder.c_raw <<-EOS
22
+ static VALUE rnd(int argc, VALUE* args, VALUE self)
23
+ {
24
+ if (!argc)
25
+ rb_raise(rb_eArgError, "not enough arguments");
26
+ if (argc > 0)
27
+ Check_Type(args[0], T_FIXNUM);
28
+ if (argc > 1)
29
+ Check_Type(args[1], T_FIXNUM);
30
+
31
+ int size = FIX2INT(args[0]);
32
+ int seed = argc > 1 ? FIX2INT(args[1]) : 0;
33
+ int i = 0;
34
+ VALUE str = rb_str_new((char*)0, size);
35
+
36
+ srandom(seed);
37
+
38
+ for (; i < size; i++) {
39
+ RSTRING(str)->ptr[i] = (char)(((random() % ('z' - ' ')) + ' '));
40
+ }
41
+
42
+ return str;
43
+ }
44
+ EOS
45
+ end
46
+
47
+ def random(size, seed = 22)
48
+ return rnd(size.to_i, seed.to_i)
49
+ end
50
+
51
+ rescue Exception => e
52
+ puts "please install Ruby::Inline (gem install RubyInline) to speed up this test"
53
+
54
+ def random(size)
55
+ s = String.new
56
+ range = (' '..'z').to_a
57
+ r_size = range.size
58
+ for i in (0...size)
59
+ s << range[Kernel.rand(r_size)] # ascii range
60
+ end
61
+ s
62
+ end
63
+
64
+ end
65
+
66
+ end
67
+ end
68
+
69
+ class TestAdapterCgi < Test::Unit::TestCase # :nodoc: all
70
+ include Nitro
71
+
72
+ def test_rnd
73
+ size = 500
74
+ d = String.random(size)
75
+
76
+ assert_equal size, d.size
77
+ assert d.all? {|x| (' '..'z').include?(x) }, 'has to have ascii, had: ' + d.inspect
78
+ end
79
+
80
+ class User
81
+ attr_accessor :name
82
+ attr_accessor :password
83
+ end
84
+
85
+ def test_parse_query_parameters
86
+ qs = 'name=tml;id=12354'
87
+ params = Cgi.parse_query_string(qs)
88
+ assert_equal 2, params.size
89
+ assert_equal 'tml', params['name']
90
+
91
+ qs = ''
92
+ params = Cgi.parse_query_string(qs)
93
+ assert_equal 0, params.size
94
+
95
+ qs = nil
96
+ params = Cgi.parse_query_string(qs)
97
+ assert_equal 0, params.size
98
+
99
+ qs = 'name=tml;arr[]=1;arr[]=2;arr[]=3'
100
+ params = Cgi.parse_query_string(qs)
101
+ assert_equal 2, params.size
102
+ arr = params['arr']
103
+ assert_equal 3, arr.size
104
+
105
+ qs = 'other=1;user.name=gmosx;user.password=hello'
106
+ params = Cgi.parse_query_string(qs)
107
+ assert_equal 2, params.size
108
+ u = params['user']
109
+ assert_equal 'gmosx', u['name']
110
+ assert_equal 'hello', u['password']
111
+
112
+ user = User.new
113
+ user.assign_with(params['user'])
114
+ assert_equal 'gmosx', user.name
115
+ assert_equal 'hello', user.password
116
+
117
+ # Ruby/Scriptaculous compatibility.
118
+
119
+ qs = 'other=1;user[name]=gmosx;user[password]=hello'
120
+ params = Cgi.parse_query_string(qs)
121
+ assert_equal 2, params.size
122
+ u = params['user']
123
+ assert_equal 'gmosx', u['name']
124
+ assert_equal 'hello', u['password']
125
+ end
126
+
127
+ def test_parse_cookies
128
+ context = OpenStruct.new
129
+ context.env = {}
130
+ context.env['HTTP_COOKIE'] = 'nsid=123; nauth=gmosx:passwd'
131
+ Cgi.parse_cookies(context)
132
+ assert_equal 2, context.cookies.size
133
+ assert_equal '123', context.cookies['nsid']
134
+
135
+ context.env = {}
136
+ context.env['HTTP_COOKIE'] = 'nsid=123; nsid=23123'
137
+ cookies = Cgi.parse_cookies(context)
138
+ assert_equal 1, context.cookies.size
139
+ assert_equal "123" + "\0" + "23123", context.cookies['nsid']
140
+ end
141
+
142
+ def test_response_headers
143
+ ctx = OpenStruct.new
144
+ ctx.status = 200
145
+ ctx.response_cookies = {
146
+ 'nsid' => Cookie.new('nsid', '1233'),
147
+ 'nauth' => Cookie.new('nauth', 'gmosx')
148
+ }
149
+ ctx.response_headers = {
150
+ 'Content-Type' => 'text/html'
151
+ }
152
+
153
+ res = "Status: 200 OK\r\nContent-Type: text/html\r\nSet-Cookie: nauthnauth=gmosx; Path=/\r\nSet-Cookie: nsidnsid=1233; Path=/\r\n\r\n"
154
+ assert_equal res, Cgi.response_headers(ctx)
155
+ end
156
+ =begin
157
+ def test_parse_multipart
158
+ context = OpenStruct.new
159
+ context.in = File.open(File.join(File.dirname(__FILE__), 'raw_post1.bin'))
160
+ context.headers = { 'CONTENT_LENGTH' => 11963 }
161
+ boundary = '---------------------------277124474474241471962886717'
162
+ CgiUtils.parse_multipart(context, boundary)
163
+ end
164
+ =end
165
+
166
+ def test_parse_multipart
167
+ # MIME block close falls on read boundary, also contains an empty field.
168
+ boundary = "---------------------------15773515131648678014689318540"
169
+ closure = "#{Cgi::EOL}--#{boundary}--#{Cgi::EOL}"
170
+ block_size = Cgi.buffer_size
171
+
172
+ input = StringIO.new
173
+ input << "--#{boundary}#{Cgi::EOL}"
174
+ input << "Content-Disposition: form-data; name=\"test_file_a\"; filename=\"test_case.txt\"#{Cgi::EOL}Content-Type: application/octet-stream#{Cgi::EOL}#{Cgi::EOL}"
175
+ fake_file_a = String.random(block_size - input.size - (closure.size/2))
176
+ input << fake_file_a
177
+ input_after_fake_file = input.size
178
+ input << "#{Cgi::EOL}--#{boundary}#{Cgi::EOL}"
179
+
180
+ #Boundary fell inbetween two reads?
181
+ assert_equal((block_size > input_after_fake_file) && (block_size < input.size),true)
182
+
183
+ input << "Content-Disposition: form-data; name=\"test_file_b\"; filename=\"test_case.txt\"#{Cgi::EOL}Content-Type: application/octet-stream#{Cgi::EOL}#{Cgi::EOL}"
184
+ fake_file_b = Tempfile.new("TCCGI")
185
+
186
+ i = 0
187
+ file_size = 1024*1024*10 # 10MB
188
+ i += fake_file_b.write String.random(1024*10) while i < file_size
189
+
190
+ fake_file_b.rewind
191
+ input << fake_file_b.read
192
+ fake_file_b.rewind
193
+ input << "#{Cgi::EOL}--#{boundary}#{Cgi::EOL}"
194
+
195
+ input << "Content-Disposition: form-data; name=\"empty_field\"#{Cgi::EOL}#{Cgi::EOL}"
196
+ input << closure
197
+ input.rewind
198
+ start = Time.now
199
+ params = Nitro::Cgi.parse_multipart(make_context(input), boundary)
200
+ duration = Time.now - start
201
+ # puts "\nparse_multipart took: #{duration} seconds\n"
202
+ assert_equal(fake_file_a,params['test_file_a'].to_s)
203
+ assert_equal(fake_file_b.read,params['test_file_b'].to_s)
204
+ assert_equal(String.new,params['empty_field'].to_s)
205
+ end
206
+
207
+
208
+ def make_context(input)
209
+ context = OpenStruct.new
210
+ context.in = input
211
+ context.content_length = input.size
212
+ context.env = { 'HTTP_USER_AGENT' => 'TestCase' }
213
+ context.session = Hash.new
214
+ class << context.session
215
+ def sync
216
+ true
217
+ end
218
+ end
219
+ context
220
+ end
221
+ end
222
+ # Tempfile.new("CGI")
@@ -0,0 +1,17 @@
1
+ require File.join(File.dirname(__FILE__), 'CONFIG.rb')
2
+
3
+ require 'test/unit'
4
+ require 'ostruct'
5
+
6
+ require 'nitro/context'
7
+
8
+ class TC_Context < Test::Unit::TestCase # :nodoc: all
9
+ include Nitro
10
+
11
+ def test_context
12
+ conf = OpenStruct.new
13
+ conf.dispatcher = nil
14
+ c = Context.new(conf)
15
+ assert_equal 200, c.status
16
+ end
17
+ end