mongrel 0.3.13.3 → 0.3.13.4

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 (258) hide show
  1. data/Rakefile +5 -4
  2. data/bin/mongrel_rails +162 -169
  3. data/doc/rdoc/classes/IO.src/M000001.html +5 -5
  4. data/doc/rdoc/classes/IO.src/M000002.html +5 -5
  5. data/doc/rdoc/classes/Kernel.html +10 -10
  6. data/doc/rdoc/classes/Kernel.src/M000010.html +19 -0
  7. data/doc/rdoc/classes/Kernel.src/M000011.html +23 -0
  8. data/doc/rdoc/classes/Mongrel.html +27 -10
  9. data/doc/rdoc/classes/Mongrel/CGIWrapper.html +67 -54
  10. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000101.html → M000112.html} +11 -10
  11. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000102.html → M000113.html} +31 -31
  12. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000103.html → M000114.html} +20 -20
  13. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000115.html +32 -0
  14. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000105.html → M000116.html} +11 -11
  15. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000106.html → M000117.html} +4 -4
  16. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000107.html → M000118.html} +4 -4
  17. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000108.html → M000119.html} +4 -4
  18. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/{M000109.html → M000120.html} +5 -5
  19. data/doc/rdoc/classes/Mongrel/Camping.html +5 -5
  20. data/doc/rdoc/classes/Mongrel/Camping.src/{M000048.html → M000039.html} +0 -0
  21. data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.html +10 -10
  22. data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/{M000049.html → M000040.html} +0 -0
  23. data/doc/rdoc/classes/Mongrel/Camping/CampingHandler.src/{M000050.html → M000041.html} +0 -0
  24. data/doc/rdoc/classes/Mongrel/Command/Base.html +65 -65
  25. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000016.html +24 -0
  26. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000017.html +42 -0
  27. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000018.html +18 -0
  28. data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000029.html → M000019.html} +0 -0
  29. data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000030.html → M000020.html} +0 -0
  30. data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000031.html → M000021.html} +0 -0
  31. data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000032.html → M000022.html} +0 -0
  32. data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000033.html → M000023.html} +0 -0
  33. data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000034.html → M000024.html} +0 -0
  34. data/doc/rdoc/classes/Mongrel/Command/Base.src/{M000035.html → M000025.html} +0 -0
  35. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000026.html +11 -11
  36. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000027.html +11 -29
  37. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000028.html +5 -5
  38. data/doc/rdoc/classes/Mongrel/Command/Registry.html +15 -15
  39. data/doc/rdoc/classes/Mongrel/Command/Registry.src/{M000039.html → M000029.html} +0 -0
  40. data/doc/rdoc/classes/Mongrel/Command/Registry.src/{M000040.html → M000030.html} +10 -6
  41. data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000031.html +58 -0
  42. data/doc/rdoc/classes/Mongrel/Configurator.html +115 -115
  43. data/doc/rdoc/classes/Mongrel/Configurator.src/M000091.html +27 -0
  44. data/doc/rdoc/classes/Mongrel/Configurator.src/M000092.html +31 -0
  45. data/doc/rdoc/classes/Mongrel/Configurator.src/M000093.html +21 -0
  46. data/doc/rdoc/classes/Mongrel/Configurator.src/M000094.html +20 -0
  47. data/doc/rdoc/classes/Mongrel/Configurator.src/M000095.html +23 -0
  48. data/doc/rdoc/classes/Mongrel/Configurator.src/{M000115.html → M000096.html} +4 -4
  49. data/doc/rdoc/classes/Mongrel/Configurator.src/{M000116.html → M000097.html} +24 -24
  50. data/doc/rdoc/classes/Mongrel/Configurator.src/{M000117.html → M000098.html} +5 -5
  51. data/doc/rdoc/classes/Mongrel/Configurator.src/M000099.html +39 -0
  52. data/doc/rdoc/classes/Mongrel/Configurator.src/{M000119.html → M000100.html} +19 -19
  53. data/doc/rdoc/classes/Mongrel/Configurator.src/{M000120.html → M000101.html} +4 -4
  54. data/doc/rdoc/classes/Mongrel/Configurator.src/{M000121.html → M000102.html} +10 -10
  55. data/doc/rdoc/classes/Mongrel/Configurator.src/{M000122.html → M000103.html} +5 -5
  56. data/doc/rdoc/classes/Mongrel/Configurator.src/{M000123.html → M000104.html} +4 -4
  57. data/doc/rdoc/classes/Mongrel/Configurator.src/{M000124.html → M000105.html} +8 -8
  58. data/doc/rdoc/classes/Mongrel/Configurator.src/M000106.html +22 -0
  59. data/doc/rdoc/classes/Mongrel/Configurator.src/{M000126.html → M000107.html} +4 -4
  60. data/doc/rdoc/classes/Mongrel/Configurator.src/M000108.html +34 -0
  61. data/doc/rdoc/classes/Mongrel/Configurator.src/M000109.html +18 -0
  62. data/doc/rdoc/classes/Mongrel/Configurator.src/M000110.html +23 -14
  63. data/doc/rdoc/classes/Mongrel/Configurator.src/M000111.html +5 -18
  64. data/doc/rdoc/classes/Mongrel/Const.html +11 -6
  65. data/doc/rdoc/classes/Mongrel/DeflateFilter.html +10 -10
  66. data/doc/rdoc/classes/Mongrel/DeflateFilter.src/{M000099.html → M000121.html} +5 -5
  67. data/doc/rdoc/classes/Mongrel/DeflateFilter.src/{M000100.html → M000122.html} +14 -14
  68. data/doc/rdoc/classes/Mongrel/DirHandler.html +31 -31
  69. data/doc/rdoc/classes/Mongrel/DirHandler.src/{M000058.html → M000049.html} +0 -0
  70. data/doc/rdoc/classes/Mongrel/DirHandler.src/{M000059.html → M000050.html} +0 -0
  71. data/doc/rdoc/classes/Mongrel/DirHandler.src/{M000060.html → M000051.html} +12 -16
  72. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000052.html +63 -0
  73. data/doc/rdoc/classes/Mongrel/DirHandler.src/{M000062.html → M000053.html} +25 -25
  74. data/doc/rdoc/classes/Mongrel/DirHandler.src/{M000063.html → M000054.html} +4 -4
  75. data/doc/rdoc/classes/Mongrel/Error404Handler.html +10 -10
  76. data/doc/rdoc/classes/Mongrel/Error404Handler.src/{M000131.html → M000123.html} +0 -0
  77. data/doc/rdoc/classes/Mongrel/Error404Handler.src/{M000132.html → M000124.html} +0 -0
  78. data/doc/rdoc/classes/Mongrel/HeaderOut.html +10 -10
  79. data/doc/rdoc/classes/Mongrel/HeaderOut.src/{M000072.html → M000064.html} +4 -4
  80. data/doc/rdoc/classes/Mongrel/HeaderOut.src/{M000073.html → M000065.html} +4 -4
  81. data/doc/rdoc/classes/Mongrel/HttpHandler.html +15 -15
  82. data/doc/rdoc/classes/Mongrel/HttpHandler.src/{M000078.html → M000070.html} +0 -0
  83. data/doc/rdoc/classes/Mongrel/HttpHandler.src/{M000079.html → M000071.html} +0 -0
  84. data/doc/rdoc/classes/Mongrel/HttpHandler.src/{M000080.html → M000072.html} +0 -0
  85. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.html +20 -20
  86. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/{M000022.html → M000012.html} +0 -0
  87. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/{M000023.html → M000013.html} +0 -0
  88. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/{M000024.html → M000014.html} +0 -0
  89. data/doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src/{M000025.html → M000015.html} +0 -0
  90. data/doc/rdoc/classes/Mongrel/HttpParams.html +131 -0
  91. data/doc/rdoc/classes/Mongrel/HttpParser.html +35 -35
  92. data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000051.html → M000042.html} +1 -1
  93. data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000052.html → M000043.html} +1 -1
  94. data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000053.html → M000044.html} +1 -1
  95. data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000054.html → M000045.html} +3 -3
  96. data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000055.html → M000046.html} +1 -1
  97. data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000056.html → M000047.html} +1 -1
  98. data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000057.html → M000048.html} +1 -1
  99. data/doc/rdoc/classes/Mongrel/HttpRequest.html +63 -24
  100. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000130.html +47 -0
  101. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000131.html +37 -0
  102. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000132.html +29 -0
  103. data/doc/rdoc/classes/Mongrel/HttpRequest.src/{M000139.html → M000133.html} +6 -6
  104. data/doc/rdoc/classes/Mongrel/HttpRequest.src/{M000140.html → M000134.html} +6 -6
  105. data/doc/rdoc/classes/Mongrel/HttpRequest.src/{M000141.html → M000135.html} +18 -18
  106. data/doc/rdoc/classes/Mongrel/HttpResponse.html +66 -72
  107. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000073.html +25 -0
  108. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000074.html +20 -0
  109. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000075.html +26 -0
  110. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000076.html +22 -0
  111. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000085.html → M000077.html} +8 -8
  112. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000086.html → M000078.html} +8 -8
  113. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000079.html +31 -0
  114. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000088.html → M000080.html} +7 -7
  115. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000081.html +7 -12
  116. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000082.html +7 -7
  117. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000083.html +7 -12
  118. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000084.html +5 -9
  119. data/doc/rdoc/classes/Mongrel/HttpServer.html +58 -43
  120. data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000064.html → M000055.html} +11 -11
  121. data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000065.html → M000056.html} +76 -72
  122. data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000066.html → M000057.html} +18 -17
  123. data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000067.html → M000058.html} +7 -7
  124. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000059.html +22 -0
  125. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000060.html +62 -0
  126. data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000069.html → M000061.html} +20 -20
  127. data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000070.html → M000062.html} +4 -4
  128. data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000071.html → M000063.html} +8 -8
  129. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.html +15 -15
  130. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/{M000042.html → M000032.html} +23 -25
  131. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/{M000043.html → M000033.html} +11 -11
  132. data/doc/rdoc/classes/Mongrel/Rails/RailsConfigurator.src/{M000044.html → M000034.html} +12 -12
  133. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.html +30 -15
  134. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/{M000045.html → M000035.html} +9 -8
  135. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000036.html +54 -0
  136. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000037.html +21 -0
  137. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000038.html +25 -0
  138. data/doc/rdoc/classes/Mongrel/RedirectHandler.html +10 -10
  139. data/doc/rdoc/classes/Mongrel/RedirectHandler.src/{M000136.html → M000128.html} +8 -8
  140. data/doc/rdoc/classes/Mongrel/RedirectHandler.src/{M000137.html → M000129.html} +13 -13
  141. data/doc/rdoc/classes/Mongrel/StatisticsFilter.html +16 -16
  142. data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/M000125.html +24 -0
  143. data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/{M000134.html → M000126.html} +10 -10
  144. data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/{M000135.html → M000127.html} +4 -4
  145. data/doc/rdoc/classes/{Stats.html → Mongrel/Stats.html} +44 -60
  146. data/doc/rdoc/classes/Mongrel/Stats.src/M000136.html +19 -0
  147. data/doc/rdoc/classes/Mongrel/Stats.src/M000137.html +23 -0
  148. data/doc/rdoc/classes/Mongrel/Stats.src/M000138.html +26 -0
  149. data/doc/rdoc/classes/Mongrel/Stats.src/M000139.html +18 -0
  150. data/doc/rdoc/classes/{Stats.src/M000009.html → Mongrel/Stats.src/M000140.html} +6 -6
  151. data/doc/rdoc/classes/Mongrel/Stats.src/M000141.html +18 -0
  152. data/doc/rdoc/classes/Mongrel/Stats.src/M000142.html +23 -0
  153. data/doc/rdoc/classes/Mongrel/Stats.src/M000143.html +20 -0
  154. data/doc/rdoc/classes/Mongrel/StatusHandler.html +20 -20
  155. data/doc/rdoc/classes/Mongrel/StatusHandler.src/{M000074.html → M000066.html} +4 -4
  156. data/doc/rdoc/classes/Mongrel/StatusHandler.src/{M000075.html → M000067.html} +10 -10
  157. data/doc/rdoc/classes/Mongrel/StatusHandler.src/{M000076.html → M000068.html} +28 -28
  158. data/doc/rdoc/classes/Mongrel/StatusHandler.src/{M000077.html → M000069.html} +6 -6
  159. data/doc/rdoc/classes/Mongrel/URIClassifier.html +30 -30
  160. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000093.html → M000085.html} +4 -4
  161. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000094.html → M000086.html} +4 -4
  162. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000095.html → M000087.html} +0 -0
  163. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000096.html → M000088.html} +1 -1
  164. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000097.html → M000089.html} +0 -0
  165. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000098.html → M000090.html} +1 -1
  166. data/doc/rdoc/classes/MongrelDbg.html +26 -26
  167. data/doc/rdoc/classes/MongrelDbg.src/M000005.html +24 -0
  168. data/doc/rdoc/classes/MongrelDbg.src/{M000016.html → M000006.html} +6 -6
  169. data/doc/rdoc/classes/MongrelDbg.src/{M000017.html → M000007.html} +8 -8
  170. data/doc/rdoc/classes/MongrelDbg.src/{M000018.html → M000008.html} +7 -7
  171. data/doc/rdoc/classes/MongrelDbg.src/{M000019.html → M000009.html} +4 -4
  172. data/doc/rdoc/classes/RequestLog/Access.html +5 -5
  173. data/doc/rdoc/classes/RequestLog/Access.src/{M000142.html → M000144.html} +5 -5
  174. data/doc/rdoc/classes/RequestLog/Files.html +5 -5
  175. data/doc/rdoc/classes/RequestLog/Files.src/{M000143.html → M000145.html} +5 -5
  176. data/doc/rdoc/classes/RequestLog/Objects.html +12 -6
  177. data/doc/rdoc/classes/RequestLog/Objects.src/M000147.html +51 -0
  178. data/doc/rdoc/classes/RequestLog/Params.html +5 -5
  179. data/doc/rdoc/classes/RequestLog/Params.src/{M000146.html → M000148.html} +5 -5
  180. data/doc/rdoc/classes/RequestLog/Threads.html +5 -5
  181. data/doc/rdoc/classes/RequestLog/Threads.src/{M000144.html → M000146.html} +20 -20
  182. data/doc/rdoc/classes/{ObjectTracker.html → Sync.html} +26 -45
  183. data/doc/rdoc/created.rid +1 -1
  184. data/doc/rdoc/files/COPYING.html +1 -1
  185. data/doc/rdoc/files/LICENSE.html +1 -1
  186. data/doc/rdoc/files/README.html +1 -1
  187. data/doc/rdoc/files/ext/http11/http11_c.html +1 -1
  188. data/doc/rdoc/files/lib/mongrel/camping_rb.html +1 -1
  189. data/doc/rdoc/files/lib/mongrel/cgi_rb.html +1 -1
  190. data/doc/rdoc/files/lib/mongrel/command_rb.html +1 -1
  191. data/doc/rdoc/files/lib/mongrel/configurator_rb.html +111 -0
  192. data/doc/rdoc/files/lib/mongrel/debug_rb.html +1 -1
  193. data/doc/rdoc/files/lib/mongrel/handlers_rb.html +1 -1
  194. data/doc/rdoc/files/lib/mongrel/init_rb.html +1 -1
  195. data/doc/rdoc/files/lib/mongrel/rails_rb.html +2 -1
  196. data/doc/rdoc/files/lib/mongrel/stats_rb.html +1 -1
  197. data/doc/rdoc/files/lib/mongrel/tcphack_rb.html +1 -1
  198. data/doc/rdoc/files/lib/mongrel_rb.html +2 -4
  199. data/doc/rdoc/fr_class_index.html +3 -2
  200. data/doc/rdoc/fr_file_index.html +1 -0
  201. data/doc/rdoc/fr_method_index.html +144 -142
  202. data/ext/http11/http11.c +69 -52
  203. data/ext/http11/http11_parser.c +366 -282
  204. data/ext/http11/http11_parser.h +2 -0
  205. data/ext/http11/http11_parser.rl +192 -0
  206. data/lib/mongrel.rb +127 -433
  207. data/lib/mongrel/cgi.rb +19 -6
  208. data/lib/mongrel/command.rb +15 -3
  209. data/lib/mongrel/configurator.rb +374 -0
  210. data/lib/mongrel/debug.rb +47 -56
  211. data/lib/mongrel/handlers.rb +16 -20
  212. data/lib/mongrel/rails.rb +36 -20
  213. data/lib/mongrel/stats.rb +60 -58
  214. data/test/test_conditional.rb +37 -30
  215. data/test/test_http11.rb +14 -14
  216. data/test/test_stats.rb +2 -2
  217. data/test/test_ws.rb +4 -2
  218. data/tools/rakehelp.rb +4 -4
  219. metadata +262 -260
  220. data/doc/rdoc/classes/Kernel.src/M000020.html +0 -19
  221. data/doc/rdoc/classes/Kernel.src/M000021.html +0 -23
  222. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000104.html +0 -27
  223. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000036.html +0 -24
  224. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000037.html +0 -24
  225. data/doc/rdoc/classes/Mongrel/Command/Base.src/M000038.html +0 -18
  226. data/doc/rdoc/classes/Mongrel/Command/Registry.src/M000041.html +0 -50
  227. data/doc/rdoc/classes/Mongrel/Configurator.src/M000112.html +0 -20
  228. data/doc/rdoc/classes/Mongrel/Configurator.src/M000113.html +0 -20
  229. data/doc/rdoc/classes/Mongrel/Configurator.src/M000114.html +0 -23
  230. data/doc/rdoc/classes/Mongrel/Configurator.src/M000118.html +0 -30
  231. data/doc/rdoc/classes/Mongrel/Configurator.src/M000125.html +0 -25
  232. data/doc/rdoc/classes/Mongrel/Configurator.src/M000127.html +0 -35
  233. data/doc/rdoc/classes/Mongrel/Configurator.src/M000128.html +0 -18
  234. data/doc/rdoc/classes/Mongrel/Configurator.src/M000129.html +0 -33
  235. data/doc/rdoc/classes/Mongrel/Configurator.src/M000130.html +0 -18
  236. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000061.html +0 -63
  237. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000138.html +0 -56
  238. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000087.html +0 -31
  239. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000089.html +0 -20
  240. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000090.html +0 -20
  241. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000091.html +0 -20
  242. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000092.html +0 -18
  243. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000068.html +0 -50
  244. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000046.html +0 -51
  245. data/doc/rdoc/classes/Mongrel/Rails/RailsHandler.src/M000047.html +0 -23
  246. data/doc/rdoc/classes/Mongrel/StatisticsFilter.src/M000133.html +0 -24
  247. data/doc/rdoc/classes/MongrelDbg.src/M000015.html +0 -19
  248. data/doc/rdoc/classes/ObjectTracker.src/M000013.html +0 -27
  249. data/doc/rdoc/classes/ObjectTracker.src/M000014.html +0 -44
  250. data/doc/rdoc/classes/RequestLog/Objects.src/M000145.html +0 -19
  251. data/doc/rdoc/classes/Stats.src/M000005.html +0 -19
  252. data/doc/rdoc/classes/Stats.src/M000006.html +0 -23
  253. data/doc/rdoc/classes/Stats.src/M000007.html +0 -26
  254. data/doc/rdoc/classes/Stats.src/M000008.html +0 -18
  255. data/doc/rdoc/classes/Stats.src/M000010.html +0 -18
  256. data/doc/rdoc/classes/Stats.src/M000011.html +0 -23
  257. data/doc/rdoc/classes/Stats.src/M000012.html +0 -20
  258. data/lib/http11.so +0 -0
@@ -8,15 +8,22 @@ require 'logger'
8
8
  require 'set'
9
9
  require 'socket'
10
10
 
11
+
12
+
11
13
  $mongrel_debugging=true
12
14
 
13
15
  module MongrelDbg
14
16
  SETTINGS = { :tracing => {}}
15
17
  LOGGING = { }
16
18
 
17
- def MongrelDbg::configure(log_dir = "log/mongrel_debug")
19
+ def MongrelDbg::configure(log_dir = File.join("log","mongrel_debug"))
18
20
  Dir.mkdir(log_dir) if not File.exist?(log_dir)
19
21
  @log_dir = log_dir
22
+ $objects_out=open(File.join("log","mongrel_debug","objects.log"),"w")
23
+ $objects_out.puts "run,classname,last,count,delta,lenmean,lensd,lenmax"
24
+ $objects_out.sync = true
25
+ $last_stat = nil
26
+ $run_count = 0
20
27
  end
21
28
 
22
29
 
@@ -47,53 +54,6 @@ module MongrelDbg
47
54
  end
48
55
 
49
56
 
50
- module ObjectTracker
51
- @active_objects = nil
52
-
53
- def ObjectTracker.configure
54
- @active_objects = Set.new
55
-
56
- ObjectSpace.each_object do |obj|
57
- begin
58
- # believe it or not, some idiots actually alter the object_id method
59
- @active_objects << obj.object_id
60
- rescue Object
61
- # skip this one, he's an idiot
62
- end
63
- end
64
- end
65
-
66
- def ObjectTracker.sample
67
- ospace = Set.new
68
- counts = {}
69
-
70
- ObjectSpace.each_object do |obj|
71
- begin
72
- ospace << obj.object_id
73
- counts[obj.class] ||= 0
74
- counts[obj.class] += 1
75
- rescue Object
76
- # skip since object_id can magically get parameters
77
- end
78
- end
79
-
80
- dead_objects = @active_objects - ospace
81
- new_objects = ospace - @active_objects
82
- live_objects = ospace & @active_objects
83
-
84
- MongrelDbg::trace(:objects, "COUNTS: #{dead_objects.length},#{new_objects.length},#{live_objects.length}")
85
-
86
- if MongrelDbg::tracing? :objects
87
- top_20 = counts.sort{|a,b| b[1] <=> a[1]}[0..20]
88
- MongrelDbg::trace(:objects,"TOP 20: #{top_20.inspect}")
89
- end
90
-
91
- @active_objects = live_objects + new_objects
92
-
93
- [@active_objects, top_20]
94
- end
95
-
96
- end
97
57
 
98
58
  $open_files = {}
99
59
 
@@ -157,20 +117,51 @@ module RequestLog
157
117
 
158
118
  end
159
119
 
120
+ # stolen from Robert Klemme
160
121
  class Objects < GemPlugin::Plugin "/handlers"
161
122
  include Mongrel::HttpHandlerPlugin
162
-
163
- def process(request, response)
164
- MongrelDbg::trace(:objects, "#{'-' * 10}\n#{Time.now} OBJECT STATS BEFORE REQUEST #{request.params['PATH_INFO']}")
165
- ObjectTracker.sample
123
+
124
+ def process(request,response)
125
+ begin
126
+ stats = Hash.new(0)
127
+ lengths = {}
128
+ ObjectSpace.each_object do |o|
129
+ begin
130
+ if o.respond_to? :length
131
+ len = o.length
132
+ lengths[o.class] ||= Mongrel::Stats.new(o.class)
133
+ lengths[o.class].sample(len)
134
+ end
135
+ rescue Object
136
+ end
137
+
138
+ stats[o.class] += 1
139
+ end
140
+
141
+ stats.sort {|(k1,v1),(k2,v2)| v2 <=> v1}.each do |k,v|
142
+ if $last_stat
143
+ delta = v - $last_stat[k]
144
+ if v > 10 and delta != 0
145
+ if lengths[k]
146
+ $objects_out.printf "%d,%s,%d,%d,%d,%f,%f,%f\n", $run_count, k, $last_stat[k], v, delta,lengths[k].mean,lengths[k].sd,lengths[k].max
147
+ else
148
+ $objects_out.printf "%d,%s,%d,%d,%d,,,\n", $run_count, k, $last_stat[k], v, delta
149
+ end
150
+ end
151
+ end
152
+ end
153
+
154
+ $run_count += 1
155
+ $last_stat = stats
156
+ rescue Object
157
+ STDERR.puts "object.log ERROR: #$!"
158
+ end
166
159
  end
167
-
168
160
  end
169
-
170
161
 
171
162
  class Params < GemPlugin::Plugin "/handlers"
172
163
  include Mongrel::HttpHandlerPlugin
173
-
164
+
174
165
  def process(request, response)
175
166
  MongrelDbg::trace(:rails, "#{Time.now} REQUEST #{request.params['PATH_INFO']}")
176
167
  MongrelDbg::trace(:rails, request.params.to_yaml)
@@ -180,7 +171,7 @@ module RequestLog
180
171
 
181
172
  class Threads < GemPlugin::Plugin "/handlers"
182
173
  include Mongrel::HttpHandlerPlugin
183
-
174
+
184
175
  def process(request, response)
185
176
  MongrelDbg::trace(:threads, "#{Time.now} REQUEST #{request.params['PATH_INFO']}")
186
177
  ObjectSpace.each_object do |obj|
@@ -173,14 +173,10 @@ module Mongrel
173
173
  head[Const::CONTENT_TYPE] = "text/html"
174
174
  out << "<html><head><title>Directory Listing</title></head><body>"
175
175
  Dir.entries(dir).each do |child|
176
- child = HttpRequest.unescape(child)
177
176
  next if child == "."
178
-
179
- if child == ".."
180
- out << "<a href=\"#{base}/#{child}\">Up to parent..</a><br/>"
181
- else
182
- out << "<a href=\"#{base}/#{child}/\">#{child}</a><br/>"
183
- end
177
+ out << "<a href=\"#{base}/#{ HttpRequest.escape(child)}\">"
178
+ out << (child == ".." ? "Up to parent.." : child)
179
+ out << "</a><br/>"
184
180
  end
185
181
  out << "</body></html>"
186
182
  end
@@ -203,18 +199,18 @@ module Mongrel
203
199
  # Calculated the same as apache, not sure how well the works on win32
204
200
  etag = Const::ETAG_FORMAT % [mtime.to_i, stat.size, stat.ino]
205
201
 
206
- unmodified_since = request.params[Const::HTTP_IF_UNMODIFIED_SINCE]
202
+ modified_since = request.params[Const::HTTP_IF_MODIFIED_SINCE]
207
203
  none_match = request.params[Const::HTTP_IF_NONE_MATCH]
208
204
 
209
205
  # test to see if this is a conditional request, and test if
210
206
  # the response would be identical to the last response
211
207
  same_response = case
212
- when unmodified_since && !last_response_time = Time.httpdate(unmodified_since) rescue nil : false
213
- when unmodified_since && last_response_time > Time.now : false
214
- when unmodified_since && mtime > last_response_time : false
215
- when none_match && none_match == '*' : false
216
- when none_match && !none_match.strip.split(/\s*,\s*/).include?(etag) : false
217
- else unmodified_since || none_match # validation successful if we get this far and at least one of the header exists
208
+ when modified_since && !last_response_time = Time.httpdate(modified_since) rescue nil : false
209
+ when modified_since && last_response_time > Time.now : false
210
+ when modified_since && mtime > last_response_time : false
211
+ when none_match && none_match == '*' : false
212
+ when none_match && !none_match.strip.split(/\s*,\s*/).include?(etag) : false
213
+ else modified_since || none_match # validation successful if we get this far and at least one of the header exists
218
214
  end
219
215
 
220
216
  header = response.header
@@ -238,7 +234,7 @@ module Mongrel
238
234
  response.send_header
239
235
 
240
236
  if not header_only
241
- response.send_file(req_path)
237
+ response.send_file(req_path, stat.size < Const::CHUNK_SIZE * 2)
242
238
  end
243
239
  end
244
240
  end
@@ -328,11 +324,11 @@ module Mongrel
328
324
  def initialize(ops={})
329
325
  @sample_rate = ops[:sample_rate] || 300
330
326
 
331
- @processors = Stats.new("processors")
332
- @reqsize = Stats.new("request Kb")
333
- @headcount = Stats.new("req param count")
334
- @respsize = Stats.new("response Kb")
335
- @interreq = Stats.new("inter-request time")
327
+ @processors = Mongrel::Stats.new("processors")
328
+ @reqsize = Mongrel::Stats.new("request Kb")
329
+ @headcount = Mongrel::Stats.new("req param count")
330
+ @respsize = Mongrel::Stats.new("response Kb")
331
+ @interreq = Mongrel::Stats.new("inter-request time")
336
332
  end
337
333
 
338
334
 
@@ -6,6 +6,12 @@
6
6
 
7
7
  require 'mongrel'
8
8
  require 'cgi'
9
+ require 'sync'
10
+
11
+ class Sync
12
+ # modified to open the waiting list for reporting purposes
13
+ attr_accessor :sync_waiting
14
+ end
9
15
 
10
16
  module Mongrel
11
17
  module Rails
@@ -36,7 +42,8 @@ module Mongrel
36
42
 
37
43
  def initialize(dir, mime_map = {})
38
44
  @files = Mongrel::DirHandler.new(dir,false)
39
- @guard = Mutex.new
45
+ @guard = Sync.new
46
+ @tick = Time.now
40
47
 
41
48
  # register the requested mime types
42
49
  mime_map.each {|k,v| Mongrel::DirHandler::add_mime_type(k,v) }
@@ -49,7 +56,9 @@ module Mongrel
49
56
  # * If it exists at PATH_INFO+".html" exists then serve that.
50
57
  # * Finally, construct a Mongrel::CGIWrapper and run Dispatcher.dispatch to have Rails go.
51
58
  def process(request, response)
52
- return if response.socket.closed?
59
+ if response.socket.closed?
60
+ return
61
+ end
53
62
 
54
63
  path_info = request.params[Mongrel::Const::PATH_INFO]
55
64
  page_cached = path_info + ".html"
@@ -59,41 +68,50 @@ module Mongrel
59
68
  # File exists as-is so serve it up
60
69
  @files.process(request,response)
61
70
  elsif get_or_head and @files.can_serve(page_cached)
62
- # possible cached page, serve it up
71
+ # possible cached page, serve it up
63
72
  request.params[Mongrel::Const::PATH_INFO] = page_cached
64
73
  @files.process(request,response)
65
74
  else
66
75
  begin
67
76
  cgi = Mongrel::CGIWrapper.new(request, response)
68
77
  cgi.handler = self
78
+ # we don't want the output to be really final until we're out of the lock
79
+ cgi.default_really_final = false
69
80
 
70
- # ultra dangerous, but people are asking to kill themselves. here's the Katana
71
- @guard.lock unless ActionController::Base.allow_concurrency
81
+ log_threads_waiting_for(request.params["PATH_INFO"]) if $mongrel_debug_client
72
82
 
73
- Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)
83
+ @guard.synchronize(:EX) {
84
+ Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)
85
+ }
74
86
 
75
87
  # This finalizes the output using the proper HttpResponse way
76
- cgi.out {""}
88
+ cgi.out("text/html",true) {""}
77
89
  rescue Errno::EPIPE
78
- # ignored
90
+ response.socket.close
79
91
  rescue Object => rails_error
80
- STDERR.puts "Error calling Dispatcher.dispatch #{rails_error.inspect}"
92
+ STDERR.puts "#{Time.now}: Error calling Dispatcher.dispatch #{rails_error.inspect}"
81
93
  STDERR.puts rails_error.backtrace.join("\n")
82
- ensure
83
- @guard.unlock unless ActionController::Base.allow_concurrency
84
94
  end
85
95
  end
86
96
  end
87
97
 
98
+ def log_threads_waiting_for(event)
99
+ if Time.now - @tick > 10
100
+ STDERR.puts "#{Time.now}: #{@guard.sync_waiting.length} threads sync_waiting for #{event}, #{self.listener.workers.list.length} still active in mongrel."
101
+ @tick = Time.now
102
+ end
103
+ end
88
104
 
89
105
  # Does the internal reload for Rails. It might work for most cases, but
90
106
  # sometimes you get exceptions. In that case just do a real restart.
91
107
  def reload!
92
- @guard.synchronize do
93
- $".replace $orig_dollar_quote
94
- GC.start
95
- Dispatcher.reset_application!
96
- ActionController::Routing::Routes.reload
108
+ begin
109
+ @guard.synchronize(:EX) {
110
+ $".replace $orig_dollar_quote
111
+ GC.start
112
+ Dispatcher.reset_application!
113
+ ActionController::Routing::Routes.reload
114
+ }
97
115
  end
98
116
  end
99
117
  end
@@ -137,7 +155,6 @@ module Mongrel
137
155
  ops[:docroot] ||= "public"
138
156
  ops[:mime] ||= {}
139
157
 
140
-
141
158
  $orig_dollar_quote = $".clone
142
159
  ENV['RAILS_ENV'] = ops[:environment]
143
160
  env_location = "#{ops[:cwd]}/config/environment"
@@ -145,9 +162,8 @@ module Mongrel
145
162
  require 'dispatcher'
146
163
  require 'mongrel/rails'
147
164
 
148
- if ActionController::Base.allow_concurrency
149
- log "[RAILS] ActionController::Base.allow_concurrency is true. Wow, you're very brave."
150
- end
165
+ ActionController::AbstractRequest.relative_url_root = ops[:prefix] if ops[:prefix]
166
+
151
167
  @rails_handler = RailsHandler.new(ops[:docroot], ops[:mime])
152
168
  end
153
169
 
@@ -12,76 +12,78 @@
12
12
  #
13
13
  # It does all of this very fast and doesn't take up any memory since the samples
14
14
  # are not stored but instead all the values are calculated on the fly.
15
- class Stats
16
- attr_reader :sum, :sumsq, :n, :min, :max
15
+ module Mongrel
16
+ class Stats
17
+ attr_reader :sum, :sumsq, :n, :min, :max
17
18
 
18
- def initialize(name)
19
- @name = name
20
- reset
21
- end
19
+ def initialize(name)
20
+ @name = name
21
+ reset
22
+ end
22
23
 
23
- # Resets the internal counters so you can start sampling again.
24
- def reset
25
- @sum = 0.0
26
- @sumsq = 0.0
27
- @last_time = Time.new
28
- @n = 0.0
29
- @min = 0.0
30
- @max = 0.0
31
- end
24
+ # Resets the internal counters so you can start sampling again.
25
+ def reset
26
+ @sum = 0.0
27
+ @sumsq = 0.0
28
+ @last_time = Time.new
29
+ @n = 0.0
30
+ @min = 0.0
31
+ @max = 0.0
32
+ end
32
33
 
33
- # Adds a sampling to the calculations.
34
- def sample(s)
35
- @sum += s
36
- @sumsq += s * s
37
- if @n == 0
38
- @min = @max = s
39
- else
40
- @min = s if @min > s
41
- @max = s if @max < s
34
+ # Adds a sampling to the calculations.
35
+ def sample(s)
36
+ @sum += s
37
+ @sumsq += s * s
38
+ if @n == 0
39
+ @min = @max = s
40
+ else
41
+ @min = s if @min > s
42
+ @max = s if @max < s
43
+ end
44
+ @n+=1
42
45
  end
43
- @n+=1
44
- end
45
46
 
46
- # Dump this Stats object with an optional additional message.
47
- def dump(msg = "", out=STDERR)
48
- out.puts "#{msg}: #{self.to_s}"
49
- end
47
+ # Dump this Stats object with an optional additional message.
48
+ def dump(msg = "", out=STDERR)
49
+ out.puts "#{msg}: #{self.to_s}"
50
+ end
50
51
 
51
- # Returns a common display (used by dump)
52
- def to_s
52
+ # Returns a common display (used by dump)
53
+ def to_s
53
54
  "[#{@name}]: SUM=%0.4f, SUMSQ=%0.4f, N=%0.4f, MEAN=%0.4f, SD=%0.4f, MIN=%0.4f, MAX=%0.4f" % [@sum, @sumsq, @n, mean, sd, @min, @max]
54
- end
55
+ end
55
56
 
56
57
 
57
- # Calculates and returns the mean for the data passed so far.
58
- def mean
59
- @sum / @n
60
- end
58
+ # Calculates and returns the mean for the data passed so far.
59
+ def mean
60
+ @sum / @n
61
+ end
61
62
 
62
- # Calculates the standard deviation of the data so far.
63
- def sd
64
- # (sqrt( ((s).sumsq - ( (s).sum * (s).sum / (s).n)) / ((s).n-1) ))
65
- begin
66
- return Math.sqrt( (@sumsq - ( @sum * @sum / @n)) / (@n-1) )
67
- rescue Errno::EDOM
68
- return 0.0
63
+ # Calculates the standard deviation of the data so far.
64
+ def sd
65
+ # (sqrt( ((s).sumsq - ( (s).sum * (s).sum / (s).n)) / ((s).n-1) ))
66
+ begin
67
+ return Math.sqrt( (@sumsq - ( @sum * @sum / @n)) / (@n-1) )
68
+ rescue Errno::EDOM
69
+ return 0.0
70
+ end
69
71
  end
70
- end
71
72
 
72
73
 
73
- # Adds a time delta between now and the last time you called this. This
74
- # will give you the average time between two activities.
75
- #
76
- # An example is:
77
- #
78
- # t = Stats.new("do_stuff")
79
- # 10000.times { do_stuff(); t.tick }
80
- # t.dump("time")
81
- #
82
- def tick
83
- now = Time.now
84
- sample(now - @last_time)
85
- @last_time = now
74
+ # Adds a time delta between now and the last time you called this. This
75
+ # will give you the average time between two activities.
76
+ #
77
+ # An example is:
78
+ #
79
+ # t = Stats.new("do_stuff")
80
+ # 10000.times { do_stuff(); t.tick }
81
+ # t.dump("time")
82
+ #
83
+ def tick
84
+ now = Time.now
85
+ sample(now - @last_time)
86
+ @last_time = now
87
+ end
86
88
  end
87
89
  end