mongrel 1.0.1 → 1.0.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 (263) hide show
  1. data.tar.gz.sig +2 -0
  2. data/CHANGELOG +2 -0
  3. data/Manifest +68 -0
  4. data/bin/mongrel_rails +55 -22
  5. data/examples/camping/README +3 -0
  6. data/examples/httpd.conf +474 -0
  7. data/examples/mime.yaml +3 -0
  8. data/examples/mongrel.conf +9 -0
  9. data/examples/monitrc +57 -0
  10. data/ext/http11/http11.c +25 -12
  11. data/ext/http11/http11_parser.c +456 -331
  12. data/ext/http11/http11_parser.h +1 -0
  13. data/ext/http11/http11_parser.java.rl +170 -0
  14. data/ext/http11/http11_parser.rl +8 -48
  15. data/ext/http11/http11_parser_common.rl +54 -0
  16. data/ext/http11/tst.h +2 -2
  17. data/ext/http11/tst_cleanup.c +0 -1
  18. data/ext/http11/tst_insert.c +29 -3
  19. data/ext/http11/tst_search.c +60 -55
  20. data/lib/mongrel.rb +68 -53
  21. data/lib/mongrel/cgi.rb +3 -3
  22. data/lib/mongrel/command.rb +1 -1
  23. data/lib/mongrel/configurator.rb +41 -31
  24. data/lib/mongrel/debug.rb +2 -5
  25. data/lib/mongrel/handlers.rb +23 -9
  26. data/lib/mongrel/mime_types.yml +2 -1
  27. data/lib/mongrel/rails.rb +7 -15
  28. data/mongrel-public_cert.pem +20 -0
  29. data/mongrel.gemspec +211 -0
  30. data/test/jruby_socket.rb +39 -0
  31. data/test/test_cgi_wrapper.rb +26 -0
  32. data/test/test_command.rb +1 -4
  33. data/test/test_conditional.rb +6 -18
  34. data/test/test_configurator.rb +5 -8
  35. data/test/test_debug.rb +3 -11
  36. data/test/test_handlers.rb +8 -10
  37. data/test/test_http11.rb +24 -5
  38. data/test/test_redirect_handler.rb +2 -6
  39. data/test/test_request_progress.rb +5 -9
  40. data/test/test_response.rb +24 -3
  41. data/test/test_stats.rb +1 -3
  42. data/test/test_uriclassifier.rb +170 -81
  43. data/test/test_ws.rb +25 -24
  44. data/test/testhelp.rb +26 -3
  45. data/tools/trickletest.rb +2 -2
  46. metadata +138 -333
  47. metadata.gz.sig +0 -0
  48. data/Rakefile +0 -117
  49. data/doc/rdoc/classes/IO.html +0 -170
  50. data/doc/rdoc/classes/IO.src/M000003.html +0 -19
  51. data/doc/rdoc/classes/IO.src/M000004.html +0 -19
  52. data/doc/rdoc/classes/Kernel.html +0 -159
  53. data/doc/rdoc/classes/Kernel.src/M000012.html +0 -19
  54. data/doc/rdoc/classes/Kernel.src/M000013.html +0 -23
  55. data/doc/rdoc/classes/Mongrel.html +0 -204
  56. data/doc/rdoc/classes/Mongrel/CGIWrapper.html +0 -404
  57. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000115.html +0 -25
  58. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000116.html +0 -47
  59. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000117.html +0 -34
  60. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000118.html +0 -32
  61. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000119.html +0 -25
  62. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000120.html +0 -18
  63. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000121.html +0 -18
  64. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000122.html +0 -18
  65. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000123.html +0 -19
  66. data/doc/rdoc/classes/Mongrel/Camping.html +0 -177
  67. data/doc/rdoc/classes/Mongrel/Camping.src/M000041.html +0 -22
  68. data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.html +0 -184
  69. data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/M000042.html +0 -20
  70. data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/M000043.html +0 -58
  71. data/doc/rdoc/classes/Mongrel/Command.html +0 -132
  72. data/doc/rdoc/classes/Mongrel/Command/Base.html +0 -384
  73. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000018.html +0 -24
  74. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000019.html +0 -42
  75. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000020.html +0 -18
  76. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000021.html +0 -18
  77. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000022.html +0 -18
  78. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000023.html +0 -18
  79. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000024.html +0 -22
  80. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000025.html +0 -18
  81. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000026.html +0 -18
  82. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000027.html +0 -18
  83. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000028.html +0 -24
  84. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000029.html +0 -24
  85. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000030.html +0 -18
  86. data/doc/rdoc/classes/Mongrel/Command/Registry.html +0 -192
  87. data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000031.html +0 -20
  88. data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000032.html +0 -29
  89. data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000033.html +0 -58
  90. data/doc/rdoc/classes/Mongrel/Configurator.html +0 -716
  91. data/doc/rdoc/classes/Mongrel/Configurator.src/M000093.html +0 -27
  92. data/doc/rdoc/classes/Mongrel/Configurator.src/M000094.html +0 -31
  93. data/doc/rdoc/classes/Mongrel/Configurator.src/M000095.html +0 -18
  94. data/doc/rdoc/classes/Mongrel/Configurator.src/M000096.html +0 -21
  95. data/doc/rdoc/classes/Mongrel/Configurator.src/M000097.html +0 -20
  96. data/doc/rdoc/classes/Mongrel/Configurator.src/M000098.html +0 -23
  97. data/doc/rdoc/classes/Mongrel/Configurator.src/M000099.html +0 -18
  98. data/doc/rdoc/classes/Mongrel/Configurator.src/M000100.html +0 -38
  99. data/doc/rdoc/classes/Mongrel/Configurator.src/M000101.html +0 -19
  100. data/doc/rdoc/classes/Mongrel/Configurator.src/M000102.html +0 -39
  101. data/doc/rdoc/classes/Mongrel/Configurator.src/M000103.html +0 -33
  102. data/doc/rdoc/classes/Mongrel/Configurator.src/M000104.html +0 -18
  103. data/doc/rdoc/classes/Mongrel/Configurator.src/M000105.html +0 -24
  104. data/doc/rdoc/classes/Mongrel/Configurator.src/M000106.html +0 -19
  105. data/doc/rdoc/classes/Mongrel/Configurator.src/M000107.html +0 -18
  106. data/doc/rdoc/classes/Mongrel/Configurator.src/M000108.html +0 -22
  107. data/doc/rdoc/classes/Mongrel/Configurator.src/M000109.html +0 -22
  108. data/doc/rdoc/classes/Mongrel/Configurator.src/M000110.html +0 -18
  109. data/doc/rdoc/classes/Mongrel/Configurator.src/M000111.html +0 -34
  110. data/doc/rdoc/classes/Mongrel/Configurator.src/M000112.html +0 -18
  111. data/doc/rdoc/classes/Mongrel/Configurator.src/M000113.html +0 -36
  112. data/doc/rdoc/classes/Mongrel/Configurator.src/M000114.html +0 -18
  113. data/doc/rdoc/classes/Mongrel/Const.html +0 -337
  114. data/doc/rdoc/classes/Mongrel/DeflateFilter.html +0 -188
  115. data/doc/rdoc/classes/Mongrel/DeflateFilter.src/M000124.html +0 -19
  116. data/doc/rdoc/classes/Mongrel/DeflateFilter.src/M000125.html +0 -23
  117. data/doc/rdoc/classes/Mongrel/DirHandler.html +0 -303
  118. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000051.html +0 -21
  119. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000052.html +0 -42
  120. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000053.html +0 -38
  121. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000054.html +0 -65
  122. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000055.html +0 -39
  123. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000056.html +0 -18
  124. data/doc/rdoc/classes/Mongrel/Error404Handler.html +0 -171
  125. data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000126.html +0 -18
  126. data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000127.html +0 -18
  127. data/doc/rdoc/classes/Mongrel/HeaderOut.html +0 -190
  128. data/doc/rdoc/classes/Mongrel/HeaderOut.src/M000066.html +0 -21
  129. data/doc/rdoc/classes/Mongrel/HeaderOut.src/M000067.html +0 -21
  130. data/doc/rdoc/classes/Mongrel/HttpHandler.html +0 -215
  131. data/doc/rdoc/classes/Mongrel/HttpHandler.src/M000072.html +0 -17
  132. data/doc/rdoc/classes/Mongrel/HttpHandler.src/M000073.html +0 -17
  133. data/doc/rdoc/classes/Mongrel/HttpHandler.src/M000074.html +0 -17
  134. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.html +0 -210
  135. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/M000014.html +0 -17
  136. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/M000015.html +0 -17
  137. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/M000016.html +0 -19
  138. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/M000017.html +0 -17
  139. data/doc/rdoc/classes/Mongrel/HttpParams.html +0 -131
  140. data/doc/rdoc/classes/Mongrel/HttpParser.html +0 -278
  141. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000044.html +0 -28
  142. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000045.html +0 -29
  143. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000046.html +0 -29
  144. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000047.html +0 -59
  145. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000048.html +0 -27
  146. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000049.html +0 -27
  147. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000050.html +0 -28
  148. data/doc/rdoc/classes/Mongrel/HttpParserError.html +0 -111
  149. data/doc/rdoc/classes/Mongrel/HttpRequest.html +0 -284
  150. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000133.html +0 -50
  151. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000134.html +0 -41
  152. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000135.html +0 -29
  153. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000136.html +0 -20
  154. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000137.html +0 -20
  155. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000138.html +0 -32
  156. data/doc/rdoc/classes/Mongrel/HttpResponse.html +0 -443
  157. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000075.html +0 -25
  158. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000076.html +0 -20
  159. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000077.html +0 -26
  160. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000078.html +0 -22
  161. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000079.html +0 -22
  162. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000080.html +0 -22
  163. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000081.html +0 -31
  164. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000082.html +0 -21
  165. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000083.html +0 -20
  166. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000084.html +0 -20
  167. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000085.html +0 -20
  168. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000086.html +0 -18
  169. data/doc/rdoc/classes/Mongrel/HttpServer.html +0 -402
  170. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000057.html +0 -25
  171. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000058.html +0 -100
  172. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000059.html +0 -32
  173. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000060.html +0 -21
  174. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000061.html +0 -29
  175. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000062.html +0 -65
  176. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000063.html +0 -34
  177. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000064.html +0 -18
  178. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000065.html +0 -22
  179. data/doc/rdoc/classes/Mongrel/Rails.html +0 -112
  180. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.html +0 -225
  181. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/M000034.html +0 -37
  182. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/M000035.html +0 -25
  183. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/M000036.html +0 -26
  184. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.html +0 -263
  185. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000037.html +0 -23
  186. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000038.html +0 -56
  187. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000039.html +0 -20
  188. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000040.html +0 -25
  189. data/doc/rdoc/classes/Mongrel/RedirectHandler.html +0 -187
  190. data/doc/rdoc/classes/Mongrel/RedirectHandler.src/M000131.html +0 -22
  191. data/doc/rdoc/classes/Mongrel/RedirectHandler.src/M000132.html +0 -27
  192. data/doc/rdoc/classes/Mongrel/StatisticsFilter.html +0 -211
  193. data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/M000128.html +0 -24
  194. data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/M000129.html +0 -24
  195. data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/M000130.html +0 -18
  196. data/doc/rdoc/classes/Mongrel/Stats.html +0 -309
  197. data/doc/rdoc/classes/Mongrel/Stats.src/M000139.html +0 -19
  198. data/doc/rdoc/classes/Mongrel/Stats.src/M000140.html +0 -23
  199. data/doc/rdoc/classes/Mongrel/Stats.src/M000141.html +0 -26
  200. data/doc/rdoc/classes/Mongrel/Stats.src/M000142.html +0 -18
  201. data/doc/rdoc/classes/Mongrel/Stats.src/M000143.html +0 -18
  202. data/doc/rdoc/classes/Mongrel/Stats.src/M000144.html +0 -18
  203. data/doc/rdoc/classes/Mongrel/Stats.src/M000145.html +0 -23
  204. data/doc/rdoc/classes/Mongrel/Stats.src/M000146.html +0 -20
  205. data/doc/rdoc/classes/Mongrel/StatusHandler.html +0 -194
  206. data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000068.html +0 -18
  207. data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000069.html +0 -24
  208. data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000070.html +0 -42
  209. data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000071.html +0 -20
  210. data/doc/rdoc/classes/Mongrel/StopServer.html +0 -117
  211. data/doc/rdoc/classes/Mongrel/TimeoutError.html +0 -117
  212. data/doc/rdoc/classes/Mongrel/URIClassifier.html +0 -317
  213. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000087.html +0 -18
  214. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000088.html +0 -18
  215. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000089.html +0 -39
  216. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000090.html +0 -51
  217. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000091.html +0 -36
  218. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000092.html +0 -83
  219. data/doc/rdoc/classes/MongrelDbg.html +0 -209
  220. data/doc/rdoc/classes/MongrelDbg.src/M000007.html +0 -24
  221. data/doc/rdoc/classes/MongrelDbg.src/M000008.html +0 -20
  222. data/doc/rdoc/classes/MongrelDbg.src/M000009.html +0 -22
  223. data/doc/rdoc/classes/MongrelDbg.src/M000010.html +0 -21
  224. data/doc/rdoc/classes/MongrelDbg.src/M000011.html +0 -18
  225. data/doc/rdoc/classes/Mutex.html +0 -158
  226. data/doc/rdoc/classes/Mutex.src/M000001.html +0 -24
  227. data/doc/rdoc/classes/Mutex.src/M000002.html +0 -32
  228. data/doc/rdoc/classes/RequestLog.html +0 -115
  229. data/doc/rdoc/classes/RequestLog/Access.html +0 -151
  230. data/doc/rdoc/classes/RequestLog/Access.src/M000147.html +0 -19
  231. data/doc/rdoc/classes/RequestLog/Files.html +0 -144
  232. data/doc/rdoc/classes/RequestLog/Files.src/M000148.html +0 -19
  233. data/doc/rdoc/classes/RequestLog/Objects.html +0 -150
  234. data/doc/rdoc/classes/RequestLog/Objects.src/M000150.html +0 -51
  235. data/doc/rdoc/classes/RequestLog/Params.html +0 -144
  236. data/doc/rdoc/classes/RequestLog/Params.src/M000151.html +0 -19
  237. data/doc/rdoc/classes/RequestLog/Threads.html +0 -144
  238. data/doc/rdoc/classes/RequestLog/Threads.src/M000149.html +0 -34
  239. data/doc/rdoc/classes/TCPServer.html +0 -173
  240. data/doc/rdoc/classes/TCPServer.src/M000005.html +0 -19
  241. data/doc/rdoc/created.rid +0 -1
  242. data/doc/rdoc/files/COPYING.html +0 -168
  243. data/doc/rdoc/files/LICENSE.html +0 -168
  244. data/doc/rdoc/files/README.html +0 -213
  245. data/doc/rdoc/files/ext/http11/http11_c.html +0 -101
  246. data/doc/rdoc/files/lib/mongrel/camping_rb.html +0 -120
  247. data/doc/rdoc/files/lib/mongrel/cgi_rb.html +0 -120
  248. data/doc/rdoc/files/lib/mongrel/command_rb.html +0 -123
  249. data/doc/rdoc/files/lib/mongrel/configurator_rb.html +0 -111
  250. data/doc/rdoc/files/lib/mongrel/debug_rb.html +0 -122
  251. data/doc/rdoc/files/lib/mongrel/handlers_rb.html +0 -122
  252. data/doc/rdoc/files/lib/mongrel/init_rb.html +0 -121
  253. data/doc/rdoc/files/lib/mongrel/rails_rb.html +0 -123
  254. data/doc/rdoc/files/lib/mongrel/stats_rb.html +0 -113
  255. data/doc/rdoc/files/lib/mongrel/tcphack_rb.html +0 -113
  256. data/doc/rdoc/files/lib/mongrel_rb.html +0 -135
  257. data/doc/rdoc/files/lib/mutex_fix_rb.html +0 -108
  258. data/doc/rdoc/fr_class_index.html +0 -68
  259. data/doc/rdoc/fr_file_index.html +0 -42
  260. data/doc/rdoc/fr_method_index.html +0 -177
  261. data/doc/rdoc/index.html +0 -24
  262. data/doc/rdoc/rdoc-style.css +0 -208
  263. data/tools/rakehelp.rb +0 -117
@@ -7,17 +7,14 @@
7
7
  require 'logger'
8
8
  require 'set'
9
9
  require 'socket'
10
-
11
-
12
-
13
- $mongrel_debugging=true
10
+ require 'fileutils'
14
11
 
15
12
  module MongrelDbg
16
13
  SETTINGS = { :tracing => {}}
17
14
  LOGGING = { }
18
15
 
19
16
  def MongrelDbg::configure(log_dir = File.join("log","mongrel_debug"))
20
- Dir.mkdir(log_dir) if not File.exist?(log_dir)
17
+ FileUtils.mkdir_p(log_dir)
21
18
  @log_dir = log_dir
22
19
  $objects_out=open(File.join("log","mongrel_debug","objects.log"),"w")
23
20
  $objects_out.puts "run,classname,last,count,delta,lenmean,lensd,lenmax"
@@ -98,6 +98,10 @@ module Mongrel
98
98
  # that the final expanded path includes the root path. If it doesn't
99
99
  # than it simply gives a 404.
100
100
  #
101
+ # If you pass nil as the root path, it will not check any locations or
102
+ # expand any paths. This lets you serve files from multiple directories
103
+ # on win32.
104
+ #
101
105
  # The default content type is "text/plain; charset=ISO-8859-1" but you
102
106
  # can change it anything you want using the DirHandler.default_content_type
103
107
  # attribute.
@@ -110,9 +114,9 @@ module Mongrel
110
114
 
111
115
  ONLY_HEAD_GET="Only HEAD and GET allowed.".freeze
112
116
 
113
- # You give it the path to the directory root and an (optional)
117
+ # You give it the path to the directory root and and optional listing_allowed and index_html
114
118
  def initialize(path, listing_allowed=true, index_html="index.html")
115
- @path = File.expand_path(path)
119
+ @path = File.expand_path(path) if path
116
120
  @listing_allowed=listing_allowed
117
121
  @index_html = index_html
118
122
  @default_content_type = "application/octet-stream".freeze
@@ -120,7 +124,13 @@ module Mongrel
120
124
 
121
125
  # Checks if the given path can be served and returns the full path (or nil if not).
122
126
  def can_serve(path_info)
123
- req_path = File.expand_path(File.join(@path,HttpRequest.unescape(path_info)), @path)
127
+
128
+ req_path = HttpRequest.unescape(path_info)
129
+ if @path
130
+ req_path = File.expand_path(File.join(@path, path_info), @path)
131
+ else
132
+ req_path = File.expand_path(req_path)
133
+ end
124
134
 
125
135
  if req_path.index(@path) == 0 and File.exist? req_path
126
136
  # it exists and it's in the right location
@@ -208,11 +218,14 @@ module Mongrel
208
218
  if same_response
209
219
  response.start(304) {}
210
220
  else
211
- # first we setup the headers and status then we do a very fast send on the socket directly
212
- response.status = 200
221
+
222
+ # First we setup the headers and status then we do a very fast send on the socket directly
223
+
224
+ # Support custom responses except 404, which is the default. A little awkward.
225
+ response.status = 200 if response.status == 404
213
226
  header[Const::LAST_MODIFIED] = mtime.httpdate
214
227
 
215
- # set the mime type from our map based on the ending
228
+ # Set the mime type from our map based on the ending
216
229
  dot_at = req_path.rindex('.')
217
230
  if dot_at
218
231
  header[Const::CONTENT_TYPE] = MIME_TYPES[req_path[dot_at .. -1]] || @default_content_type
@@ -374,6 +387,7 @@ module Mongrel
374
387
  results << table("settings", [
375
388
  ["host",listener.host],
376
389
  ["port",listener.port],
390
+ ["throttle",listener.throttle],
377
391
  ["timeout",listener.timeout],
378
392
  ["workers max",listener.num_processors],
379
393
  ])
@@ -384,8 +398,8 @@ module Mongrel
384
398
  end
385
399
 
386
400
  results << "<h2>Registered Handlers</h2>"
387
- uris = listener.classifier.handler_map
388
- results << table("handlers", uris.map {|uri,handlers|
401
+ handler_map = listener.classifier.handler_map
402
+ results << table("handlers", handler_map.map {|uri,handlers|
389
403
  [uri,
390
404
  "<pre>" +
391
405
  handlers.map {|h| h.class.to_s }.join("\n") +
@@ -430,7 +444,7 @@ module Mongrel
430
444
 
431
445
  def initialize(pattern, replacement = nil, &block)
432
446
  unless replacement or block
433
- @replacement = pattern
447
+ @pattern, @replacement = nil, pattern
434
448
  else
435
449
  @pattern, @replacement, @block = pattern, replacement, block
436
450
  end
@@ -18,7 +18,7 @@
18
18
  .asp: text/asp
19
19
  .asr: video/x-ms-asf
20
20
  .asx: video/x-ms-asf
21
- .atom: application/xml+atom
21
+ .atom: application/atom+xml
22
22
  .au: audio/basic
23
23
  .au: audio/x-au
24
24
  .avi: video/avi
@@ -605,6 +605,7 @@
605
605
  .xpix: application/x-vnd.ls-xpix
606
606
  .xpm: image/x-xpixmap
607
607
  .xpm: image/xpm
608
+ .xsl: application/xslt+xml
608
609
  .xsr: video/x-amt-showrun
609
610
  .xwd: image/x-xwd
610
611
  .xwd: image/x-xwindowdump
@@ -37,7 +37,6 @@ module Mongrel
37
37
  def initialize(dir, mime_map = {})
38
38
  @files = Mongrel::DirHandler.new(dir,false)
39
39
  @guard = Mutex.new
40
- @tick = Time.now
41
40
 
42
41
  # Register the requested MIME types
43
42
  mime_map.each {|k,v| Mongrel::DirHandler::add_mime_type(k,v) }
@@ -49,12 +48,13 @@ module Mongrel
49
48
  # * If it exists at PATH_INFO+".html" exists then serve that.
50
49
  # * Finally, construct a Mongrel::CGIWrapper and run Dispatcher.dispatch to have Rails go.
51
50
  def process(request, response)
52
- if response.socket.closed?
53
- return
54
- end
55
-
51
+ return if response.socket.closed?
52
+
56
53
  path_info = request.params[Mongrel::Const::PATH_INFO]
57
- page_cached = path_info + ActionController::Base.page_cache_extension
54
+ rest_operator = request.params[Mongrel::Const::REQUEST_URI][/^#{Regexp.escape path_info}(;[^\?]+)/, 1].to_s
55
+ path_info.chomp!("/")
56
+
57
+ page_cached = path_info + rest_operator + ActionController::Base.page_cache_extension
58
58
  get_or_head = @@file_only_methods.include? request.params[Mongrel::Const::REQUEST_METHOD]
59
59
 
60
60
  if get_or_head and @files.can_serve(path_info)
@@ -71,10 +71,8 @@ module Mongrel
71
71
  # We don't want the output to be really final until we're out of the lock
72
72
  cgi.default_really_final = false
73
73
 
74
- log_threads_waiting_for(@active_request_path || request.params["PATH_INFO"]) if $mongrel_debug_client
75
-
76
74
  @guard.synchronize {
77
- @active_request_path = request.params["PATH_INFO"]
75
+ @active_request_path = request.params[Mongrel::Const::PATH_INFO]
78
76
  Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)
79
77
  @active_request_path = nil
80
78
  }
@@ -90,12 +88,6 @@ module Mongrel
90
88
  end
91
89
  end
92
90
 
93
- def log_threads_waiting_for(event)
94
- if Time.now - @tick > 10
95
- @tick = Time.now
96
- end
97
- end
98
-
99
91
  # Does the internal reload for Rails. It might work for most cases, but
100
92
  # sometimes you get exceptions. In that case just do a real restart.
101
93
  def reload!
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDUDCCAjigAwIBAgIBADANBgkqhkiG9w0BAQUFADBOMRwwGgYDVQQDDBNtb25n
3
+ cmVsLWRldmVsb3BtZW50MRkwFwYKCZImiZPyLGQBGRYJcnVieWZvcmdlMRMwEQYK
4
+ CZImiZPyLGQBGRYDb3JnMB4XDTA3MDkxNjEwMzI0OVoXDTA4MDkxNTEwMzI0OVow
5
+ TjEcMBoGA1UEAwwTbW9uZ3JlbC1kZXZlbG9wbWVudDEZMBcGCgmSJomT8ixkARkW
6
+ CXJ1Ynlmb3JnZTETMBEGCgmSJomT8ixkARkWA29yZzCCASIwDQYJKoZIhvcNAQEB
7
+ BQADggEPADCCAQoCggEBAMb9v3B01eOHk3FyypbQgKXzJplUE5P6dXoG+xpPm0Lv
8
+ P7BQmeMncOwqQ7zXpVQU+lTpXtQFTsOE3vL7KnhQFJKGvUAkbh24VFyopu1I0yqF
9
+ mGu4nRqNXGXVj8TvLSj4S1WpSRLAa0acLPNyKhGmoV9+crqQypSjM6XKjBeppifo
10
+ 4eBmWGjiJEYMIJBvJZPJ4rAVDDA8C6CM1m3gMBGNh8ELDhU8HI9AP3dMIkTI2Wx9
11
+ 9xkJwHdroAaS0IFFtYChrwee4FbCF1FHDgoTosMwa47DrLHg4hZ6ojaKwK5QVWEV
12
+ XGb6ju5UqpktnSWF2W+Lvl/K0tI42OH2CAhebT1gEVUCAwEAAaM5MDcwCQYDVR0T
13
+ BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFGHChyMSZ16u9WOzKhgJSQ9lqDc5
14
+ MA0GCSqGSIb3DQEBBQUAA4IBAQA/lfeN2WdB1xN+82tT7vNS4HOjRQw6MUh5yktu
15
+ GQjaGqm0UB+aX0Z9y0B0qpfv9rj7nmIvEGiwBmDepNWYCGuW15JyqpN7QVVnG2xS
16
+ Mrame7VqgjM7A+VGDD5In5LtWbM/CHAATvvFlQ5Ph13YE1EdnVbZ65c+KQv+5sFY
17
+ Q+zEop74d878uaC/SAHHXS46TiXneocaLSYw1CEZs/MAIy+9c4Q5ESbGpgnfg1Ad
18
+ 6lwl7k3hsNHO/+tZzx4HJtOXDI1yAl3+q6T9J0yI3z97EinwvAKhS1eyOI2Y5eeT
19
+ tbQaNYkU127B3l/VNpd8fQm3Jkl/PqCCmDBQjUszFrJEODug
20
+ -----END CERTIFICATE-----
@@ -0,0 +1,211 @@
1
+
2
+ # Gem::Specification for Mongrel-1.0.2
3
+ # Originally generated by Echoe
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = %q{mongrel}
7
+ s.version = "1.0.2"
8
+
9
+ s.specification_version = 2 if s.respond_to? :specification_version=
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.authors = ["Zed A. Shaw"]
13
+ s.date = %q{2007-10-26}
14
+ s.default_executable = %q{mongrel_rails}
15
+ s.description = %q{A small fast HTTP library and server that runs Rails, Camping, Nitro and Iowa apps.}
16
+ s.email = %q{}
17
+ s.executables = ["mongrel_rails"]
18
+ s.extensions = ["ext/http11/extconf.rb"]
19
+ s.has_rdoc = true
20
+ s.homepage = %q{}
21
+ s.require_paths = ["lib", "ext"]
22
+ s.required_ruby_version = Gem::Requirement.new(">= 1.8.4")
23
+ s.rubyforge_project = %q{mongrel}
24
+ s.rubygems_version = %q{0.9.4.6}
25
+ s.summary = %q{A small fast HTTP library and server that runs Rails, Camping, Nitro and Iowa apps.}
26
+ s.test_files = ["test/test_cgi_wrapper.rb", "test/test_command.rb", "test/test_conditional.rb", "test/test_configurator.rb", "test/test_debug.rb", "test/test_handlers.rb", "test/test_http11.rb", "test/test_redirect_handler.rb", "test/test_request_progress.rb", "test/test_response.rb", "test/test_stats.rb", "test/test_uriclassifier.rb", "test/test_ws.rb"]
27
+
28
+ s.add_dependency(%q<gem_plugin>, [">= 0.2.3"])
29
+ s.add_dependency(%q<cgi_multipart_eof_fix>, [">= 2.4"])
30
+ s.add_dependency(%q<daemons>, [">= 1.0.3"])
31
+ s.add_dependency(%q<fastthread>, [">= 1.0.1"])
32
+ end
33
+
34
+
35
+ # # Original Rakefile source (requires the Echoe gem):
36
+ #
37
+ #
38
+ # require 'rubygems'
39
+ # gem 'echoe', '>=2.6.4'
40
+ # require 'echoe'
41
+ #
42
+ # e = Echoe.new("mongrel") do |p|
43
+ # p.summary = "A small fast HTTP library and server that runs Rails, Camping, Nitro and Iowa apps."
44
+ # p.author ="Zed A. Shaw"
45
+ # p.clean_pattern = ['ext/http11/*.{bundle,so,o,obj,pdb,lib,def,exp}', 'ext/http11/Makefile', 'pkg', 'lib/*.bundle', '*.gem', 'site/output', '.config']
46
+ # p.rdoc_pattern = ['README', 'LICENSE', 'COPYING', 'lib/**/*.rb', 'doc/**/*.rdoc', 'ext/http11/http11.c']
47
+ # p.ignore_pattern = /^(pkg|site|projects|doc|log)|CVS|\.log/
48
+ # p.ruby_version = '>= 1.8.4'
49
+ # p.dependencies = ['gem_plugin >=0.2.3', 'cgi_multipart_eof_fix >=2.4']
50
+ #
51
+ # p.need_tar_gz = false
52
+ # p.need_tgz = true
53
+ #
54
+ # case RUBY_PLATFORM
55
+ # when /mswin/
56
+ # else
57
+ # end
58
+ #
59
+ # p.eval = proc do
60
+ # case RUBY_PLATFORM
61
+ # when /mswin/
62
+ # extensions.clear
63
+ # self.files += ['lib/http11.so']
64
+ # self.platform = Gem::Platform::WIN32
65
+ # else
66
+ # add_dependency('daemons', '>= 1.0.3')
67
+ # add_dependency('fastthread', '>= 1.0.1')
68
+ # end
69
+ # end
70
+ #
71
+ # end
72
+ #
73
+ # #### Ragel builder
74
+ #
75
+ # desc "Rebuild the Ragel sources"
76
+ # task :ragel do
77
+ # Dir.chdir "ext/http11" do
78
+ # target = "http11_parser.c"
79
+ # File.unlink target if File.exist? target
80
+ # sh "ragel http11_parser.rl | rlgen-cd -G2 -o #{target}"
81
+ # raise "Failed to build C source" unless File.exist? target
82
+ # end
83
+ # end
84
+ #
85
+ # #### XXX Hack around RubyGems and Echoe for pre-compiled extensions.
86
+ #
87
+ # def move_extensions
88
+ # Dir["ext/**/*.#{Config::CONFIG['DLEXT']}"].each { |file| cp file, "lib/" }
89
+ # end
90
+ #
91
+ # case RUBY_PLATFORM
92
+ # when /mswin/
93
+ # filename = "lib/http11.so"
94
+ # file filename do
95
+ # Dir.chdir("ext/http11") do
96
+ # ruby "extconf.rb"
97
+ # system(PLATFORM =~ /mswin/ ? 'nmake' : 'make')
98
+ # end
99
+ # move_extensions
100
+ # end
101
+ # task :compile => [filename]
102
+ # end
103
+ #
104
+ # #### Project-wide install and uninstall tasks
105
+ #
106
+ # def sub_project(project, *targets)
107
+ # targets.each do |target|
108
+ # Dir.chdir "projects/#{project}" do
109
+ # sh %{rake --trace #{target.to_s} }
110
+ # end
111
+ # end
112
+ # end
113
+ #
114
+ # desc "Package Mongrel and all subprojects"
115
+ # task :package_all => [:package] do
116
+ # sub_project("gem_plugin", :package)
117
+ # sub_project("cgi_multipart_eof_fix", :package)
118
+ # sub_project("fastthread", :package)
119
+ # sub_project("mongrel_status", :package)
120
+ # sub_project("mongrel_upload_progress", :package)
121
+ # sub_project("mongrel_console", :package)
122
+ # sub_project("mongrel_cluster", :package)
123
+ # sub_project("mongrel_service", :package) if RUBY_PLATFORM =~ /mswin/
124
+ # end
125
+ #
126
+ # task :install_requirements do
127
+ # # These run before Mongrel is installed
128
+ # sub_project("gem_plugin", :install)
129
+ # sub_project("cgi_multipart_eof_fix", :install)
130
+ # sub_project("fastthread", :install)
131
+ # end
132
+ #
133
+ # desc "for Mongrel and all subprojects"
134
+ # task :install => [:install_requirements] do
135
+ # # These run after Mongrel is installed
136
+ # sub_project("mongrel_status", :install)
137
+ # sub_project("mongrel_upload_progress", :install)
138
+ # sub_project("mongrel_console", :install)
139
+ # sub_project("mongrel_cluster", :install)
140
+ # sub_project("mongrel_service", :install) if RUBY_PLATFORM =~ /mswin/
141
+ # end
142
+ #
143
+ # desc "for Mongrel and all its subprojects"
144
+ # task :uninstall => [:clean] do
145
+ # sub_project("mongrel_status", :uninstall)
146
+ # sub_project("cgi_multipart_eof_fix", :uninstall)
147
+ # sub_project("mongrel_upload_progress", :uninstall)
148
+ # sub_project("mongrel_console", :uninstall)
149
+ # sub_project("gem_plugin", :uninstall)
150
+ # sub_project("fastthread", :uninstall)
151
+ # sub_project("mongrel_service", :install) if RUBY_PLATFORM =~ /mswin/
152
+ # end
153
+ #
154
+ # desc "for Mongrel and all its subprojects"
155
+ # task :clean do
156
+ # sub_project("gem_plugin", :clean)
157
+ # sub_project("cgi_multipart_eof_fix", :clean)
158
+ # sub_project("fastthread", :clean)
159
+ # sub_project("mongrel_status", :clean)
160
+ # sub_project("mongrel_upload_progress", :clean)
161
+ # sub_project("mongrel_console", :clean)
162
+ # sub_project("mongrel_cluster", :clean)
163
+ # sub_project("mongrel_service", :clean) if RUBY_PLATFORM =~ /mswin/
164
+ # end
165
+ #
166
+ # #### Site upload tasks
167
+ #
168
+ # namespace :site do
169
+ #
170
+ # desc "Package and upload .gem files and .tgz files for Mongrel and all subprojects to http://mongrel.rubyforge.org/releases/"
171
+ # task :source => [:package_all] do
172
+ # rm_rf "pkg/gems"
173
+ # rm_rf "pkg/tars"
174
+ # mkdir_p "pkg/gems"
175
+ # mkdir_p "pkg/tars"
176
+ #
177
+ # FileList["**/*.gem"].each { |gem| mv gem, "pkg/gems" }
178
+ # FileList["**/*.tgz"].each {|tgz| mv tgz, "pkg/tars" }
179
+ #
180
+ # # XXX Hack, because only Luis can package for Win32 right now
181
+ # sh "cp ~/Downloads/mongrel-1.0.2-mswin32.gem pkg/gems/"
182
+ # sh "cp ~/Downloads/mongrel_service-0.3.3-mswin32.gem pkg/gems/"
183
+ # sh "rm -rf pkg/mongrel*"
184
+ # sh "gem generate_index -d pkg"
185
+ # sh "scp -r CHANGELOG pkg/* rubyforge.org:/var/www/gforge-projects/mongrel/releases/"
186
+ # sh "svn log -v > SVN_LOG"
187
+ # sh "scp -r SVN_LOG pkg/* rubyforge.org:/var/www/gforge-projects/mongrel/releases/"
188
+ # rm "SVN_LOG"
189
+ # end
190
+ #
191
+ # desc "Upload the website"
192
+ # task :web do
193
+ # # Requires the 'webgem' gem and the 'atom-tools' gem
194
+ # sh "cd site; webgen; ruby atom.rb > output/feed.atom; rsync -azv --no-perms --no-times output/* rubyforge.org:/var/www/gforge-projects/mongrel/"
195
+ # end
196
+ #
197
+ # desc "Upload the rdocs"
198
+ # task :rdoc => [:redoc] do
199
+ # sh "rsync -azv doc/* rubyforge.org:/var/www/gforge-projects/mongrel/rdoc/"
200
+ # sh "cd projects/gem_plugin; rake site"
201
+ # end
202
+ #
203
+ # desc "Upload the coverage report"
204
+ # task :coverage => [:rcov] do
205
+ # sh "rsync -azv test/coverage/* rubyforge.org:/var/www/gforge-projects/mongrel/coverage/"
206
+ # end
207
+ #
208
+ # desc "Upload the website, the rdocs, and the coverage report"
209
+ # task :all => [:web, :rdoc, :coverage]
210
+ #
211
+ # end
@@ -0,0 +1,39 @@
1
+
2
+ # Minimal test to help debug JRuby socket issues
3
+
4
+ require 'socket'
5
+
6
+ @server = Thread.new do
7
+ server_socket = TCPServer.new('0.0.0.0', 10101)
8
+ this_client = server_socket.accept
9
+ 4.times do |n|
10
+ begin
11
+ data = this_client.readpartial(2)
12
+ puts "Server got: #{data}"
13
+ if n == 0
14
+ this_client.close
15
+ puts "Server closed the client"
16
+ end
17
+ rescue IOError => e
18
+ puts "Server has: #{e.inspect}"
19
+ end
20
+ sleep(1)
21
+ end
22
+ server_socket.close
23
+ end
24
+
25
+ sleep(3)
26
+ client_socket = TCPSocket.new('0.0.0.0', 10101)
27
+ 4.times do |n|
28
+ string = "X#{n}"
29
+ begin
30
+ client_socket.write(string)
31
+ puts "Client said: #{string}"
32
+ rescue Errno::EPIPE => e
33
+ puts "Client has: #{e.inspect}"
34
+ end
35
+ sleep(1)
36
+ end
37
+ client_socket.close
38
+
39
+ @server.join
@@ -0,0 +1,26 @@
1
+
2
+ require 'test/testhelp'
3
+
4
+ class MockHttpRequest
5
+ attr_reader :body
6
+
7
+ def params
8
+ return { 'REQUEST_METHOD' => 'GET'}
9
+ end
10
+ end
11
+
12
+ class CGIWrapperTest < Test::Unit::TestCase
13
+
14
+ def test_set_cookies_output_cookies
15
+ request = MockHttpRequest.new
16
+ response = nil # not needed for this test
17
+ output_headers = {}
18
+
19
+ cgi = Mongrel::CGIWrapper.new(request, response)
20
+ session = CGI::Session.new(cgi, 'database_manager' => CGI::Session::MemoryStore)
21
+ cgi.send_cookies(output_headers)
22
+
23
+ assert(output_headers.has_key?("Set-Cookie"))
24
+ assert_equal("_session_id="+session.session_id+"; path=", output_headers["Set-Cookie"])
25
+ end
26
+ end