mongrel 0.3.13.4 → 1.0

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 (256) hide show
  1. data/README +1 -75
  2. data/Rakefile +14 -14
  3. data/bin/mongrel_rails +35 -23
  4. data/doc/rdoc/classes/IO.html +12 -12
  5. data/doc/rdoc/classes/IO.src/{M000001.html → M000003.html} +0 -0
  6. data/doc/rdoc/classes/IO.src/{M000002.html → M000004.html} +0 -0
  7. data/doc/rdoc/classes/Kernel.html +11 -11
  8. data/doc/rdoc/classes/Kernel.src/{M000010.html → M000012.html} +0 -0
  9. data/doc/rdoc/classes/Kernel.src/{M000011.html → M000013.html} +0 -0
  10. data/doc/rdoc/classes/Mongrel.html +3 -3
  11. data/doc/rdoc/classes/Mongrel/CGIWrapper.html +77 -69
  12. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000115.html +12 -19
  13. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000116.html +34 -12
  14. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000117.html +21 -5
  15. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000118.html +19 -5
  16. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000119.html +12 -5
  17. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000120.html +5 -6
  18. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000121.html +18 -0
  19. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000122.html +18 -0
  20. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000123.html +19 -0
  21. data/doc/rdoc/classes/Mongrel/Camping.html +8 -8
  22. data/doc/rdoc/classes/Mongrel/Camping.src/M000041.html +22 -0
  23. data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.html +31 -12
  24. data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/M000042.html +20 -0
  25. data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/M000043.html +58 -0
  26. data/doc/rdoc/classes/Mongrel/Command/Base.html +75 -73
  27. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000018.html +11 -5
  28. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000019.html +29 -5
  29. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000020.html +5 -5
  30. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000021.html +5 -5
  31. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000022.html +5 -9
  32. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000023.html +5 -5
  33. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000024.html +9 -5
  34. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000025.html +5 -5
  35. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000026.html +5 -11
  36. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000027.html +5 -11
  37. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000028.html +11 -5
  38. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000029.html +24 -0
  39. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000030.html +18 -0
  40. data/doc/rdoc/classes/Mongrel/Command/Registry.html +20 -20
  41. data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000031.html +7 -45
  42. data/doc/rdoc/classes/Mongrel/Command/Registry.src/{M000030.html → M000032.html} +0 -0
  43. data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000033.html +58 -0
  44. data/doc/rdoc/classes/Mongrel/Configurator.html +163 -140
  45. data/doc/rdoc/classes/Mongrel/Configurator.src/M000093.html +14 -8
  46. data/doc/rdoc/classes/Mongrel/Configurator.src/M000094.html +18 -7
  47. data/doc/rdoc/classes/Mongrel/Configurator.src/M000095.html +5 -10
  48. data/doc/rdoc/classes/Mongrel/Configurator.src/M000096.html +8 -5
  49. data/doc/rdoc/classes/Mongrel/Configurator.src/M000097.html +7 -25
  50. data/doc/rdoc/classes/Mongrel/Configurator.src/M000098.html +10 -6
  51. data/doc/rdoc/classes/Mongrel/Configurator.src/M000099.html +5 -26
  52. data/doc/rdoc/classes/Mongrel/Configurator.src/M000100.html +25 -20
  53. data/doc/rdoc/classes/Mongrel/Configurator.src/M000101.html +6 -5
  54. data/doc/rdoc/classes/Mongrel/Configurator.src/M000102.html +26 -11
  55. data/doc/rdoc/classes/Mongrel/Configurator.src/M000103.html +20 -6
  56. data/doc/rdoc/classes/Mongrel/Configurator.src/M000104.html +5 -5
  57. data/doc/rdoc/classes/Mongrel/Configurator.src/M000105.html +11 -9
  58. data/doc/rdoc/classes/Mongrel/Configurator.src/M000106.html +6 -9
  59. data/doc/rdoc/classes/Mongrel/Configurator.src/M000107.html +5 -5
  60. data/doc/rdoc/classes/Mongrel/Configurator.src/M000108.html +9 -21
  61. data/doc/rdoc/classes/Mongrel/Configurator.src/M000109.html +9 -5
  62. data/doc/rdoc/classes/Mongrel/Configurator.src/M000110.html +5 -23
  63. data/doc/rdoc/classes/Mongrel/Configurator.src/M000111.html +21 -5
  64. data/doc/rdoc/classes/Mongrel/Configurator.src/M000112.html +18 -0
  65. data/doc/rdoc/classes/Mongrel/Configurator.src/M000113.html +36 -0
  66. data/doc/rdoc/classes/Mongrel/Configurator.src/M000114.html +18 -0
  67. data/doc/rdoc/classes/Mongrel/Const.html +8 -9
  68. data/doc/rdoc/classes/Mongrel/DeflateFilter.html +19 -12
  69. data/doc/rdoc/classes/Mongrel/DeflateFilter.src/{M000121.html → M000124.html} +5 -5
  70. data/doc/rdoc/classes/Mongrel/DeflateFilter.src/{M000122.html → M000125.html} +9 -14
  71. data/doc/rdoc/classes/Mongrel/DirHandler.html +43 -43
  72. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000051.html +8 -25
  73. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000052.html +29 -50
  74. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000053.html +25 -26
  75. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000054.html +52 -5
  76. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000055.html +39 -0
  77. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000056.html +18 -0
  78. data/doc/rdoc/classes/Mongrel/Error404Handler.html +11 -11
  79. data/doc/rdoc/classes/Mongrel/Error404Handler.src/{M000123.html → M000126.html} +4 -4
  80. data/doc/rdoc/classes/Mongrel/Error404Handler.src/{M000124.html → M000127.html} +4 -4
  81. data/doc/rdoc/classes/Mongrel/HeaderOut.html +15 -10
  82. data/doc/rdoc/classes/Mongrel/HeaderOut.src/M000066.html +21 -0
  83. data/doc/rdoc/classes/Mongrel/HeaderOut.src/M000067.html +21 -0
  84. data/doc/rdoc/classes/Mongrel/HttpHandler.html +25 -23
  85. data/doc/rdoc/classes/Mongrel/HttpHandler.src/M000072.html +4 -4
  86. data/doc/rdoc/classes/Mongrel/HttpHandler.src/{M000071.html → M000073.html} +3 -3
  87. data/doc/rdoc/classes/Mongrel/{HttpHandlerPlugin.src/M000012.html → HttpHandler.src/M000074.html} +4 -4
  88. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.html +22 -21
  89. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/M000014.html +4 -6
  90. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/M000015.html +4 -4
  91. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/M000016.html +19 -0
  92. data/doc/rdoc/classes/Mongrel/{HttpHandler.src/M000070.html → HttpHandlerPlugin.src/M000017.html} +4 -4
  93. data/doc/rdoc/classes/Mongrel/HttpParser.html +44 -42
  94. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000044.html +6 -7
  95. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000045.html +7 -37
  96. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000046.html +7 -5
  97. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000047.html +37 -5
  98. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000048.html +5 -6
  99. data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000042.html → M000049.html} +5 -6
  100. data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000043.html → M000050.html} +6 -7
  101. data/doc/rdoc/classes/Mongrel/HttpRequest.html +37 -40
  102. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000133.html +37 -7
  103. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000134.html +28 -7
  104. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000135.html +16 -19
  105. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000136.html +20 -0
  106. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000137.html +20 -0
  107. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000138.html +32 -0
  108. data/doc/rdoc/classes/Mongrel/HttpResponse.html +95 -85
  109. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000075.html +12 -13
  110. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000076.html +7 -9
  111. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000077.html +13 -9
  112. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000078.html +9 -9
  113. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000079.html +9 -18
  114. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000080.html +9 -8
  115. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000081.html +18 -7
  116. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000082.html +8 -7
  117. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000083.html +7 -7
  118. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000084.html +7 -5
  119. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000085.html +20 -0
  120. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000086.html +18 -0
  121. data/doc/rdoc/classes/Mongrel/HttpServer.html +59 -63
  122. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000057.html +12 -19
  123. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000058.html +87 -8
  124. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000059.html +19 -9
  125. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000060.html +8 -49
  126. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000061.html +16 -21
  127. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000062.html +52 -5
  128. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000063.html +21 -9
  129. data/doc/rdoc/classes/Mongrel/{HeaderOut.src → HttpServer.src}/M000064.html +5 -5
  130. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000065.html +22 -0
  131. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.html +27 -25
  132. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/M000034.html +24 -13
  133. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/{M000033.html → M000035.html} +11 -11
  134. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/M000036.html +26 -0
  135. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.html +24 -26
  136. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000037.html +10 -8
  137. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000038.html +43 -12
  138. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000039.html +20 -0
  139. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000040.html +25 -0
  140. data/doc/rdoc/classes/Mongrel/RedirectHandler.html +10 -10
  141. data/doc/rdoc/classes/Mongrel/RedirectHandler.src/{M000128.html → M000131.html} +8 -8
  142. data/doc/rdoc/classes/Mongrel/RedirectHandler.src/{M000129.html → M000132.html} +13 -13
  143. data/doc/rdoc/classes/Mongrel/StatisticsFilter.html +20 -20
  144. data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/{M000125.html → M000128.html} +10 -10
  145. data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/{M000126.html → M000129.html} +10 -10
  146. data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/{M000127.html → M000130.html} +4 -4
  147. data/doc/rdoc/classes/Mongrel/Stats.html +43 -42
  148. data/doc/rdoc/classes/Mongrel/Stats.src/M000139.html +6 -5
  149. data/doc/rdoc/classes/Mongrel/Stats.src/M000140.html +10 -5
  150. data/doc/rdoc/classes/Mongrel/Stats.src/M000141.html +13 -5
  151. data/doc/rdoc/classes/Mongrel/Stats.src/M000142.html +5 -10
  152. data/doc/rdoc/classes/Mongrel/Stats.src/M000143.html +5 -7
  153. data/doc/rdoc/classes/Mongrel/Stats.src/{M000136.html → M000144.html} +5 -6
  154. data/doc/rdoc/classes/Mongrel/Stats.src/M000145.html +23 -0
  155. data/doc/rdoc/classes/Mongrel/Stats.src/M000146.html +20 -0
  156. data/doc/rdoc/classes/Mongrel/StatusHandler.html +21 -21
  157. data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000068.html +5 -29
  158. data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000069.html +11 -7
  159. data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000070.html +42 -0
  160. data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000071.html +20 -0
  161. data/doc/rdoc/classes/Mongrel/URIClassifier.html +58 -55
  162. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000087.html +5 -26
  163. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000088.html +5 -38
  164. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000089.html +18 -15
  165. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000090.html +25 -57
  166. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000091.html +36 -0
  167. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000092.html +83 -0
  168. data/doc/rdoc/classes/MongrelDbg.html +25 -25
  169. data/doc/rdoc/classes/MongrelDbg.src/M000007.html +11 -9
  170. data/doc/rdoc/classes/MongrelDbg.src/M000008.html +7 -8
  171. data/doc/rdoc/classes/MongrelDbg.src/M000009.html +9 -5
  172. data/doc/rdoc/classes/MongrelDbg.src/M000010.html +21 -0
  173. data/doc/rdoc/classes/MongrelDbg.src/M000011.html +18 -0
  174. data/doc/rdoc/classes/{Sync.html → Mutex.html} +50 -19
  175. data/doc/rdoc/classes/Mutex.src/M000001.html +24 -0
  176. data/doc/rdoc/classes/Mutex.src/M000002.html +32 -0
  177. data/doc/rdoc/classes/RequestLog/Access.html +5 -5
  178. data/doc/rdoc/classes/RequestLog/Access.src/{M000144.html → M000147.html} +0 -0
  179. data/doc/rdoc/classes/RequestLog/Files.html +5 -5
  180. data/doc/rdoc/classes/RequestLog/Files.src/{M000145.html → M000148.html} +0 -0
  181. data/doc/rdoc/classes/RequestLog/Objects.html +5 -5
  182. data/doc/rdoc/classes/RequestLog/Objects.src/{M000147.html → M000150.html} +0 -0
  183. data/doc/rdoc/classes/RequestLog/Params.html +5 -5
  184. data/doc/rdoc/classes/RequestLog/Params.src/{M000148.html → M000151.html} +0 -0
  185. data/doc/rdoc/classes/RequestLog/Threads.html +5 -5
  186. data/doc/rdoc/classes/RequestLog/Threads.src/{M000146.html → M000149.html} +0 -0
  187. data/doc/rdoc/classes/TCPServer.html +10 -10
  188. data/doc/rdoc/classes/TCPServer.src/{M000003.html → M000005.html} +0 -0
  189. data/doc/rdoc/created.rid +1 -1
  190. data/doc/rdoc/files/COPYING.html +1 -1
  191. data/doc/rdoc/files/LICENSE.html +1 -1
  192. data/doc/rdoc/files/README.html +11 -100
  193. data/doc/rdoc/files/ext/http11/http11_c.html +1 -1
  194. data/doc/rdoc/files/lib/mongrel/camping_rb.html +2 -2
  195. data/doc/rdoc/files/lib/mongrel/cgi_rb.html +2 -2
  196. data/doc/rdoc/files/lib/mongrel/command_rb.html +2 -2
  197. data/doc/rdoc/files/lib/mongrel/configurator_rb.html +1 -1
  198. data/doc/rdoc/files/lib/mongrel/debug_rb.html +2 -2
  199. data/doc/rdoc/files/lib/mongrel/handlers_rb.html +3 -2
  200. data/doc/rdoc/files/lib/mongrel/init_rb.html +2 -2
  201. data/doc/rdoc/files/lib/mongrel/rails_rb.html +2 -3
  202. data/doc/rdoc/files/lib/mongrel/stats_rb.html +2 -2
  203. data/doc/rdoc/files/lib/mongrel/tcphack_rb.html +2 -2
  204. data/doc/rdoc/files/lib/mongrel_rb.html +5 -3
  205. data/doc/rdoc/files/lib/mutex_fix_rb.html +108 -0
  206. data/doc/rdoc/fr_class_index.html +1 -1
  207. data/doc/rdoc/fr_file_index.html +1 -0
  208. data/doc/rdoc/fr_method_index.html +151 -148
  209. data/ext/http11/http11.c +2 -2
  210. data/lib/mongrel.rb +85 -38
  211. data/lib/mongrel/camping.rb +17 -4
  212. data/lib/mongrel/configurator.rb +11 -7
  213. data/lib/mongrel/handlers.rb +30 -27
  214. data/lib/mongrel/mime_types.yml +615 -0
  215. data/lib/mongrel/rails.rb +21 -28
  216. data/lib/mutex_fix.rb +34 -0
  217. data/test/test_handlers.rb +16 -4
  218. data/test/test_http11.rb +8 -0
  219. data/test/test_request_progress.rb +45 -2
  220. data/test/test_response.rb +31 -0
  221. metadata +95 -71
  222. data/bin/mongrel_rails_service +0 -246
  223. data/bin/mongrel_rails_svc +0 -307
  224. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000112.html +0 -25
  225. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000113.html +0 -47
  226. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000114.html +0 -34
  227. data/doc/rdoc/classes/Mongrel/Camping.src/M000039.html +0 -22
  228. data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/M000040.html +0 -18
  229. data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/M000041.html +0 -51
  230. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000016.html +0 -24
  231. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000017.html +0 -42
  232. data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000029.html +0 -20
  233. data/doc/rdoc/classes/Mongrel/Configurator.src/M000091.html +0 -27
  234. data/doc/rdoc/classes/Mongrel/Configurator.src/M000092.html +0 -31
  235. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000049.html +0 -21
  236. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000050.html +0 -43
  237. data/doc/rdoc/classes/Mongrel/HeaderOut.src/M000065.html +0 -18
  238. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/M000013.html +0 -17
  239. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000130.html +0 -47
  240. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000131.html +0 -37
  241. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000132.html +0 -29
  242. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000073.html +0 -25
  243. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000074.html +0 -20
  244. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000055.html +0 -25
  245. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000056.html +0 -91
  246. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/M000032.html +0 -37
  247. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000035.html +0 -23
  248. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000036.html +0 -54
  249. data/doc/rdoc/classes/Mongrel/Stats.src/M000137.html +0 -23
  250. data/doc/rdoc/classes/Mongrel/Stats.src/M000138.html +0 -26
  251. data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000066.html +0 -18
  252. data/doc/rdoc/classes/Mongrel/StatusHandler.src/M000067.html +0 -24
  253. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000085.html +0 -18
  254. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000086.html +0 -18
  255. data/doc/rdoc/classes/MongrelDbg.src/M000005.html +0 -24
  256. data/doc/rdoc/classes/MongrelDbg.src/M000006.html +0 -20
@@ -54,13 +54,13 @@
54
54
  <a href="classes/Mongrel/TimeoutError.html">Mongrel::TimeoutError</a><br />
55
55
  <a href="classes/Mongrel/URIClassifier.html">Mongrel::URIClassifier</a><br />
56
56
  <a href="classes/MongrelDbg.html">MongrelDbg</a><br />
57
+ <a href="classes/Mutex.html">Mutex</a><br />
57
58
  <a href="classes/RequestLog.html">RequestLog</a><br />
58
59
  <a href="classes/RequestLog/Access.html">RequestLog::Access</a><br />
59
60
  <a href="classes/RequestLog/Files.html">RequestLog::Files</a><br />
60
61
  <a href="classes/RequestLog/Objects.html">RequestLog::Objects</a><br />
61
62
  <a href="classes/RequestLog/Params.html">RequestLog::Params</a><br />
62
63
  <a href="classes/RequestLog/Threads.html">RequestLog::Threads</a><br />
63
- <a href="classes/Sync.html">Sync</a><br />
64
64
  <a href="classes/TCPServer.html">TCPServer</a><br />
65
65
  </div>
66
66
  </div>
@@ -35,6 +35,7 @@
35
35
  <a href="files/lib/mongrel/rails_rb.html">lib/mongrel/rails.rb</a><br />
36
36
  <a href="files/lib/mongrel/stats_rb.html">lib/mongrel/stats.rb</a><br />
37
37
  <a href="files/lib/mongrel/tcphack_rb.html">lib/mongrel/tcphack.rb</a><br />
38
+ <a href="files/lib/mutex_fix_rb.html">lib/mutex_fix.rb</a><br />
38
39
  </div>
39
40
  </div>
40
41
  </body>
@@ -20,154 +20,157 @@
20
20
  <div id="index">
21
21
  <h1 class="section-bar">Methods</h1>
22
22
  <div id="index-entries">
23
- <a href="classes/Mongrel/HeaderOut.html#M000065">[]= (Mongrel::HeaderOut)</a><br />
24
- <a href="classes/Mongrel/DirHandler.html#M000054">add_mime_type (Mongrel::DirHandler)</a><br />
25
- <a href="classes/Mongrel/CGIWrapper.html#M000117">args (Mongrel::CGIWrapper)</a><br />
26
- <a href="classes/MongrelDbg.html#M000007">begin_trace (MongrelDbg)</a><br />
27
- <a href="classes/Mongrel/DirHandler.html#M000050">can_serve (Mongrel::DirHandler)</a><br />
28
- <a href="classes/Mongrel/Configurator.html#M000092">change_privilege (Mongrel::Configurator)</a><br />
29
- <a href="classes/Mongrel/Configurator.html#M000095">cloaker (Mongrel::Configurator)</a><br />
30
- <a href="classes/Mongrel/Configurator.html#M000094">cloaking_class (Mongrel::Configurator)</a><br />
31
- <a href="classes/IO.html#M000002">close (IO)</a><br />
32
- <a href="classes/Mongrel/Command/Registry.html#M000029">commands (Mongrel::Command::Registry)</a><br />
33
- <a href="classes/Mongrel/Command/Base.html#M000018">configure (Mongrel::Command::Base)</a><br />
34
- <a href="classes/MongrelDbg.html#M000005">configure (MongrelDbg)</a><br />
35
- <a href="classes/Mongrel/HttpServer.html#M000059">configure_socket_options (Mongrel::HttpServer)</a><br />
36
- <a href="classes/Mongrel/Configurator.html#M000099">daemonize (Mongrel::Configurator)</a><br />
37
- <a href="classes/Mongrel/Configurator.html#M000108">debug (Mongrel::Configurator)</a><br />
38
- <a href="classes/Mongrel/StatusHandler.html#M000068">describe_listener (Mongrel::StatusHandler)</a><br />
39
- <a href="classes/Mongrel/HttpResponse.html#M000084">done (Mongrel::HttpResponse)</a><br />
40
- <a href="classes/Mongrel/HttpResponse.html#M000083">done= (Mongrel::HttpResponse)</a><br />
41
- <a href="classes/Mongrel/StatisticsFilter.html#M000127">dump (Mongrel::StatisticsFilter)</a><br />
42
- <a href="classes/Mongrel/Stats.html#M000139">dump (Mongrel::Stats)</a><br />
43
- <a href="classes/MongrelDbg.html#M000008">end_trace (MongrelDbg)</a><br />
44
- <a href="classes/Mongrel/CGIWrapper.html#M000118">env_table (Mongrel::CGIWrapper)</a><br />
45
- <a href="classes/Mongrel/HttpParser.html#M000046">error? (Mongrel::HttpParser)</a><br />
46
- <a href="classes/Mongrel/HttpRequest.html#M000133">escape (Mongrel::HttpRequest)</a><br />
47
- <a href="classes/Mongrel/HttpParser.html#M000045">execute (Mongrel::HttpParser)</a><br />
48
- <a href="classes/Mongrel/Command/Base.html#M000028">failure (Mongrel::Command::Base)</a><br />
49
- <a href="classes/Mongrel/HttpParser.html#M000044">finish (Mongrel::HttpParser)</a><br />
50
- <a href="classes/Mongrel/HttpResponse.html#M000082">finished (Mongrel::HttpResponse)</a><br />
51
- <a href="classes/Mongrel/HttpParser.html#M000047">finished? (Mongrel::HttpParser)</a><br />
52
- <a href="classes/Mongrel/HttpServer.html#M000058">graceful_shutdown (Mongrel::HttpServer)</a><br />
53
- <a href="classes/Mongrel/CGIWrapper.html#M000113">header (Mongrel::CGIWrapper)</a><br />
54
- <a href="classes/Mongrel/Command/Base.html#M000020">help (Mongrel::Command::Base)</a><br />
55
- <a href="classes/TCPServer.html#M000004">initialize (TCPServer)</a><br />
56
- <a href="classes/TCPServer.html#M000003">initialize_with_backlog (TCPServer)</a><br />
57
- <a href="classes/Mongrel/URIClassifier.html#M000086">inspect (Mongrel::URIClassifier)</a><br />
58
- <a href="classes/Mongrel/Configurator.html#M000107">join (Mongrel::Configurator)</a><br />
59
- <a href="classes/Mongrel/Configurator.html#M000097">listener (Mongrel::Configurator)</a><br />
60
- <a href="classes/Mongrel/Configurator.html#M000102">load_mime_map (Mongrel::Configurator)</a><br />
61
- <a href="classes/Mongrel/Configurator.html#M000100">load_plugins (Mongrel::Configurator)</a><br />
62
- <a href="classes/Mongrel/Configurator.html#M000101">load_yaml (Mongrel::Configurator)</a><br />
63
- <a href="classes/Mongrel/Configurator.html#M000111">log (Mongrel::Configurator)</a><br />
64
- <a href="classes/Kernel.html#M000011">log_open_files (Kernel)</a><br />
65
- <a href="classes/Mongrel/Rails/RailsHandler.html#M000037">log_threads_waiting_for (Mongrel::Rails::RailsHandler)</a><br />
66
- <a href="classes/Mongrel/Stats.html#M000141">mean (Mongrel::Stats)</a><br />
67
- <a href="classes/Mongrel/Camping/CampingHandler.html#M000040">new (Mongrel::Camping::CampingHandler)</a><br />
68
- <a href="classes/Mongrel/HttpParser.html#M000042">new (Mongrel::HttpParser)</a><br />
69
- <a href="classes/Mongrel/URIClassifier.html#M000087">new (Mongrel::URIClassifier)</a><br />
70
- <a href="classes/Mongrel/StatusHandler.html#M000066">new (Mongrel::StatusHandler)</a><br />
71
- <a href="classes/Mongrel/DirHandler.html#M000049">new (Mongrel::DirHandler)</a><br />
72
- <a href="classes/Mongrel/DeflateFilter.html#M000121">new (Mongrel::DeflateFilter)</a><br />
73
- <a href="classes/Mongrel/Rails/RailsHandler.html#M000035">new (Mongrel::Rails::RailsHandler)</a><br />
74
- <a href="classes/Mongrel/Error404Handler.html#M000123">new (Mongrel::Error404Handler)</a><br />
75
- <a href="classes/Mongrel/HttpResponse.html#M000073">new (Mongrel::HttpResponse)</a><br />
76
- <a href="classes/Mongrel/StatisticsFilter.html#M000125">new (Mongrel::StatisticsFilter)</a><br />
77
- <a href="classes/Mongrel/HttpServer.html#M000055">new (Mongrel::HttpServer)</a><br />
78
- <a href="classes/Mongrel/Configurator.html#M000091">new (Mongrel::Configurator)</a><br />
79
- <a href="classes/Mongrel/HttpHandlerPlugin.html#M000014">new (Mongrel::HttpHandlerPlugin)</a><br />
80
- <a href="classes/Mongrel/RedirectHandler.html#M000128">new (Mongrel::RedirectHandler)</a><br />
81
- <a href="classes/Mongrel/HttpRequest.html#M000130">new (Mongrel::HttpRequest)</a><br />
82
- <a href="classes/Mongrel/CGIWrapper.html#M000112">new (Mongrel::CGIWrapper)</a><br />
83
- <a href="classes/Mongrel/Stats.html#M000136">new (Mongrel::Stats)</a><br />
84
- <a href="classes/Mongrel/Command/Base.html#M000017">new (Mongrel::Command::Base)</a><br />
85
- <a href="classes/Mongrel/HeaderOut.html#M000064">new (Mongrel::HeaderOut)</a><br />
86
- <a href="classes/Mongrel/HttpParser.html#M000048">nread (Mongrel::HttpParser)</a><br />
87
- <a href="classes/IO.html#M000001">open (IO)</a><br />
88
- <a href="classes/Kernel.html#M000010">open (Kernel)</a><br />
89
- <a href="classes/Mongrel/Command/Base.html#M000016">options (Mongrel::Command::Base)</a><br />
90
- <a href="classes/Mongrel/CGIWrapper.html#M000115">out (Mongrel::CGIWrapper)</a><br />
91
- <a href="classes/Mongrel/Configurator.html#M000103">plugin (Mongrel::Configurator)</a><br />
92
- <a href="classes/Mongrel/Command/Registry.html#M000030">print_command_list (Mongrel::Command::Registry)</a><br />
93
- <a href="classes/Mongrel/StatusHandler.html#M000069">process (Mongrel::StatusHandler)</a><br />
94
- <a href="classes/Mongrel/HttpHandler.html#M000072">process (Mongrel::HttpHandler)</a><br />
95
- <a href="classes/Mongrel/Error404Handler.html#M000124">process (Mongrel::Error404Handler)</a><br />
96
- <a href="classes/Mongrel/Camping/CampingHandler.html#M000041">process (Mongrel::Camping::CampingHandler)</a><br />
97
- <a href="classes/Mongrel/DeflateFilter.html#M000122">process (Mongrel::DeflateFilter)</a><br />
98
- <a href="classes/Mongrel/RedirectHandler.html#M000129">process (Mongrel::RedirectHandler)</a><br />
99
- <a href="classes/Mongrel/Rails/RailsHandler.html#M000036">process (Mongrel::Rails::RailsHandler)</a><br />
100
- <a href="classes/Mongrel/HttpHandlerPlugin.html#M000015">process (Mongrel::HttpHandlerPlugin)</a><br />
101
- <a href="classes/RequestLog/Access.html#M000144">process (RequestLog::Access)</a><br />
102
- <a href="classes/RequestLog/Files.html#M000145">process (RequestLog::Files)</a><br />
103
- <a href="classes/Mongrel/DirHandler.html#M000053">process (Mongrel::DirHandler)</a><br />
104
- <a href="classes/RequestLog/Threads.html#M000146">process (RequestLog::Threads)</a><br />
105
- <a href="classes/RequestLog/Objects.html#M000147">process (RequestLog::Objects)</a><br />
106
- <a href="classes/Mongrel/StatisticsFilter.html#M000126">process (Mongrel::StatisticsFilter)</a><br />
107
- <a href="classes/RequestLog/Params.html#M000148">process (RequestLog::Params)</a><br />
108
- <a href="classes/Mongrel/HttpServer.html#M000056">process_client (Mongrel::HttpServer)</a><br />
109
- <a href="classes/Mongrel/HttpRequest.html#M000135">query_parse (Mongrel::HttpRequest)</a><br />
110
- <a href="classes/Mongrel/Rails/RailsConfigurator.html#M000032">rails (Mongrel::Rails::RailsConfigurator)</a><br />
111
- <a href="classes/Mongrel/HttpRequest.html#M000131">read_body (Mongrel::HttpRequest)</a><br />
112
- <a href="classes/Mongrel/HttpRequest.html#M000132">read_socket (Mongrel::HttpRequest)</a><br />
113
- <a href="classes/Mongrel/HttpServer.html#M000057">reap_dead_workers (Mongrel::HttpServer)</a><br />
114
- <a href="classes/Mongrel/Configurator.html#M000104">redirect (Mongrel::Configurator)</a><br />
115
- <a href="classes/Mongrel/HttpServer.html#M000061">register (Mongrel::HttpServer)</a><br />
116
- <a href="classes/Mongrel/URIClassifier.html#M000088">register (Mongrel::URIClassifier)</a><br />
117
- <a href="classes/Mongrel/Rails/RailsHandler.html#M000038">reload! (Mongrel::Rails::RailsHandler)</a><br />
118
- <a href="classes/Mongrel/Rails/RailsConfigurator.html#M000033">reload! (Mongrel::Rails::RailsConfigurator)</a><br />
119
- <a href="classes/Mongrel/HttpHandlerPlugin.html#M000012">request_begins (Mongrel::HttpHandlerPlugin)</a><br />
120
- <a href="classes/Mongrel/HttpHandler.html#M000070">request_begins (Mongrel::HttpHandler)</a><br />
121
- <a href="classes/Mongrel/HttpHandlerPlugin.html#M000013">request_progress (Mongrel::HttpHandlerPlugin)</a><br />
122
- <a href="classes/Mongrel/HttpHandler.html#M000071">request_progress (Mongrel::HttpHandler)</a><br />
123
- <a href="classes/Mongrel/HttpParser.html#M000043">reset (Mongrel::HttpParser)</a><br />
124
- <a href="classes/Mongrel/HttpResponse.html#M000075">reset (Mongrel::HttpResponse)</a><br />
125
- <a href="classes/Mongrel/Stats.html#M000137">reset (Mongrel::Stats)</a><br />
126
- <a href="classes/Mongrel/URIClassifier.html#M000090">resolve (Mongrel::URIClassifier)</a><br />
127
- <a href="classes/Mongrel/Configurator.html#M000096">resolve_defaults (Mongrel::Configurator)</a><br />
128
- <a href="classes/Mongrel/Configurator.html#M000105">run (Mongrel::Configurator)</a><br />
129
- <a href="classes/Mongrel/Command/Base.html#M000021">run (Mongrel::Command::Base)</a><br />
130
- <a href="classes/Mongrel/HttpServer.html#M000060">run (Mongrel::HttpServer)</a><br />
131
- <a href="classes/Mongrel/Command/Registry.html#M000031">run (Mongrel::Command::Registry)</a><br />
132
- <a href="classes/Mongrel/Configurator.html#M000109">run_config (Mongrel::Configurator)</a><br />
133
- <a href="classes/Mongrel/Stats.html#M000138">sample (Mongrel::Stats)</a><br />
134
- <a href="classes/Mongrel/Stats.html#M000142">sd (Mongrel::Stats)</a><br />
135
- <a href="classes/Mongrel/HttpResponse.html#M000078">send_body (Mongrel::HttpResponse)</a><br />
136
- <a href="classes/Mongrel/CGIWrapper.html#M000114">send_cookies (Mongrel::CGIWrapper)</a><br />
137
- <a href="classes/Mongrel/DirHandler.html#M000051">send_dir_listing (Mongrel::DirHandler)</a><br />
138
- <a href="classes/Mongrel/HttpResponse.html#M000079">send_file (Mongrel::HttpResponse)</a><br />
139
- <a href="classes/Mongrel/DirHandler.html#M000052">send_file (Mongrel::DirHandler)</a><br />
140
- <a href="classes/Mongrel/HttpResponse.html#M000077">send_header (Mongrel::HttpResponse)</a><br />
141
- <a href="classes/Mongrel/HttpResponse.html#M000076">send_status (Mongrel::HttpResponse)</a><br />
142
- <a href="classes/Mongrel/Rails/RailsConfigurator.html#M000034">setup_rails_signals (Mongrel::Rails::RailsConfigurator)</a><br />
143
- <a href="classes/Mongrel/Configurator.html#M000110">setup_signals (Mongrel::Configurator)</a><br />
144
- <a href="classes/Mongrel/HttpResponse.html#M000080">socket_error (Mongrel::HttpResponse)</a><br />
145
- <a href="classes/Mongrel/Camping.html#M000039">start (Mongrel::Camping)</a><br />
146
- <a href="classes/Mongrel/HttpResponse.html#M000074">start (Mongrel::HttpResponse)</a><br />
147
- <a href="classes/Mongrel/CGIWrapper.html#M000116">status (Mongrel::CGIWrapper)</a><br />
148
- <a href="classes/Mongrel/CGIWrapper.html#M000119">stdinput (Mongrel::CGIWrapper)</a><br />
149
- <a href="classes/Mongrel/CGIWrapper.html#M000120">stdoutput (Mongrel::CGIWrapper)</a><br />
150
- <a href="classes/Mongrel/HttpServer.html#M000063">stop (Mongrel::HttpServer)</a><br />
151
- <a href="classes/Mongrel/Configurator.html#M000106">stop (Mongrel::Configurator)</a><br />
152
- <a href="classes/Mongrel/StatusHandler.html#M000067">table (Mongrel::StatusHandler)</a><br />
153
- <a href="classes/Mongrel/Stats.html#M000143">tick (Mongrel::Stats)</a><br />
154
- <a href="classes/Mongrel/Stats.html#M000140">to_s (Mongrel::Stats)</a><br />
155
- <a href="classes/MongrelDbg.html#M000006">trace (MongrelDbg)</a><br />
156
- <a href="classes/MongrelDbg.html#M000009">tracing? (MongrelDbg)</a><br />
157
- <a href="classes/Mongrel/HttpRequest.html#M000134">unescape (Mongrel::HttpRequest)</a><br />
158
- <a href="classes/Mongrel/URIClassifier.html#M000089">unregister (Mongrel::URIClassifier)</a><br />
159
- <a href="classes/Mongrel/HttpServer.html#M000062">unregister (Mongrel::HttpServer)</a><br />
160
- <a href="classes/Mongrel/Configurator.html#M000098">uri (Mongrel::Configurator)</a><br />
161
- <a href="classes/Mongrel/URIClassifier.html#M000085">uris (Mongrel::URIClassifier)</a><br />
162
- <a href="classes/Mongrel/Command/Base.html#M000022">valid? (Mongrel::Command::Base)</a><br />
163
- <a href="classes/Mongrel/Command/Base.html#M000025">valid_dir? (Mongrel::Command::Base)</a><br />
164
- <a href="classes/Mongrel/Command/Base.html#M000023">valid_exists? (Mongrel::Command::Base)</a><br />
165
- <a href="classes/Mongrel/Command/Base.html#M000024">valid_file? (Mongrel::Command::Base)</a><br />
166
- <a href="classes/Mongrel/Command/Base.html#M000027">valid_group? (Mongrel::Command::Base)</a><br />
167
- <a href="classes/Mongrel/Command/Base.html#M000026">valid_user? (Mongrel::Command::Base)</a><br />
168
- <a href="classes/Mongrel/Command/Base.html#M000019">validate (Mongrel::Command::Base)</a><br />
169
- <a href="classes/Mongrel/HttpResponse.html#M000081">write (Mongrel::HttpResponse)</a><br />
170
- <a href="classes/Mongrel/Configurator.html#M000093">write_pid_file (Mongrel::Configurator)</a><br />
23
+ <a href="classes/Mongrel/HeaderOut.html#M000067">[]= (Mongrel::HeaderOut)</a><br />
24
+ <a href="classes/Mongrel/DirHandler.html#M000056">add_mime_type (Mongrel::DirHandler)</a><br />
25
+ <a href="classes/Mongrel/CGIWrapper.html#M000120">args (Mongrel::CGIWrapper)</a><br />
26
+ <a href="classes/MongrelDbg.html#M000009">begin_trace (MongrelDbg)</a><br />
27
+ <a href="classes/Mongrel/DirHandler.html#M000052">can_serve (Mongrel::DirHandler)</a><br />
28
+ <a href="classes/Mongrel/Configurator.html#M000094">change_privilege (Mongrel::Configurator)</a><br />
29
+ <a href="classes/Mongrel/Configurator.html#M000098">cloaker (Mongrel::Configurator)</a><br />
30
+ <a href="classes/Mongrel/Configurator.html#M000097">cloaking_class (Mongrel::Configurator)</a><br />
31
+ <a href="classes/IO.html#M000004">close (IO)</a><br />
32
+ <a href="classes/Mongrel/Command/Registry.html#M000031">commands (Mongrel::Command::Registry)</a><br />
33
+ <a href="classes/MongrelDbg.html#M000007">configure (MongrelDbg)</a><br />
34
+ <a href="classes/Mongrel/Command/Base.html#M000020">configure (Mongrel::Command::Base)</a><br />
35
+ <a href="classes/Mongrel/HttpServer.html#M000061">configure_socket_options (Mongrel::HttpServer)</a><br />
36
+ <a href="classes/Mongrel/Configurator.html#M000102">daemonize (Mongrel::Configurator)</a><br />
37
+ <a href="classes/Mongrel/Configurator.html#M000111">debug (Mongrel::Configurator)</a><br />
38
+ <a href="classes/Mongrel/StatusHandler.html#M000070">describe_listener (Mongrel::StatusHandler)</a><br />
39
+ <a href="classes/Mongrel/HttpResponse.html#M000086">done (Mongrel::HttpResponse)</a><br />
40
+ <a href="classes/Mongrel/HttpResponse.html#M000085">done= (Mongrel::HttpResponse)</a><br />
41
+ <a href="classes/Mongrel/StatisticsFilter.html#M000130">dump (Mongrel::StatisticsFilter)</a><br />
42
+ <a href="classes/Mongrel/Stats.html#M000142">dump (Mongrel::Stats)</a><br />
43
+ <a href="classes/MongrelDbg.html#M000010">end_trace (MongrelDbg)</a><br />
44
+ <a href="classes/Mongrel/CGIWrapper.html#M000121">env_table (Mongrel::CGIWrapper)</a><br />
45
+ <a href="classes/Mongrel/HttpParser.html#M000048">error? (Mongrel::HttpParser)</a><br />
46
+ <a href="classes/Mongrel/HttpRequest.html#M000136">escape (Mongrel::HttpRequest)</a><br />
47
+ <a href="classes/Mongrel/HttpParser.html#M000047">execute (Mongrel::HttpParser)</a><br />
48
+ <a href="classes/Mongrel/Command/Base.html#M000030">failure (Mongrel::Command::Base)</a><br />
49
+ <a href="classes/Mongrel/HttpParser.html#M000046">finish (Mongrel::HttpParser)</a><br />
50
+ <a href="classes/Mongrel/HttpResponse.html#M000084">finished (Mongrel::HttpResponse)</a><br />
51
+ <a href="classes/Mongrel/HttpParser.html#M000049">finished? (Mongrel::HttpParser)</a><br />
52
+ <a href="classes/Mongrel/HttpServer.html#M000060">graceful_shutdown (Mongrel::HttpServer)</a><br />
53
+ <a href="classes/Mongrel/CGIWrapper.html#M000116">header (Mongrel::CGIWrapper)</a><br />
54
+ <a href="classes/Mongrel/Command/Base.html#M000022">help (Mongrel::Command::Base)</a><br />
55
+ <a href="classes/TCPServer.html#M000006">initialize (TCPServer)</a><br />
56
+ <a href="classes/TCPServer.html#M000005">initialize_with_backlog (TCPServer)</a><br />
57
+ <a href="classes/Mongrel/URIClassifier.html#M000088">inspect (Mongrel::URIClassifier)</a><br />
58
+ <a href="classes/Mongrel/Configurator.html#M000110">join (Mongrel::Configurator)</a><br />
59
+ <a href="classes/Mongrel/Configurator.html#M000100">listener (Mongrel::Configurator)</a><br />
60
+ <a href="classes/Mongrel/Configurator.html#M000105">load_mime_map (Mongrel::Configurator)</a><br />
61
+ <a href="classes/Mongrel/Configurator.html#M000103">load_plugins (Mongrel::Configurator)</a><br />
62
+ <a href="classes/Mongrel/Configurator.html#M000104">load_yaml (Mongrel::Configurator)</a><br />
63
+ <a href="classes/Mutex.html#M000001">lock (Mutex)</a><br />
64
+ <a href="classes/Mongrel/Configurator.html#M000114">log (Mongrel::Configurator)</a><br />
65
+ <a href="classes/Kernel.html#M000013">log_open_files (Kernel)</a><br />
66
+ <a href="classes/Mongrel/Rails/RailsHandler.html#M000039">log_threads_waiting_for (Mongrel::Rails::RailsHandler)</a><br />
67
+ <a href="classes/Mongrel/Stats.html#M000144">mean (Mongrel::Stats)</a><br />
68
+ <a href="classes/Mongrel/Command/Base.html#M000019">new (Mongrel::Command::Base)</a><br />
69
+ <a href="classes/Mongrel/StatisticsFilter.html#M000128">new (Mongrel::StatisticsFilter)</a><br />
70
+ <a href="classes/Mongrel/Rails/RailsHandler.html#M000037">new (Mongrel::Rails::RailsHandler)</a><br />
71
+ <a href="classes/Mongrel/URIClassifier.html#M000089">new (Mongrel::URIClassifier)</a><br />
72
+ <a href="classes/Mongrel/Configurator.html#M000093">new (Mongrel::Configurator)</a><br />
73
+ <a href="classes/Mongrel/DirHandler.html#M000051">new (Mongrel::DirHandler)</a><br />
74
+ <a href="classes/Mongrel/RedirectHandler.html#M000131">new (Mongrel::RedirectHandler)</a><br />
75
+ <a href="classes/Mongrel/DeflateFilter.html#M000124">new (Mongrel::DeflateFilter)</a><br />
76
+ <a href="classes/Mongrel/HttpResponse.html#M000075">new (Mongrel::HttpResponse)</a><br />
77
+ <a href="classes/Mongrel/Camping/CampingHandler.html#M000042">new (Mongrel::Camping::CampingHandler)</a><br />
78
+ <a href="classes/Mongrel/HttpRequest.html#M000133">new (Mongrel::HttpRequest)</a><br />
79
+ <a href="classes/Mongrel/HttpServer.html#M000057">new (Mongrel::HttpServer)</a><br />
80
+ <a href="classes/Mongrel/CGIWrapper.html#M000115">new (Mongrel::CGIWrapper)</a><br />
81
+ <a href="classes/Mongrel/Error404Handler.html#M000126">new (Mongrel::Error404Handler)</a><br />
82
+ <a href="classes/Mongrel/Stats.html#M000139">new (Mongrel::Stats)</a><br />
83
+ <a href="classes/Mongrel/StatusHandler.html#M000068">new (Mongrel::StatusHandler)</a><br />
84
+ <a href="classes/Mongrel/HttpParser.html#M000044">new (Mongrel::HttpParser)</a><br />
85
+ <a href="classes/Mongrel/HttpHandlerPlugin.html#M000016">new (Mongrel::HttpHandlerPlugin)</a><br />
86
+ <a href="classes/Mongrel/HeaderOut.html#M000066">new (Mongrel::HeaderOut)</a><br />
87
+ <a href="classes/Mongrel/HttpParser.html#M000050">nread (Mongrel::HttpParser)</a><br />
88
+ <a href="classes/IO.html#M000003">open (IO)</a><br />
89
+ <a href="classes/Kernel.html#M000012">open (Kernel)</a><br />
90
+ <a href="classes/Mongrel/Command/Base.html#M000018">options (Mongrel::Command::Base)</a><br />
91
+ <a href="classes/Mongrel/CGIWrapper.html#M000118">out (Mongrel::CGIWrapper)</a><br />
92
+ <a href="classes/Mongrel/Configurator.html#M000106">plugin (Mongrel::Configurator)</a><br />
93
+ <a href="classes/Mongrel/Command/Registry.html#M000032">print_command_list (Mongrel::Command::Registry)</a><br />
94
+ <a href="classes/Mongrel/DirHandler.html#M000055">process (Mongrel::DirHandler)</a><br />
95
+ <a href="classes/Mongrel/DeflateFilter.html#M000125">process (Mongrel::DeflateFilter)</a><br />
96
+ <a href="classes/Mongrel/HttpHandler.html#M000074">process (Mongrel::HttpHandler)</a><br />
97
+ <a href="classes/Mongrel/StatusHandler.html#M000071">process (Mongrel::StatusHandler)</a><br />
98
+ <a href="classes/RequestLog/Access.html#M000147">process (RequestLog::Access)</a><br />
99
+ <a href="classes/Mongrel/Rails/RailsHandler.html#M000038">process (Mongrel::Rails::RailsHandler)</a><br />
100
+ <a href="classes/Mongrel/Camping/CampingHandler.html#M000043">process (Mongrel::Camping::CampingHandler)</a><br />
101
+ <a href="classes/RequestLog/Files.html#M000148">process (RequestLog::Files)</a><br />
102
+ <a href="classes/RequestLog/Threads.html#M000149">process (RequestLog::Threads)</a><br />
103
+ <a href="classes/Mongrel/Error404Handler.html#M000127">process (Mongrel::Error404Handler)</a><br />
104
+ <a href="classes/Mongrel/StatisticsFilter.html#M000129">process (Mongrel::StatisticsFilter)</a><br />
105
+ <a href="classes/Mongrel/HttpHandlerPlugin.html#M000017">process (Mongrel::HttpHandlerPlugin)</a><br />
106
+ <a href="classes/RequestLog/Objects.html#M000150">process (RequestLog::Objects)</a><br />
107
+ <a href="classes/Mongrel/RedirectHandler.html#M000132">process (Mongrel::RedirectHandler)</a><br />
108
+ <a href="classes/RequestLog/Params.html#M000151">process (RequestLog::Params)</a><br />
109
+ <a href="classes/Mongrel/HttpServer.html#M000058">process_client (Mongrel::HttpServer)</a><br />
110
+ <a href="classes/Mongrel/HttpRequest.html#M000138">query_parse (Mongrel::HttpRequest)</a><br />
111
+ <a href="classes/Mongrel/Rails/RailsConfigurator.html#M000034">rails (Mongrel::Rails::RailsConfigurator)</a><br />
112
+ <a href="classes/Mongrel/HttpRequest.html#M000134">read_body (Mongrel::HttpRequest)</a><br />
113
+ <a href="classes/Mongrel/HttpRequest.html#M000135">read_socket (Mongrel::HttpRequest)</a><br />
114
+ <a href="classes/Mongrel/HttpServer.html#M000059">reap_dead_workers (Mongrel::HttpServer)</a><br />
115
+ <a href="classes/Mongrel/Configurator.html#M000107">redirect (Mongrel::Configurator)</a><br />
116
+ <a href="classes/Mongrel/URIClassifier.html#M000090">register (Mongrel::URIClassifier)</a><br />
117
+ <a href="classes/Mongrel/HttpServer.html#M000063">register (Mongrel::HttpServer)</a><br />
118
+ <a href="classes/Mongrel/Rails/RailsHandler.html#M000040">reload! (Mongrel::Rails::RailsHandler)</a><br />
119
+ <a href="classes/Mongrel/Rails/RailsConfigurator.html#M000035">reload! (Mongrel::Rails::RailsConfigurator)</a><br />
120
+ <a href="classes/Mongrel/Configurator.html#M000095">remove_pid_file (Mongrel::Configurator)</a><br />
121
+ <a href="classes/Mongrel/HttpHandler.html#M000072">request_begins (Mongrel::HttpHandler)</a><br />
122
+ <a href="classes/Mongrel/HttpHandlerPlugin.html#M000014">request_begins (Mongrel::HttpHandlerPlugin)</a><br />
123
+ <a href="classes/Mongrel/HttpHandler.html#M000073">request_progress (Mongrel::HttpHandler)</a><br />
124
+ <a href="classes/Mongrel/HttpHandlerPlugin.html#M000015">request_progress (Mongrel::HttpHandlerPlugin)</a><br />
125
+ <a href="classes/Mongrel/HttpResponse.html#M000077">reset (Mongrel::HttpResponse)</a><br />
126
+ <a href="classes/Mongrel/HttpParser.html#M000045">reset (Mongrel::HttpParser)</a><br />
127
+ <a href="classes/Mongrel/Stats.html#M000140">reset (Mongrel::Stats)</a><br />
128
+ <a href="classes/Mongrel/URIClassifier.html#M000092">resolve (Mongrel::URIClassifier)</a><br />
129
+ <a href="classes/Mongrel/Configurator.html#M000099">resolve_defaults (Mongrel::Configurator)</a><br />
130
+ <a href="classes/Mongrel/Command/Base.html#M000023">run (Mongrel::Command::Base)</a><br />
131
+ <a href="classes/Mongrel/Configurator.html#M000108">run (Mongrel::Configurator)</a><br />
132
+ <a href="classes/Mongrel/Command/Registry.html#M000033">run (Mongrel::Command::Registry)</a><br />
133
+ <a href="classes/Mongrel/HttpServer.html#M000062">run (Mongrel::HttpServer)</a><br />
134
+ <a href="classes/Mongrel/Configurator.html#M000112">run_config (Mongrel::Configurator)</a><br />
135
+ <a href="classes/Mongrel/Stats.html#M000141">sample (Mongrel::Stats)</a><br />
136
+ <a href="classes/Mongrel/Stats.html#M000145">sd (Mongrel::Stats)</a><br />
137
+ <a href="classes/Mongrel/HttpResponse.html#M000080">send_body (Mongrel::HttpResponse)</a><br />
138
+ <a href="classes/Mongrel/CGIWrapper.html#M000117">send_cookies (Mongrel::CGIWrapper)</a><br />
139
+ <a href="classes/Mongrel/DirHandler.html#M000053">send_dir_listing (Mongrel::DirHandler)</a><br />
140
+ <a href="classes/Mongrel/DirHandler.html#M000054">send_file (Mongrel::DirHandler)</a><br />
141
+ <a href="classes/Mongrel/HttpResponse.html#M000081">send_file (Mongrel::HttpResponse)</a><br />
142
+ <a href="classes/Mongrel/HttpResponse.html#M000079">send_header (Mongrel::HttpResponse)</a><br />
143
+ <a href="classes/Mongrel/HttpResponse.html#M000078">send_status (Mongrel::HttpResponse)</a><br />
144
+ <a href="classes/Mongrel/Rails/RailsConfigurator.html#M000036">setup_rails_signals (Mongrel::Rails::RailsConfigurator)</a><br />
145
+ <a href="classes/Mongrel/Configurator.html#M000113">setup_signals (Mongrel::Configurator)</a><br />
146
+ <a href="classes/Mongrel/HttpResponse.html#M000082">socket_error (Mongrel::HttpResponse)</a><br />
147
+ <a href="classes/Mongrel/Camping.html#M000041">start (Mongrel::Camping)</a><br />
148
+ <a href="classes/Mongrel/HttpResponse.html#M000076">start (Mongrel::HttpResponse)</a><br />
149
+ <a href="classes/Mongrel/CGIWrapper.html#M000119">status (Mongrel::CGIWrapper)</a><br />
150
+ <a href="classes/Mongrel/CGIWrapper.html#M000122">stdinput (Mongrel::CGIWrapper)</a><br />
151
+ <a href="classes/Mongrel/CGIWrapper.html#M000123">stdoutput (Mongrel::CGIWrapper)</a><br />
152
+ <a href="classes/Mongrel/Configurator.html#M000109">stop (Mongrel::Configurator)</a><br />
153
+ <a href="classes/Mongrel/HttpServer.html#M000065">stop (Mongrel::HttpServer)</a><br />
154
+ <a href="classes/Mongrel/StatusHandler.html#M000069">table (Mongrel::StatusHandler)</a><br />
155
+ <a href="classes/Mongrel/Stats.html#M000146">tick (Mongrel::Stats)</a><br />
156
+ <a href="classes/Mongrel/Stats.html#M000143">to_s (Mongrel::Stats)</a><br />
157
+ <a href="classes/MongrelDbg.html#M000008">trace (MongrelDbg)</a><br />
158
+ <a href="classes/MongrelDbg.html#M000011">tracing? (MongrelDbg)</a><br />
159
+ <a href="classes/Mongrel/HttpRequest.html#M000137">unescape (Mongrel::HttpRequest)</a><br />
160
+ <a href="classes/Mutex.html#M000002">unlock (Mutex)</a><br />
161
+ <a href="classes/Mongrel/HttpServer.html#M000064">unregister (Mongrel::HttpServer)</a><br />
162
+ <a href="classes/Mongrel/URIClassifier.html#M000091">unregister (Mongrel::URIClassifier)</a><br />
163
+ <a href="classes/Mongrel/Configurator.html#M000101">uri (Mongrel::Configurator)</a><br />
164
+ <a href="classes/Mongrel/URIClassifier.html#M000087">uris (Mongrel::URIClassifier)</a><br />
165
+ <a href="classes/Mongrel/Command/Base.html#M000024">valid? (Mongrel::Command::Base)</a><br />
166
+ <a href="classes/Mongrel/Command/Base.html#M000027">valid_dir? (Mongrel::Command::Base)</a><br />
167
+ <a href="classes/Mongrel/Command/Base.html#M000025">valid_exists? (Mongrel::Command::Base)</a><br />
168
+ <a href="classes/Mongrel/Command/Base.html#M000026">valid_file? (Mongrel::Command::Base)</a><br />
169
+ <a href="classes/Mongrel/Command/Base.html#M000029">valid_group? (Mongrel::Command::Base)</a><br />
170
+ <a href="classes/Mongrel/Command/Base.html#M000028">valid_user? (Mongrel::Command::Base)</a><br />
171
+ <a href="classes/Mongrel/Command/Base.html#M000021">validate (Mongrel::Command::Base)</a><br />
172
+ <a href="classes/Mongrel/HttpResponse.html#M000083">write (Mongrel::HttpResponse)</a><br />
173
+ <a href="classes/Mongrel/Configurator.html#M000096">write_pid_file (Mongrel::Configurator)</a><br />
171
174
  </div>
172
175
  </div>
173
176
  </body>
@@ -54,7 +54,7 @@ static VALUE global_port_80;
54
54
  /* Defines the maximum allowed lengths for various input elements.*/
55
55
  DEF_MAX_LENGTH(FIELD_NAME, 256);
56
56
  DEF_MAX_LENGTH(FIELD_VALUE, 80 * 1024);
57
- DEF_MAX_LENGTH(REQUEST_URI, 1024 * 2);
57
+ DEF_MAX_LENGTH(REQUEST_URI, 1024 * 12);
58
58
  DEF_MAX_LENGTH(REQUEST_PATH, 1024);
59
59
  DEF_MAX_LENGTH(QUERY_STRING, (1024 * 10));
60
60
  DEF_MAX_LENGTH(HEADER, (1024 * (80 + 32)));
@@ -556,7 +556,7 @@ void Init_http11()
556
556
  DEF_GLOBAL(server_protocol, "SERVER_PROTOCOL");
557
557
  DEF_GLOBAL(server_protocol_value, "HTTP/1.1");
558
558
  DEF_GLOBAL(http_host, "HTTP_HOST");
559
- DEF_GLOBAL(mongrel_version, "Mongrel 0.3.13.4");
559
+ DEF_GLOBAL(mongrel_version, "Mongrel 1.0");
560
560
  DEF_GLOBAL(server_software, "SERVER_SOFTWARE");
561
561
  DEF_GLOBAL(port_80, "80");
562
562
 
@@ -6,10 +6,18 @@
6
6
 
7
7
  $mongrel_debug_client = false
8
8
 
9
+ require 'rubygems'
9
10
  require 'socket'
10
11
  require 'http11'
11
12
  require 'tempfile'
12
- require 'thread'
13
+ begin
14
+ require 'fastthread'
15
+ rescue RuntimeError => e
16
+ warn "fastthread not loaded: #{ e.message }"
17
+ rescue LoadError
18
+ ensure
19
+ require 'thread'
20
+ end
13
21
  require 'stringio'
14
22
  require 'mongrel/cgi'
15
23
  require 'mongrel/handlers'
@@ -18,8 +26,8 @@ require 'mongrel/tcphack'
18
26
  require 'yaml'
19
27
  require 'mongrel/configurator'
20
28
  require 'time'
21
- require 'rubygems'
22
29
  require 'etc'
30
+ require 'uri'
23
31
 
24
32
 
25
33
  # Mongrel module containing all of the classes (include C extensions) for running
@@ -47,6 +55,7 @@ module Mongrel
47
55
  # Used to stop the HttpServer via Thread.raise.
48
56
  class StopServer < Exception; end
49
57
 
58
+
50
59
  # Thrown at a thread when it is timed out.
51
60
  class TimeoutError < Exception; end
52
61
 
@@ -95,7 +104,6 @@ module Mongrel
95
104
  }
96
105
 
97
106
 
98
-
99
107
  # Frequently used constants when constructing requests or responses. Many times
100
108
  # the constant just refers to a string with the same contents. Using these constants
101
109
  # gave about a 3% to 10% performance improvement over using the strings directly.
@@ -117,9 +125,8 @@ module Mongrel
117
125
  REQUEST_URI='REQUEST_URI'.freeze
118
126
  REQUEST_PATH='REQUEST_PATH'.freeze
119
127
 
120
- MONGREL_VERSION="0.3.13.4".freeze
128
+ MONGREL_VERSION="1.0".freeze
121
129
 
122
- # TODO: this use of a base for tempfiles needs to be looked at for security problems
123
130
  MONGREL_TMP_BASE="mongrel".freeze
124
131
 
125
132
  # The standard empty 404 response for bad requests. Use Error4040Handler for custom stuff.
@@ -158,13 +165,16 @@ module Mongrel
158
165
  HTTP_IF_MODIFIED_SINCE="HTTP_IF_MODIFIED_SINCE".freeze
159
166
  HTTP_IF_NONE_MATCH="HTTP_IF_NONE_MATCH".freeze
160
167
  REDIRECT = "HTTP/1.1 302 Found\r\nLocation: %s\r\nConnection: close\r\n\r\n".freeze
168
+ HOST = "HOST".freeze
161
169
  end
162
170
 
171
+
163
172
  # Basically a Hash with one extra parameter for the HTTP body, mostly used internally.
164
173
  class HttpParams < Hash
165
174
  attr_accessor :http_body
166
175
  end
167
176
 
177
+
168
178
  # When a handler is found for a registered URI then this class is constructed
169
179
  # and passed to your HttpHandler::process method. You should assume that
170
180
  # *one* handler processes all requests. Included in the HttpRequest is a
@@ -185,23 +195,24 @@ module Mongrel
185
195
  # You don't really call this. It's made for you.
186
196
  # Main thing it does is hook up the params, and store any remaining
187
197
  # body data into the HttpRequest.body attribute.
188
- #
189
- # TODO: Implement tempfile removal when the request is done.
190
- def initialize(params, socket, dispatcher)
198
+ def initialize(params, socket, dispatchers)
191
199
  @params = params
192
200
  @socket = socket
193
- content_length = params[Const::CONTENT_LENGTH].to_i
194
- remain = content_length - params.http_body.length
201
+ @dispatchers = dispatchers
202
+ content_length = @params[Const::CONTENT_LENGTH].to_i
203
+ remain = content_length - @params.http_body.length
195
204
 
196
-
197
- dispatcher.request_begins(params) if dispatcher
205
+ # tell all dispatchers the request has begun
206
+ @dispatchers.each do |dispatcher|
207
+ dispatcher.request_begins(@params)
208
+ end unless @dispatchers.nil? || @dispatchers.empty?
198
209
 
199
210
  # Some clients (like FF1.0) report 0 for body and then send a body. This will probably truncate them but at least the request goes through usually.
200
211
  if remain <= 0
201
212
  # we've got everything, pack it up
202
213
  @body = StringIO.new
203
- @body.write params.http_body
204
- dispatcher.request_progress(params, 0, content_length) if dispatcher
214
+ @body.write @params.http_body
215
+ update_request_progress(0, content_length)
205
216
  elsif remain > 0
206
217
  # must read more data to complete body
207
218
  if remain > Const::MAX_BODY
@@ -213,30 +224,42 @@ module Mongrel
213
224
  @body = StringIO.new
214
225
  end
215
226
 
216
- @body.write params.http_body
217
- read_body(remain, content_length, dispatcher)
227
+ @body.write @params.http_body
228
+ read_body(remain, content_length)
218
229
  end
219
230
 
220
- @body.rewind if body
231
+ @body.rewind if @body
221
232
  end
222
233
 
234
+ # updates all dispatchers about our progress
235
+ def update_request_progress(clen, total)
236
+ return if @dispatchers.nil? || @dispatchers.empty?
237
+ @dispatchers.each do |dispatcher|
238
+ dispatcher.request_progress(@params, clen, total)
239
+ end
240
+ end
241
+ private :update_request_progress
223
242
 
224
243
  # Does the heavy lifting of properly reading the larger body requests in
225
244
  # small chunks. It expects @body to be an IO object, @socket to be valid,
226
245
  # and will set @body = nil if the request fails. It also expects any initial
227
246
  # part of the body that has been read to be in the @body already.
228
- def read_body(remain, total, dispatcher)
247
+ def read_body(remain, total)
229
248
  begin
230
249
  # write the odd sized chunk first
250
+ @params.http_body = read_socket(remain % Const::CHUNK_SIZE)
251
+
252
+ remain -= @body.write(@params.http_body)
231
253
 
232
- remain -= @body.write(read_socket(remain % Const::CHUNK_SIZE))
233
- dispatcher.request_progress(params, remain, total) if dispatcher
254
+ update_request_progress(remain, total)
234
255
 
235
256
  # then stream out nothing but perfectly sized chunks
236
257
  until remain <= 0 or @socket.closed?
237
- remain -= @body.write(read_socket(Const::CHUNK_SIZE))
238
258
  # ASSUME: we are writing to a disk and these writes always write the requested amount
239
- dispatcher.request_progress(params, remain, total) if dispatcher
259
+ @params.http_body = read_socket(Const::CHUNK_SIZE)
260
+ remain -= @body.write(@params.http_body)
261
+
262
+ update_request_progress(remain, total)
240
263
  end
241
264
  rescue Object
242
265
  STDERR.puts "ERROR reading http body: #$!"
@@ -247,7 +270,7 @@ module Mongrel
247
270
  @body = nil # signals that there was a problem
248
271
  end
249
272
  end
250
-
273
+
251
274
  def read_socket(len)
252
275
  if !@socket.closed?
253
276
  data = @socket.read(len)
@@ -313,17 +336,25 @@ module Mongrel
313
336
  # semantics for Hash (where doing an insert replaces) is not there.
314
337
  class HeaderOut
315
338
  attr_reader :out
339
+ attr_accessor :allowed_duplicates
316
340
 
317
341
  def initialize(out)
342
+ @sent = {}
343
+ @allowed_duplicates = {"Set-Cookie" => true, "Set-Cookie2" => true,
344
+ "Warning" => true, "WWW-Authenticate" => true}
318
345
  @out = out
319
346
  end
320
347
 
321
348
  # Simply writes "#{key}: #{value}" to an output buffer.
322
349
  def[]=(key,value)
323
- @out.write(Const::HEADER_FORMAT % [key, value])
350
+ if not @sent.has_key?(key) or @allowed_duplicates.has_key?(key)
351
+ @sent[key] = true
352
+ @out.write(Const::HEADER_FORMAT % [key, value])
353
+ end
324
354
  end
325
355
  end
326
356
 
357
+
327
358
  # Writes and controls your response to the client using the HTTP/1.1 specification.
328
359
  # You use it by simply doing:
329
360
  #
@@ -484,6 +515,7 @@ module Mongrel
484
515
 
485
516
  end
486
517
 
518
+
487
519
  # This is the main driver of Mongrel, while the Mongrel::HttpParser and Mongrel::URIClassifier
488
520
  # make up the majority of how the server functions. It's a very simple class that just
489
521
  # has a thread accepting connections and a simple HttpServer.process_client function
@@ -524,8 +556,6 @@ module Mongrel
524
556
  # The timeout parameter is a sleep timeout (in hundredths of a second) that is placed between
525
557
  # socket.accept calls in order to give the server a cheap throttle time. It defaults to 0 and
526
558
  # actually if it is 0 then the sleep is not done at all.
527
- #
528
- # TODO: Find out if anyone actually uses the timeout option since it seems to cause problems on FBSD.
529
559
  def initialize(host, port, num_processors=(2**30-1), timeout=0)
530
560
  @socket = TCPServer.new(host, port)
531
561
  @classifier = URIClassifier.new
@@ -537,7 +567,6 @@ module Mongrel
537
567
  @death_time = 60
538
568
  end
539
569
 
540
-
541
570
  # Does the majority of the IO processing. It has been written in Ruby using
542
571
  # about 7 different IO processing strategies and no matter how it's done
543
572
  # the performance just does not improve. It is currently carefully constructed
@@ -559,15 +588,24 @@ module Mongrel
559
588
  nparsed = parser.execute(params, data, nparsed)
560
589
 
561
590
  if parser.finished?
591
+ if not params[Const::REQUEST_PATH]
592
+ # it might be a dumbass full host request header
593
+ uri = URI.parse(params[Const::REQUEST_URI])
594
+ params[Const::REQUEST_PATH] = uri.request_uri
595
+ end
596
+
597
+ raise "No REQUEST PATH" if not params[Const::REQUEST_PATH]
598
+
562
599
  script_name, path_info, handlers = @classifier.resolve(params[Const::REQUEST_PATH])
563
600
 
564
601
  if handlers
565
602
  params[Const::PATH_INFO] = path_info
566
603
  params[Const::SCRIPT_NAME] = script_name
567
604
  params[Const::REMOTE_ADDR] = params[Const::HTTP_X_FORWARDED_FOR] || client.peeraddr.last
568
- notifier = handlers[0].request_notify ? handlers[0] : nil
569
605
 
570
- request = HttpRequest.new(params, client, notifier)
606
+ # select handlers that want more detailed request notification
607
+ notifiers = handlers.select { |h| h.request_notify }
608
+ request = HttpRequest.new(params, client, notifiers)
571
609
 
572
610
  # in the case of large file uploads the user could close the socket, so skip those requests
573
611
  break if request.body == nil # nil signals from HttpRequest::initialize that the request was aborted
@@ -654,10 +692,17 @@ module Mongrel
654
692
  end
655
693
 
656
694
  def configure_socket_options
657
- if /linux/ === RUBY_PLATFORM
695
+ case RUBY_PLATFORM
696
+ when /linux/
658
697
  # 9 is currently TCP_DEFER_ACCEPT
659
- $tcp_defer_accept_opts = [9,1]
660
- $tcp_cork_opts = [3,1]
698
+ $tcp_defer_accept_opts = [Socket::SOL_TCP, 9, 1]
699
+ $tcp_cork_opts = [Socket::SOL_TCP, 3, 1]
700
+ when /freebsd/
701
+ # Use the HTTP accept filter if available.
702
+ # The struct made by pack() is defined in /usr/include/sys/socket.h as accept_filter_arg
703
+ unless `/sbin/sysctl -nq net.inet.accf.http`.empty?
704
+ $tcp_defer_accept_opts = [Socket::SOL_SOCKET, Socket::SO_ACCEPTFILTER, ['httpready', nil].pack('a16a240')]
705
+ end
661
706
  end
662
707
  end
663
708
 
@@ -668,13 +713,18 @@ module Mongrel
668
713
 
669
714
  configure_socket_options
670
715
 
671
- @socket.setsockopt(Socket::SOL_TCP, $tcp_defer_accept_opts[0], $tcp_defer_accept_opts[1]) if $tcp_defer_accept_opts
716
+ if $tcp_defer_accept_opts
717
+ @socket.setsockopt(*$tcp_defer_accept_opts) rescue nil
718
+ end
672
719
 
673
720
  @acceptor = Thread.new do
674
721
  while true
675
722
  begin
676
723
  client = @socket.accept
677
- client.setsockopt(Socket::SOL_TCP, $tcp_cork_opts[0], $tcp_cork_opts[1]) if $tcp_cork_opts
724
+
725
+ if $tcp_cork_opts
726
+ client.setsockopt(*$tcp_cork_opts) rescue nil
727
+ end
678
728
 
679
729
  worker_list = @workers.list
680
730
 
@@ -683,8 +733,7 @@ module Mongrel
683
733
  client.close rescue Object
684
734
  reap_dead_workers("max processors")
685
735
  else
686
- thread = Thread.new { process_client(client) }
687
- thread.abort_on_exception = true
736
+ thread = Thread.new(client) {|c| process_client(c) }
688
737
  thread[:started_on] = Time.now
689
738
  @workers.add(thread)
690
739
 
@@ -704,14 +753,12 @@ module Mongrel
704
753
  STDERR.puts $!.backtrace.join("\n") if $mongrel_debug_client
705
754
  end
706
755
  end
707
-
708
756
  graceful_shutdown
709
757
  end
710
758
 
711
759
  return @acceptor
712
760
  end
713
761
 
714
-
715
762
  # Simply registers a handler with the internal URIClassifier. When the URI is
716
763
  # found in the prefix of a request then your handler's HttpHandler::process method
717
764
  # is called. See Mongrel::URIClassifier#register for more information.