merb 0.5.3 → 0.9.2

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.
Files changed (294) hide show
  1. data/LICENSE +0 -20
  2. data/README +0 -277
  3. data/Rakefile +80 -199
  4. data/TODO +0 -3
  5. metadata +19 -438
  6. data/SVN_REVISION +0 -1
  7. data/app_generators/merb/USAGE +0 -5
  8. data/app_generators/merb/merb_generator.rb +0 -108
  9. data/app_generators/merb/templates/Rakefile +0 -124
  10. data/app_generators/merb/templates/app/controllers/application.rb +0 -3
  11. data/app_generators/merb/templates/app/controllers/exceptions.rb +0 -13
  12. data/app_generators/merb/templates/app/helpers/global_helper.rb +0 -5
  13. data/app_generators/merb/templates/app/mailers/views/layout/application.html.erb +0 -1
  14. data/app_generators/merb/templates/app/mailers/views/layout/application.text.erb +0 -1
  15. data/app_generators/merb/templates/app/parts/views/layout/application.html.erb +0 -1
  16. data/app_generators/merb/templates/app/views/exceptions/internal_server_error.html.erb +0 -216
  17. data/app_generators/merb/templates/app/views/exceptions/not_acceptable.html.erb +0 -38
  18. data/app_generators/merb/templates/app/views/exceptions/not_found.html.erb +0 -40
  19. data/app_generators/merb/templates/app/views/layout/application.html.erb +0 -11
  20. data/app_generators/merb/templates/config/boot.rb +0 -11
  21. data/app_generators/merb/templates/config/dependencies.rb +0 -41
  22. data/app_generators/merb/templates/config/environments/development.rb +0 -1
  23. data/app_generators/merb/templates/config/environments/production.rb +0 -1
  24. data/app_generators/merb/templates/config/environments/test.rb +0 -1
  25. data/app_generators/merb/templates/config/merb.yml +0 -82
  26. data/app_generators/merb/templates/config/merb_init.rb +0 -17
  27. data/app_generators/merb/templates/config/plugins.yml +0 -1
  28. data/app_generators/merb/templates/config/router.rb +0 -35
  29. data/app_generators/merb/templates/config/upload.conf +0 -0
  30. data/app_generators/merb/templates/public/images/merb.jpg +0 -0
  31. data/app_generators/merb/templates/public/merb.fcgi +0 -6
  32. data/app_generators/merb/templates/public/stylesheets/master.css +0 -119
  33. data/app_generators/merb/templates/script/destroy +0 -32
  34. data/app_generators/merb/templates/script/generate +0 -32
  35. data/app_generators/merb/templates/script/stop_merb +0 -13
  36. data/app_generators/merb/templates/script/win_script.cmd +0 -1
  37. data/app_generators/merb/templates/spec/spec.opts +0 -6
  38. data/app_generators/merb/templates/spec/spec_helper.rb +0 -15
  39. data/app_generators/merb/templates/test/test_helper.rb +0 -14
  40. data/app_generators/merb_plugin/USAGE +0 -5
  41. data/app_generators/merb_plugin/merb_plugin_generator.rb +0 -68
  42. data/app_generators/merb_plugin/templates/LICENSE +0 -20
  43. data/app_generators/merb_plugin/templates/README +0 -4
  44. data/app_generators/merb_plugin/templates/Rakefile +0 -35
  45. data/app_generators/merb_plugin/templates/TODO +0 -5
  46. data/app_generators/merb_plugin/templates/merbtasks.rb +0 -6
  47. data/app_generators/merb_plugin/templates/sampleplugin.rb +0 -10
  48. data/app_generators/merb_plugin/templates/sampleplugin_spec.rb +0 -7
  49. data/app_generators/merb_plugin/templates/spec_helper.rb +0 -2
  50. data/bin/merb +0 -4
  51. data/lib/autotest/discover.rb +0 -3
  52. data/lib/autotest/merb_rspec.rb +0 -80
  53. data/lib/merb.rb +0 -188
  54. data/lib/merb/abstract_controller.rb +0 -399
  55. data/lib/merb/assets.rb +0 -160
  56. data/lib/merb/assets.rb.orig +0 -119
  57. data/lib/merb/boot_loader.rb +0 -286
  58. data/lib/merb/boot_loader.rb.orig +0 -235
  59. data/lib/merb/caching.rb +0 -5
  60. data/lib/merb/caching/action_cache.rb +0 -92
  61. data/lib/merb/caching/fragment_cache.rb +0 -39
  62. data/lib/merb/caching/store/file_cache.rb +0 -90
  63. data/lib/merb/caching/store/memory_cache.rb +0 -85
  64. data/lib/merb/config.rb +0 -290
  65. data/lib/merb/constants.rb +0 -50
  66. data/lib/merb/controller.rb +0 -220
  67. data/lib/merb/cookies.rb +0 -95
  68. data/lib/merb/core_ext.rb +0 -15
  69. data/lib/merb/core_ext/array.rb +0 -0
  70. data/lib/merb/core_ext/class.rb +0 -180
  71. data/lib/merb/core_ext/enumerable.rb +0 -49
  72. data/lib/merb/core_ext/get_args.rb +0 -76
  73. data/lib/merb/core_ext/hash.rb +0 -306
  74. data/lib/merb/core_ext/inflections.rb +0 -112
  75. data/lib/merb/core_ext/inflector.rb +0 -275
  76. data/lib/merb/core_ext/kernel.rb +0 -242
  77. data/lib/merb/core_ext/mash.rb +0 -88
  78. data/lib/merb/core_ext/module.rb +0 -67
  79. data/lib/merb/core_ext/numeric.rb +0 -72
  80. data/lib/merb/core_ext/object.rb +0 -183
  81. data/lib/merb/core_ext/string.rb +0 -53
  82. data/lib/merb/core_ext/symbol.rb +0 -6
  83. data/lib/merb/dispatcher.rb +0 -109
  84. data/lib/merb/drb_server.rb +0 -19
  85. data/lib/merb/erubis_ext.rb +0 -10
  86. data/lib/merb/exceptions.rb +0 -192
  87. data/lib/merb/generators/merb_app/merb_app.rb +0 -22
  88. data/lib/merb/generators/merb_generator_helpers.rb +0 -318
  89. data/lib/merb/generators/merb_plugin.rb +0 -22
  90. data/lib/merb/logger.rb +0 -78
  91. data/lib/merb/mail_controller.rb +0 -268
  92. data/lib/merb/mailer.rb +0 -87
  93. data/lib/merb/mixins/basic_authentication.rb +0 -35
  94. data/lib/merb/mixins/controller.rb +0 -160
  95. data/lib/merb/mixins/erubis_capture.rb +0 -68
  96. data/lib/merb/mixins/general_controller.rb +0 -253
  97. data/lib/merb/mixins/inline_partial.rb +0 -32
  98. data/lib/merb/mixins/render.rb +0 -465
  99. data/lib/merb/mixins/responder.rb +0 -449
  100. data/lib/merb/mixins/view_context.rb +0 -558
  101. data/lib/merb/mixins/web_controller.rb +0 -36
  102. data/lib/merb/mongrel_handler.rb +0 -168
  103. data/lib/merb/part_controller.rb +0 -29
  104. data/lib/merb/plugins.rb +0 -16
  105. data/lib/merb/rack_adapter.rb +0 -37
  106. data/lib/merb/request.rb +0 -465
  107. data/lib/merb/router.rb +0 -646
  108. data/lib/merb/server.rb +0 -169
  109. data/lib/merb/session.rb +0 -23
  110. data/lib/merb/session/cookie_store.rb +0 -118
  111. data/lib/merb/session/mem_cache_session.rb +0 -131
  112. data/lib/merb/session/memory_session.rb +0 -176
  113. data/lib/merb/template.rb +0 -37
  114. data/lib/merb/template/erubis.rb +0 -68
  115. data/lib/merb/template/haml.rb +0 -87
  116. data/lib/merb/template/markaby.rb +0 -59
  117. data/lib/merb/template/xml_builder.rb +0 -50
  118. data/lib/merb/test/fake_request.rb +0 -74
  119. data/lib/merb/test/helper.rb +0 -260
  120. data/lib/merb/test/hpricot.rb +0 -136
  121. data/lib/merb/test/multipart.rb +0 -66
  122. data/lib/merb/test/rspec.rb +0 -18
  123. data/lib/merb/test/rspec_matchers/controller_matchers.rb +0 -117
  124. data/lib/merb/test/rspec_matchers/markup_matchers.rb +0 -98
  125. data/lib/merb/upload_handler.rb +0 -80
  126. data/lib/merb/upload_progress.rb +0 -48
  127. data/lib/merb/version.rb +0 -49
  128. data/lib/merb/view_context.rb +0 -79
  129. data/lib/tasks.rb +0 -7
  130. data/lib/tasks/merb.rake +0 -54
  131. data/merb_default_generators/model/USAGE +0 -0
  132. data/merb_default_generators/model/model_generator.rb +0 -16
  133. data/merb_default_generators/model/templates/new_model_template.erb +0 -5
  134. data/merb_default_generators/resource_controller/USAGE +0 -0
  135. data/merb_default_generators/resource_controller/resource_controller_generator.rb +0 -26
  136. data/merb_default_generators/resource_controller/templates/controller.rb +0 -30
  137. data/merb_default_generators/resource_controller/templates/edit.html.erb +0 -1
  138. data/merb_default_generators/resource_controller/templates/helper.rb +0 -5
  139. data/merb_default_generators/resource_controller/templates/index.html.erb +0 -1
  140. data/merb_default_generators/resource_controller/templates/new.html.erb +0 -1
  141. data/merb_default_generators/resource_controller/templates/show.html.erb +0 -1
  142. data/merb_generators/controller/USAGE +0 -5
  143. data/merb_generators/controller/controller_generator.rb +0 -16
  144. data/merb_generators/controller/templates/controller.rb +0 -8
  145. data/merb_generators/controller/templates/helper.rb +0 -5
  146. data/merb_generators/controller/templates/index.html.erb +0 -3
  147. data/merb_generators/part_controller/USAGE +0 -5
  148. data/merb_generators/part_controller/part_controller_generator.rb +0 -27
  149. data/merb_generators/part_controller/templates/controller.rb +0 -8
  150. data/merb_generators/part_controller/templates/helper.rb +0 -5
  151. data/merb_generators/part_controller/templates/index.html.erb +0 -3
  152. data/merb_generators/resource/USAGE +0 -0
  153. data/merb_generators/resource/resource_generator.rb +0 -67
  154. data/rspec_generators/merb_controller_test/merb_controller_test_generator.rb +0 -67
  155. data/rspec_generators/merb_controller_test/templates/controller_spec.rb +0 -8
  156. data/rspec_generators/merb_controller_test/templates/edit_spec.rb +0 -12
  157. data/rspec_generators/merb_controller_test/templates/helper_spec.rb +0 -5
  158. data/rspec_generators/merb_controller_test/templates/index_spec.rb +0 -12
  159. data/rspec_generators/merb_controller_test/templates/new_spec.rb +0 -12
  160. data/rspec_generators/merb_controller_test/templates/show_spec.rb +0 -5
  161. data/rspec_generators/merb_model_test/merb_model_test_generator.rb +0 -26
  162. data/rspec_generators/merb_model_test/templates/model_spec_template.erb +0 -7
  163. data/script/destroy +0 -14
  164. data/script/generate +0 -14
  165. data/spec/fixtures/config/environments/environment_config_test.yml +0 -1
  166. data/spec/fixtures/config/merb.yml +0 -18
  167. data/spec/fixtures/controllers/dispatch_spec_controllers.rb +0 -235
  168. data/spec/fixtures/controllers/render_spec_controllers.rb +0 -184
  169. data/spec/fixtures/foo.rb +0 -3
  170. data/spec/fixtures/mailers/views/layout/application.html.erb +0 -3
  171. data/spec/fixtures/mailers/views/layout/application.text.erb +0 -3
  172. data/spec/fixtures/mailers/views/test_mail_controller/eighth.html.erb +0 -1
  173. data/spec/fixtures/mailers/views/test_mail_controller/eighth.text.erb +0 -1
  174. data/spec/fixtures/mailers/views/test_mail_controller/first.html.erb +0 -1
  175. data/spec/fixtures/mailers/views/test_mail_controller/first.text.erb +0 -1
  176. data/spec/fixtures/mailers/views/test_mail_controller/ninth.html.erb +0 -1
  177. data/spec/fixtures/mailers/views/test_mail_controller/ninth.text.erb +0 -1
  178. data/spec/fixtures/mailers/views/test_mail_controller/second.text.erb +0 -1
  179. data/spec/fixtures/mailers/views/test_mail_controller/third.html.erb +0 -1
  180. data/spec/fixtures/models/router_spec_models.rb +0 -30
  181. data/spec/fixtures/parts/views/layout/todo_part.html.erb +0 -3
  182. data/spec/fixtures/parts/views/layout/todo_part.xml.erb +0 -3
  183. data/spec/fixtures/parts/views/todo_part/formatted_output.html.erb +0 -1
  184. data/spec/fixtures/parts/views/todo_part/formatted_output.js.erb +0 -1
  185. data/spec/fixtures/parts/views/todo_part/formatted_output.xml.erb +0 -1
  186. data/spec/fixtures/parts/views/todo_part/list.html.erb +0 -3
  187. data/spec/fixtures/sample.txt +0 -1
  188. data/spec/fixtures/views/erubis.html.erb +0 -1
  189. data/spec/fixtures/views/examples/_erubis.html.erb +0 -1
  190. data/spec/fixtures/views/examples/_haml.html.haml +0 -1
  191. data/spec/fixtures/views/examples/_markaby.html.mab +0 -1
  192. data/spec/fixtures/views/examples/_throw_content.html.erb +0 -6
  193. data/spec/fixtures/views/examples/hello.xml.builder +0 -1
  194. data/spec/fixtures/views/examples/js.js.erb +0 -1
  195. data/spec/fixtures/views/examples/template_catch_content.html.erb +0 -15
  196. data/spec/fixtures/views/examples/template_catch_content_from_partial.html.erb +0 -6
  197. data/spec/fixtures/views/examples/template_throw_content.html.erb +0 -10
  198. data/spec/fixtures/views/examples/template_throw_content_without_block.html.erb +0 -3
  199. data/spec/fixtures/views/exceptions/admin_access_required.html.erb +0 -1
  200. data/spec/fixtures/views/extension_template_controller/_nested_js.js.erb +0 -1
  201. data/spec/fixtures/views/extension_template_controller/_nested_xml.xml.erb +0 -1
  202. data/spec/fixtures/views/extension_template_controller/_render_partial_multiple_times.html.erb +0 -1
  203. data/spec/fixtures/views/extension_template_controller/erubis_templates.html.erb +0 -1
  204. data/spec/fixtures/views/extension_template_controller/erubis_templates.js.erb +0 -1
  205. data/spec/fixtures/views/extension_template_controller/erubis_templates.rhtml +0 -1
  206. data/spec/fixtures/views/extension_template_controller/erubis_templates.xml.erb +0 -1
  207. data/spec/fixtures/views/extension_template_controller/haml_index.html.haml +0 -0
  208. data/spec/fixtures/views/extension_template_controller/haml_templates.html.haml +0 -1
  209. data/spec/fixtures/views/extension_template_controller/haml_templates.js.haml +0 -1
  210. data/spec/fixtures/views/extension_template_controller/haml_templates.xml.haml +0 -1
  211. data/spec/fixtures/views/extension_template_controller/index.html.erb +0 -0
  212. data/spec/fixtures/views/extension_template_controller/markaby_index.html.mab +0 -0
  213. data/spec/fixtures/views/extension_template_controller/markaby_templates.html.mab +0 -1
  214. data/spec/fixtures/views/extension_template_controller/markaby_templates.js.mab +0 -1
  215. data/spec/fixtures/views/extension_template_controller/markaby_templates.xml.mab +0 -1
  216. data/spec/fixtures/views/extension_template_controller/render_multiple_partials.html.erb +0 -4
  217. data/spec/fixtures/views/extension_template_controller/render_nested_js.js.erb +0 -1
  218. data/spec/fixtures/views/extension_template_controller/render_nested_xml.xml.erb +0 -1
  219. data/spec/fixtures/views/haml.html.haml +0 -1
  220. data/spec/fixtures/views/haml.xml.haml +0 -2
  221. data/spec/fixtures/views/layout/application.html.erb +0 -1
  222. data/spec/fixtures/views/layout/application.xml.erb +0 -1
  223. data/spec/fixtures/views/layout/nested/example.html.erb +0 -1
  224. data/spec/fixtures/views/markaby.html.mab +0 -1
  225. data/spec/fixtures/views/nested/example/test.html.erb +0 -1
  226. data/spec/fixtures/views/partials/_erubis.html.erb +0 -1
  227. data/spec/fixtures/views/partials/_erubis_collection.html.erb +0 -1
  228. data/spec/fixtures/views/partials/_erubis_collection_with_locals.html.erb +0 -1
  229. data/spec/fixtures/views/partials/_erubis_new.html.erb +0 -1
  230. data/spec/fixtures/views/partials/_haml.html.haml +0 -1
  231. data/spec/fixtures/views/partials/_haml_collection.html.haml +0 -1
  232. data/spec/fixtures/views/partials/_haml_collection_with_locals.html.haml +0 -1
  233. data/spec/fixtures/views/partials/_haml_new.html.haml +0 -1
  234. data/spec/fixtures/views/partials/_markaby.html.mab +0 -1
  235. data/spec/fixtures/views/partials/_markaby_collection.html.mab +0 -1
  236. data/spec/fixtures/views/partials/_markaby_collection_with_locals.html.mab +0 -1
  237. data/spec/fixtures/views/partials/_markaby_new.html.mab +0 -1
  238. data/spec/fixtures/views/render_object_controller/render_object_with_template.html.erb +0 -1
  239. data/spec/fixtures/views/render_object_controller/render_object_with_template.js.erb +0 -1
  240. data/spec/fixtures/views/render_object_controller/render_object_with_template.xml.erb +0 -1
  241. data/spec/fixtures/views/template_views/interface__buffer_erubis.html.erb +0 -4
  242. data/spec/fixtures/views/template_views/interface__buffer_haml.html.haml +0 -7
  243. data/spec/fixtures/views/template_views/interface__buffer_markaby.html.mab +0 -7
  244. data/spec/fixtures/views/template_views/interface_capture_erubis.html.erb +0 -15
  245. data/spec/fixtures/views/template_views/interface_capture_haml.html.haml +0 -15
  246. data/spec/fixtures/views/template_views/interface_capture_markaby.html.mab +0 -4
  247. data/spec/fixtures/views/template_views/interface_concat_erubis.html.erb +0 -12
  248. data/spec/fixtures/views/template_views/interface_concat_haml.html.haml +0 -11
  249. data/spec/fixtures/views/template_views/interface_concat_markaby.html.mab +0 -14
  250. data/spec/fixtures/views/test.dir/the_template.html.erb +0 -1
  251. data/spec/merb/abstract_controller_spec.rb +0 -38
  252. data/spec/merb/assets_spec.rb +0 -207
  253. data/spec/merb/caching_spec.rb +0 -102
  254. data/spec/merb/config_spec.rb +0 -29
  255. data/spec/merb/controller_filters_spec.rb +0 -253
  256. data/spec/merb/controller_spec.rb +0 -126
  257. data/spec/merb/cookie_store_spec.rb +0 -72
  258. data/spec/merb/cookies_spec.rb +0 -96
  259. data/spec/merb/core_ext/class_spec.rb +0 -97
  260. data/spec/merb/core_ext/enumerable_spec.rb +0 -27
  261. data/spec/merb/core_ext/hash_spec.rb +0 -251
  262. data/spec/merb/core_ext/inflector_spec.rb +0 -34
  263. data/spec/merb/core_ext/kernel_spec.rb +0 -25
  264. data/spec/merb/core_ext/numeric_spec.rb +0 -26
  265. data/spec/merb/core_ext/object_spec.rb +0 -47
  266. data/spec/merb/core_ext/string_spec.rb +0 -22
  267. data/spec/merb/core_ext/symbol_spec.rb +0 -7
  268. data/spec/merb/dependency_spec.rb +0 -22
  269. data/spec/merb/dispatch_spec.rb +0 -528
  270. data/spec/merb/fake_request_spec.rb +0 -80
  271. data/spec/merb/generator_spec.rb +0 -248
  272. data/spec/merb/handler_spec.rb +0 -169
  273. data/spec/merb/mail_controller_spec.rb +0 -177
  274. data/spec/merb/mailer_spec.rb +0 -87
  275. data/spec/merb/multipart_spec.rb +0 -50
  276. data/spec/merb/part_controller_spec.rb +0 -124
  277. data/spec/merb/plugins_spec.rb +0 -80
  278. data/spec/merb/render_spec.rb +0 -469
  279. data/spec/merb/request_spec.rb +0 -287
  280. data/spec/merb/responder_spec.rb +0 -562
  281. data/spec/merb/router_spec.rb +0 -900
  282. data/spec/merb/server_spec.rb +0 -19
  283. data/spec/merb/template_spec.rb +0 -41
  284. data/spec/merb/upload_handler_spec.rb +0 -108
  285. data/spec/merb/version_spec.rb +0 -33
  286. data/spec/merb/view_context_spec.rb +0 -366
  287. data/spec/spec_generator_helper.rb +0 -34
  288. data/spec/spec_helper.rb +0 -101
  289. data/spec/spec_helpers/url_shared_behaviour.rb +0 -112
  290. data/test_unit_generators/merb_controller_test/merb_controller_test_generator.rb +0 -53
  291. data/test_unit_generators/merb_controller_test/templates/functional_test.rb +0 -17
  292. data/test_unit_generators/merb_controller_test/templates/helper_test.rb +0 -9
  293. data/test_unit_generators/merb_model_test/merb_model_test_generator.rb +0 -29
  294. data/test_unit_generators/merb_model_test/templates/model_test_unit_template.erb +0 -9
@@ -1,36 +0,0 @@
1
- # Used by secondary actions (a PartsController or the view)
2
- # to provide the standard objects associated with each request.
3
-
4
- module Merb
5
- module WebControllerMixin #:nodoc:
6
-
7
- def request
8
- @web_controller.request
9
- end
10
-
11
- def params
12
- @web_controller.params
13
- end
14
-
15
- def cookies
16
- @web_controller.cookies
17
- end
18
-
19
- def headers
20
- @web_controller.headers
21
- end
22
-
23
- def session
24
- @web_controller.session
25
- end
26
-
27
- def response
28
- @web_controller.response
29
- end
30
-
31
- def route
32
- request.route
33
- end
34
-
35
- end
36
- end
@@ -1,168 +0,0 @@
1
- class Mongrel::HttpResponse
2
- NO_CLOSE_STATUS_FORMAT = "HTTP/1.1 %d %s\r\n".freeze
3
- def send_status_no_connection_close(content_length=@body.length)
4
- unless @status_sent
5
- @header['Content-Length'] = content_length unless @status == 304
6
- write(NO_CLOSE_STATUS_FORMAT % [@status, Mongrel::HTTP_STATUS_CODES[@status]])
7
- @status_sent = true
8
- end
9
- end
10
- end
11
-
12
- class MerbHandler < Mongrel::HttpHandler
13
- @@file_only_methods = ["GET","HEAD"]
14
- @@path_prefix = nil
15
- @@path_prefix_original = nil
16
-
17
- class << self
18
- # Use :path_prefix in merb.yml to set this
19
- def path_prefix() @@path_prefix_original end
20
- def path_prefix=(prefix)
21
- @@path_prefix_original = prefix
22
- @@path_prefix = (prefix.is_a?(String) ? /^#{prefix.escape_regexp}/ : prefix)
23
- end
24
- end
25
-
26
- # Take the name of a directory and use that as the doc root or public
27
- # directory of your site. This is set to the root of your merb app + '/public'
28
- # by default.
29
- def initialize(dir, mongrel_x_sendfile=true, opts = {})
30
- @files = Mongrel::DirHandler.new(dir,false)
31
- @mongrel_x_sendfile = mongrel_x_sendfile
32
- end
33
-
34
- # process incoming http requests and do a number of things
35
- # 1. Check for rails style cached pages. add .html to the url and see if
36
- # there is a static file in public that matches. serve that file directly
37
- # without invoking Merb and be done with it.
38
- # 2. Serve static asset and html files directly from public/ if they exist.
39
- # 3. If none of the above apply, we take apart the request url and feed it
40
- # into Merb::RouteMatcher to let it decide which controller and method will
41
- # serve the request.
42
- # 4. After the controller has done its thing, we check for the X-SENDFILE
43
- # header. if you set this header to the path of a file in your controller
44
- # then mongrel will serve the file directly and your controller can go on
45
- # processing other requests.
46
- def process(request, response)
47
- return if response.socket.closed?
48
-
49
- start = Time.now
50
- benchmarks = {}
51
-
52
- Merb.logger.info("\nRequest: REQUEST_URI: #{
53
- request.params[Mongrel::Const::REQUEST_URI]} (#{Time.now.strftime("%Y-%m-%d %H:%M:%S")})")
54
-
55
- # Truncate the request URI if there's a path prefix so that an app can be
56
- # hosted inside a subdirectory, for example.
57
- if @@path_prefix
58
- if request.params[Mongrel::Const::PATH_INFO] =~ @@path_prefix
59
- Merb.logger.info("Path prefix #{@@path_prefix.inspect} removed from PATH_INFO and REQUEST_URI.")
60
- request.params[Mongrel::Const::PATH_INFO].sub!(@@path_prefix, '')
61
- request.params[Mongrel::Const::REQUEST_URI].sub!(@@path_prefix, '')
62
- path_info = request.params[Mongrel::Const::PATH_INFO]
63
- else
64
- raise "Path prefix is set to '#{@@path_prefix.inspect}', but is not in the REQUEST_URI. "
65
- end
66
- else
67
- path_info = request.params[Mongrel::Const::PATH_INFO]
68
- end
69
-
70
- # Rails style page caching. Check the public dir first for .html pages and
71
- # serve directly. Otherwise fall back to Merb routing and request
72
- # dispatching.
73
- page_cached = path_info + ".html"
74
- get_or_head = @@file_only_methods.include? request.params[Mongrel::Const::REQUEST_METHOD]
75
-
76
- if get_or_head && @files.can_serve(path_info)
77
- # File exists as-is so serve it up
78
- Merb.logger.info("Serving static file: #{path_info}")
79
- @files.process(request,response)
80
- elsif get_or_head && @files.can_serve(page_cached)
81
- # Possible cached page, serve it up
82
- Merb.logger.info("Serving static file: #{page_cached}")
83
- request.params[Mongrel::Const::PATH_INFO] = page_cached
84
- @files.process(request,response)
85
- else
86
- # Let Merb:Dispatcher find the route and call the filter chain and action
87
- controller, action = Merb::Dispatcher.handle(request, response)
88
- benchmarks.merge!(controller._benchmarks)
89
- benchmarks[:controller] = controller.class.to_s
90
- benchmarks[:action] = action
91
-
92
- Merb.logger.info("Routing to controller: #{controller.class} action: #{action}\nRoute Recognition & Parsing HTTP Input took: #{benchmarks[:setup_time]} seconds")
93
-
94
- sendfile, clength = nil
95
- response.status = controller.status
96
- # Check for the X-SENDFILE header from your Merb::Controller and serve
97
- # the file directly instead of buffering.
98
- controller.headers.each do |k, v|
99
- if k =~ /^X-SENDFILE$/i
100
- sendfile = v
101
- elsif k =~ /^CONTENT-LENGTH$/i
102
- clength = v.to_i
103
- else
104
- [*v].each do |vi|
105
- response.header[k] = vi
106
- end
107
- end
108
- end
109
-
110
- if sendfile
111
- if @mongrel_x_sendfile
112
- # we want to emulate X-Sendfile header internally in mongrel
113
- benchmarks[:sendfile_time] = Time.now - start
114
- Merb.logger.info("X-SENDFILE: #{sendfile}\nComplete Request took: #{
115
- benchmarks[:sendfile_time]} seconds")
116
- file_status = File.stat(sendfile)
117
- response.status = 200
118
- # Set the last modified times as well and etag for all files
119
- response.header[Mongrel::Const::LAST_MODIFIED] = file_status.mtime.httpdate
120
- # Calculated the same as apache, not sure how well the works on win32
121
- response.header[Mongrel::Const::ETAG] = Mongrel::Const::ETAG_FORMAT % [file_status.mtime.to_i, file_status.size, file_status.ino]
122
- # Send a status with out content length
123
- response.send_status(file_status.size)
124
- response.send_header
125
- response.send_file(sendfile)
126
- else
127
- # we want to pass thru the X-Sendfile header so apache or whatever
128
- # front server can handle it
129
- response.header['X-Sendfile'] = sendfile
130
- response.header['Content-length'] = clength || File.size(sendfile)
131
- response.finished
132
- end
133
- elsif controller.body.respond_to? :read
134
- response.send_status(clength)
135
- response.send_header
136
- while chunk = controller.body.read(16384)
137
- response.write(chunk)
138
- end
139
- if controller.body.respond_to? :close
140
- controller.body.close
141
- end
142
- elsif Proc === controller.body
143
- controller.body.call
144
- else
145
- # Render response from successful controller
146
- body = (controller.body.to_s rescue '')
147
- response.send_status(body.length)
148
- response.send_header
149
- response.write(body)
150
- end
151
-
152
- total_request_time = Time.now - start
153
- benchmarks[:total_request_time] = total_request_time
154
-
155
- Merb.logger.info("Request Times: #{benchmarks.inspect}\nResponse status: #{response.status}\nComplete Request took: #{total_request_time} seconds, #{1.0/total_request_time} Requests/Second\n\n")
156
- end
157
- rescue Object => e
158
- # if an exception is raised here then something is
159
- # wrong with the dispatcher code so we shouldn't pass the
160
- # exception back in or we might end up in a loop
161
- response.send_status(500)
162
- response.send_header
163
- response.write("500 Internal Server Error")
164
- Merb.logger.error(Merb.exception(e))
165
- ensure
166
- Merb.logger.flush
167
- end
168
- end
@@ -1,29 +0,0 @@
1
- module Merb
2
- class PartController < AbstractController
3
- self._template_root = File.expand_path(self._template_root / "../parts/views")
4
- include Merb::WebControllerMixin
5
-
6
- def initialize(web_controller)
7
- @web_controller = web_controller
8
- super
9
- end
10
-
11
- def dispatch(action=:to_s)
12
- old_action = params[:action]
13
- params[:action] = action
14
- super(action)
15
- params[:action] = old_action
16
- @_body
17
- end
18
-
19
- private
20
-
21
- # This method is here to overwrite the one in the general_controller mixin
22
- # The method ensures that when a url is generated with a hash, it contains a controller
23
- def get_controller_for_url_generation(opts)
24
- controller = opts[:controller] || @web_controller.params[:controller]
25
- raise "No Controller Specified for url()" unless controller
26
- controller
27
- end
28
- end
29
- end
data/lib/merb/plugins.rb DELETED
@@ -1,16 +0,0 @@
1
- module Merb
2
- module Plugins
3
- def self.config
4
- @config ||= File.exists?(Merb.root / "config" / "plugins.yml") ? YAML.load(File.read(Merb.root / "config" / "plugins.yml")) || {} : {}
5
- end
6
-
7
- @rakefiles = []
8
- def self.rakefiles
9
- @rakefiles
10
- end
11
-
12
- def self.add_rakefiles(*rakefiles)
13
- @rakefiles += rakefiles
14
- end
15
- end
16
- end
@@ -1,37 +0,0 @@
1
- module Merb
2
- module Rack
3
-
4
- class RequestWrapper
5
- def initialize(env)
6
- @env = env
7
- end
8
-
9
- def params
10
- @env
11
- end
12
-
13
- def body
14
- @env['rack.input']
15
- end
16
- end
17
-
18
- class Adapter
19
- def call(env)
20
- env["PATH_INFO"] ||= ""
21
- env["SCRIPT_NAME"] ||= ""
22
- if env["REQUEST_URI"] =~ %r{(https?://)[^/](.*)}
23
- env["REQUEST_URI"] = $2
24
- end
25
- request = RequestWrapper.new(env)
26
- response = StringIO.new
27
- begin
28
- controller, action = ::Merb::Dispatcher.handle(request, response)
29
- rescue Object => e
30
- return [500, {"Content-Type"=>"text/html"}, "Internal Server Error"]
31
- end
32
-
33
- [controller.status, controller.headers, controller.body]
34
- end
35
- end
36
- end
37
- end
data/lib/merb/request.rb DELETED
@@ -1,465 +0,0 @@
1
- module Merb
2
- class Request
3
- attr_accessor :env, :session
4
-
5
- # by setting these to false, auto-parsing is disabled; this way you can do your own parsing instead
6
- cattr_accessor :parse_multipart_params, :parse_json_params, :parse_xml_params
7
- self.parse_multipart_params = true
8
- self.parse_json_params = true
9
- self.parse_xml_params = true
10
-
11
- def initialize(http_request)
12
- @env = http_request.params
13
- @body = http_request.body
14
- end
15
-
16
- METHODS = %w{get post put delete head}
17
-
18
- def method
19
- @method ||= begin
20
- request_method = @env['REQUEST_METHOD'].downcase.to_sym
21
- case request_method
22
- when :get, :head, :put, :delete
23
- request_method
24
- when :post
25
- if self.class.parse_multipart_params
26
- m = body_and_query_params.merge(multipart_params)['_method']
27
- else
28
- m = body_and_query_params['_method']
29
- end
30
- m.downcase! if m
31
- METHODS.include?(m) ? m.to_sym : :post
32
- else
33
- raise "Unknown REQUEST_METHOD: #{@env['REQUEST_METHOD']}"
34
- end
35
- end
36
- end
37
-
38
- # create predicate methods for querying the REQUEST_METHOD
39
- # get? post? head? put? etc
40
- METHODS.each do |m|
41
- define_method("#{m}?") { method == m.to_sym }
42
- end
43
-
44
- private
45
-
46
- # FIXME: symbolize_keys on params is a potential problem. symbols are
47
- # not garbage collected so a malicious user could send many large query
48
- # keys to Merb forcing it to eat up memeory.
49
-
50
- # A hash of parameters passed from the URL like ?blah=hello
51
- def query_params
52
- @query_params ||= self.class.query_parse(query_string || '')
53
- end
54
-
55
- # A hash of parameters passed in the body of the request.
56
- #
57
- # Ajax calls from prototype.js and other libraries
58
- # pass content this way.
59
- def body_params
60
- @body_params ||= begin
61
- if content_type && content_type.match(Merb::Const::FORM_URL_ENCODED_REGEXP) # or content_type.nil?
62
- self.class.query_parse(raw_post)
63
- end
64
- end
65
- end
66
-
67
- def body_and_query_params
68
- # ^-- FIXME a better name for this method
69
- @body_and_query_params ||= begin
70
- h = query_params
71
- h.merge!(body_params) if body_params
72
- h.to_mash
73
- end
74
- end
75
-
76
- def multipart_params
77
- @multipart_params ||=
78
- begin
79
- if Merb::Const::MULTIPART_REGEXP =~ content_type
80
- if @body.size <= 0
81
- {}
82
- else
83
- self.class.parse_multipart(@body, $1, content_length)
84
- end
85
- else
86
- {}
87
- end
88
- rescue ControllerExceptions::MultiPartParseError => e
89
- @multipart_params = {}
90
- raise e
91
- end
92
- end
93
-
94
- def json_params
95
- @json_params ||= begin
96
- if Merb::Const::JSON_MIME_TYPE_REGEXP.match(content_type)
97
- JSON.parse(raw_post)
98
- end
99
- end
100
- end
101
-
102
- def xml_params
103
- @xml_params ||= begin
104
- if Merb::Const::XML_MIME_TYPE_REGEXP.match(content_type)
105
- Hash.from_xml(raw_post) rescue Mash.new
106
- end
107
- end
108
- end
109
-
110
- public
111
-
112
- def params
113
- @params ||= begin
114
- h = body_and_query_params.merge(route_params)
115
- h.merge!(multipart_params) if self.class.parse_multipart_params && multipart_params
116
- h.merge!(json_params) if self.class.parse_json_params && json_params
117
- h.merge!(xml_params) if self.class.parse_xml_params && xml_params
118
- h
119
- end
120
- end
121
-
122
- def cookies
123
- @cookies ||= self.class.query_parse(@env[Merb::Const::HTTP_COOKIE], ';,')
124
- end
125
-
126
- def route
127
- @route ||= Merb::Router.routes[route_index]
128
- end
129
-
130
- # returns two objects, route_index and route_params
131
- def route_match
132
- @route_match ||= Merb::Router.match(self, body_and_query_params)
133
- end
134
- private :route_match
135
-
136
- def route_index
137
- route_match.first
138
- end
139
-
140
- def route_params
141
- route_match.last
142
- end
143
-
144
- def controller_name
145
- if route_params[:namespace]
146
- route_params[:namespace] + '/' + route_params[:controller]
147
- else
148
- route_params[:controller]
149
- end
150
- end
151
-
152
- def controller_class
153
- begin
154
- cnt = controller_name.to_const_string
155
- rescue ::String::InvalidPathConversion
156
- raise ControllerExceptions::NotFound
157
- end
158
- if !Controller._subclasses.include?(cnt)
159
- raise ControllerExceptions::NotFound, "Controller '#{cnt}' not found"
160
- end
161
-
162
- begin
163
- if cnt == "Application"
164
- raise ControllerExceptions::NotFound, "The 'Application' controller has no public actions"
165
- end
166
- return Object.full_const_get(cnt)
167
- rescue NameError
168
- raise ControllerExceptions::NotFound
169
- end
170
- end
171
-
172
- def action
173
- route_params[:action]
174
- end
175
-
176
- def raw_post
177
- @body.rewind
178
- res = @body.read
179
- @body.rewind
180
- res
181
- end
182
-
183
- # Returns true if the request is an Ajax request.
184
- #
185
- # Also aliased as the more memorable ajax? and xhr?.
186
- def xml_http_request?
187
- not /XMLHttpRequest/i.match(@env['HTTP_X_REQUESTED_WITH']).nil?
188
- end
189
- alias xhr? :xml_http_request?
190
- alias ajax? :xml_http_request?
191
-
192
- # returns the remote IP address if it can find it.
193
- def remote_ip
194
- return @env['HTTP_CLIENT_IP'] if @env.include?('HTTP_CLIENT_IP')
195
-
196
- if @env.include?(Merb::Const::HTTP_X_FORWARDED_FOR) then
197
- remote_ips = @env[Merb::Const::HTTP_X_FORWARDED_FOR].split(',').reject do |ip|
198
- ip =~ /^unknown$|^(127|10|172\.16|192\.168)\./i
199
- end
200
-
201
- return remote_ips.first.strip unless remote_ips.empty?
202
- end
203
-
204
- return @env[Merb::Const::REMOTE_ADDR]
205
- end
206
-
207
- # returns either 'https://' or 'http://' depending on
208
- # the HTTPS header
209
- def protocol
210
- ssl? ? 'https://' : 'http://'
211
- end
212
-
213
- # returns true if the request is an SSL request
214
- def ssl?
215
- @env['HTTPS'] == 'on' || @env['HTTP_X_FORWARDED_PROTO'] == 'https'
216
- end
217
-
218
- # returns the request HTTP_REFERER.
219
- def referer
220
- @env['HTTP_REFERER']
221
- end
222
-
223
- # returns he request uri.
224
- def uri
225
- @env['REQUEST_URI']
226
- end
227
-
228
- def user_agent
229
- @env['HTTP_USER_AGENT']
230
- end
231
-
232
- def server_name
233
- @env['SERVER_NAME']
234
- end
235
-
236
- def accept_encoding
237
- @env['HTTP_ACCEPT_ENCODING']
238
- end
239
-
240
- def script_name
241
- @env['SCRIPT_NAME']
242
- end
243
-
244
- def cache_control
245
- @env['HTTP_CACHE_CONTROL']
246
- end
247
-
248
- def accept_language
249
- @env['HTTP_ACCEPT_LANGUAGE']
250
- end
251
-
252
- def host
253
- @env['HTTP_HOST']
254
- end
255
-
256
- def server_software
257
- @env['SERVER_SOFTWARE']
258
- end
259
-
260
- def keep_alive
261
- @env['HTTP_KEEP_ALIVE']
262
- end
263
-
264
- def accept_charset
265
- @env['HTTP_ACCEPT_CHARSET']
266
- end
267
-
268
- def version
269
- @env['HTTP_VERSION']
270
- end
271
-
272
- def gateway
273
- @env['GATEWAY_INTERFACE']
274
- end
275
-
276
- def accept
277
- @env['HTTP_ACCEPT'].blank? ? "*/*" : @env['HTTP_ACCEPT']
278
- end
279
-
280
- def connection
281
- @env['HTTP_CONNECTION']
282
- end
283
-
284
- def query_string
285
- @env['QUERY_STRING']
286
- end
287
-
288
- def content_type
289
- @env['CONTENT_TYPE']
290
- end
291
-
292
- def content_length
293
- @content_length ||= @env[Merb::Const::CONTENT_LENGTH].to_i
294
- end
295
-
296
- # Returns the uri without the query string. Strips trailing '/' and reduces
297
- # duplicate '/' to a single '/'
298
- def path
299
- path = (uri ? uri.split('?').first : '').sub(/\/+/, '/')
300
- path = path[0..-2] if (path[-1] == ?/) && path.size > 1
301
- path
302
- end
303
-
304
- # returns the PATH_INFO
305
- def path_info
306
- @path_info ||= Mongrel::HttpRequest.unescape(@env['PATH_INFO'])
307
- end
308
-
309
- # returns the port the server is running on
310
- def port
311
- @env['SERVER_PORT'].to_i
312
- end
313
-
314
- # returns the full hostname including port
315
- def host
316
- @env['HTTP_X_FORWARDED_HOST'] || @env['HTTP_HOST']
317
- end
318
-
319
- # returns an array of all the subdomain parts of the host.
320
- def subdomains(tld_length = 1)
321
- parts = host.split('.')
322
- parts[0..-(tld_length+2)]
323
- end
324
-
325
- # returns the full domain name without the port number.
326
- def domain(tld_length = 1)
327
- host.split('.').last(1 + tld_length).join('.').sub(/:\d+$/,'')
328
- end
329
-
330
- class << self
331
- # Escapes +s+ for use in a URL.
332
- #
333
- # ==== Parameter
334
- #
335
- # +s+ - String to URL escape.
336
- #
337
- def escape(s)
338
- s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n) {
339
- '%'+$1.unpack('H2'*$1.size).join('%').upcase
340
- }.tr(' ', '+')
341
- end
342
-
343
- # Unescapes a string (i.e., reverse URL escaping).
344
- #
345
- # ==== Parameter
346
- #
347
- # +s+ - String to unescape.
348
- #
349
- def unescape(s)
350
- s.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n){
351
- [$1.delete('%')].pack('H*')
352
- }
353
- end
354
-
355
- # parses a query string or the payload of a POST
356
- # request into the params hash. So for example:
357
- # /foo?bar=nik&post[title]=heya&post[body]=whatever
358
- # parses into:
359
- # {:bar => 'nik', :post => {:title => 'heya', :body => 'whatever'}}
360
- def query_parse(qs, d = '&;')
361
- (qs||'').split(/[#{d}] */n).inject({}) { |h,p|
362
- normalize_params(h, *unescape(p).split('=',2))
363
- }.to_mash
364
- end
365
-
366
- NAME_REGEX = /Content-Disposition:.* name="?([^\";]*)"?/ni.freeze
367
- CONTENT_TYPE_REGEX = /Content-Type: (.*)\r\n/ni.freeze
368
- FILENAME_REGEX = /Content-Disposition:.* filename="?([^\";]*)"?/ni.freeze
369
- CRLF = "\r\n".freeze
370
- EOL = CRLF
371
- def parse_multipart(request,boundary, content_length)
372
- boundary = "--#{boundary}"
373
- paramhsh = {}
374
- buf = ""
375
- input = request
376
- input.binmode if defined? input.binmode
377
- boundary_size = boundary.size + EOL.size
378
- bufsize = 16384
379
- content_length -= boundary_size
380
- status = input.read(boundary_size)
381
- raise ControllerExceptions::MultiPartParseError, "bad content body:\n'#{status}' should == '#{boundary + EOL}'" unless status == boundary + EOL
382
- rx = /(?:#{EOL})?#{Regexp.quote(boundary,'n')}(#{EOL}|--)/
383
- loop {
384
- head = nil
385
- body = ''
386
- filename = content_type = name = nil
387
- read_size = 0
388
- until head && buf =~ rx
389
- i = buf.index("\r\n\r\n")
390
- if( i == nil && read_size == 0 && content_length == 0 )
391
- content_length = -1
392
- break
393
- end
394
- if !head && i
395
- head = buf.slice!(0, i+2) # First \r\n
396
- buf.slice!(0, 2) # Second \r\n
397
- filename = head[FILENAME_REGEX, 1]
398
- content_type = head[CONTENT_TYPE_REGEX, 1]
399
- name = head[NAME_REGEX, 1]
400
-
401
- if filename && !filename.empty?
402
- body = Tempfile.new(:Merb)
403
- body.binmode if defined? body.binmode
404
- end
405
- next
406
- end
407
-
408
- # Save the read body part.
409
- if head && (boundary_size+4 < buf.size)
410
- body << buf.slice!(0, buf.size - (boundary_size+4))
411
- end
412
-
413
- read_size = bufsize < content_length ? bufsize : content_length
414
- if( read_size > 0 )
415
- c = input.read(read_size)
416
- raise ControllerExceptions::MultiPartParseError, "bad content body" if c.nil? || c.empty?
417
- buf << c
418
- content_length -= c.size
419
- end
420
- end
421
-
422
- # Save the rest.
423
- if i = buf.index(rx)
424
- body << buf.slice!(0, i)
425
- buf.slice!(0, boundary_size+2)
426
-
427
- content_length = -1 if $1 == "--"
428
- end
429
-
430
- if filename && !filename.empty?
431
- body.rewind
432
- data = {
433
- :filename => File.basename(filename),
434
- :content_type => content_type,
435
- :tempfile => body,
436
- :size => File.size(body.path)
437
- }
438
- else
439
- data = body
440
- end
441
- paramhsh = normalize_params(paramhsh,name,data)
442
- break if buf.empty? || content_length == -1
443
- }
444
- paramhsh
445
- end
446
-
447
- def normalize_params(parms, name, val=nil)
448
- name =~ %r([\[\]]*([^\[\]]+)\]*)
449
- key = $1 || ''
450
- after = $' || ''
451
-
452
- if after == ""
453
- parms[key] = val
454
- elsif after == "[]"
455
- (parms[key] ||= []) << val
456
- else
457
- parms[key] ||= {}
458
- parms[key] = normalize_params(parms[key], after, val)
459
- end
460
- parms
461
- end
462
- end
463
- end
464
- end
465
-