mongrel 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/README +4 -3
  2. data/Rakefile +7 -5
  3. data/bin/mongrel_rails +5 -4
  4. data/bin/mongrel_rails_service +237 -0
  5. data/bin/mongrel_rails_svc +194 -0
  6. data/doc/rdoc/classes/Mongrel.html +1 -4
  7. data/doc/rdoc/classes/Mongrel/Const.html +13 -3
  8. data/doc/rdoc/classes/Mongrel/HeaderOut.html +10 -10
  9. data/doc/rdoc/classes/Mongrel/HeaderOut.src/{M000033.html → M000028.html} +4 -4
  10. data/doc/rdoc/classes/Mongrel/HeaderOut.src/{M000034.html → M000029.html} +7 -7
  11. data/doc/rdoc/classes/Mongrel/HttpRequest.html +5 -5
  12. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000041.html +39 -0
  13. data/doc/rdoc/classes/Mongrel/HttpResponse.html +36 -36
  14. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000034.html +21 -0
  15. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000041.html → M000035.html} +6 -6
  16. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000042.html → M000036.html} +5 -5
  17. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000043.html → M000037.html} +5 -5
  18. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000044.html → M000038.html} +6 -6
  19. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000045.html → M000039.html} +6 -6
  20. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000040.html +7 -8
  21. data/doc/rdoc/classes/Mongrel/HttpServer.html +47 -28
  22. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000022.html +33 -0
  23. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000023.html +57 -0
  24. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000024.html +46 -0
  25. data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000031.html → M000025.html} +4 -4
  26. data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000032.html → M000026.html} +4 -4
  27. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000027.html +19 -0
  28. data/doc/rdoc/classes/Mongrel/{HttpHandler.html → StopServer.html} +4 -33
  29. data/doc/rdoc/classes/Mongrel/URIClassifier.html +22 -23
  30. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000035.html → M000030.html} +0 -0
  31. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000036.html → M000031.html} +0 -0
  32. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000037.html → M000032.html} +0 -0
  33. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000038.html → M000033.html} +0 -0
  34. data/doc/rdoc/created.rid +1 -1
  35. data/doc/rdoc/files/README.html +9 -7
  36. data/doc/rdoc/files/lib/mongrel_rb.html +3 -3
  37. data/doc/rdoc/fr_class_index.html +1 -4
  38. data/doc/rdoc/fr_method_index.html +20 -37
  39. data/examples/mongrel_simple_ctrl.rb +92 -0
  40. data/examples/mongrel_simple_service.rb +116 -0
  41. data/examples/simpletest.rb +3 -1
  42. data/ext/http11/http11_parser.c +176 -263
  43. data/lib/mongrel.rb +56 -343
  44. data/lib/mongrel/cgi.rb +147 -0
  45. data/lib/mongrel/handlers.rb +180 -0
  46. metadata +28 -46
  47. data/doc/rdoc/classes/Mongrel/CGIWrapper.html +0 -346
  48. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000047.html +0 -24
  49. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000048.html +0 -48
  50. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000049.html +0 -34
  51. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000050.html +0 -27
  52. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000051.html +0 -26
  53. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000052.html +0 -18
  54. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000053.html +0 -18
  55. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000054.html +0 -18
  56. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000055.html +0 -19
  57. data/doc/rdoc/classes/Mongrel/DirHandler.html +0 -283
  58. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000022.html +0 -20
  59. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000023.html +0 -42
  60. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000024.html +0 -40
  61. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000025.html +0 -31
  62. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000026.html +0 -38
  63. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000027.html +0 -18
  64. data/doc/rdoc/classes/Mongrel/Error404Handler.html +0 -171
  65. data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000056.html +0 -18
  66. data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000057.html +0 -18
  67. data/doc/rdoc/classes/Mongrel/HttpHandler.src/M000039.html +0 -17
  68. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000058.html +0 -31
  69. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000046.html +0 -20
  70. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000028.html +0 -38
  71. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000029.html +0 -64
  72. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000030.html +0 -23
@@ -1 +1 @@
1
- Sat Feb 18 15:19:13 EST 2006
1
+ Wed Feb 22 12:20:19 EST 2006
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Wed Feb 15 08:10:57 EST 2006</td>
59
+ <td>Sun Feb 19 10:22:19 EST 2006</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -84,9 +84,11 @@ portability issues.
84
84
  </p>
85
85
  <h2>Status</h2>
86
86
  <p>
87
- The 0.3.2 release supports Ruby On Rails much better than previously, and
88
- also sports the beginning of a command and plugin infrastructure. This last
89
- part isn&#8217;t documented yet.
87
+ The 0.3.6 release supports Ruby On Rails much better than previously, and
88
+ also sports the beginning of a command and plugin infrastructure. There is
89
+ now a more complete CGIWrapper that handles most of the CGI usage, but
90
+ still doesn&#8217;t do the MIME decoding or file upload/send (it leaves
91
+ that to CGI).
90
92
  </p>
91
93
  <p>
92
94
  After you&#8217;ve installed (either with gem install mongrel or via
@@ -164,9 +166,9 @@ example:
164
166
  <p>
165
167
  If you run this and access port 3000 with a browser it will say
166
168
  &quot;hello!&quot;. If you access it with any url other than
167
- &quot;/test&quot; it will give a simple 404. Check out the <a
168
- href="../classes/Mongrel/Error404Handler.html">Mongrel::Error404Handler</a>
169
- for a basic way to give a more complex 404 message.
169
+ &quot;/test&quot; it will give a simple 404. Check out the
170
+ Mongrel::Error404Handler for a basic way to give a more complex 404
171
+ message.
170
172
  </p>
171
173
  <p>
172
174
  This also shows the DirHandler with directory listings. This is still rough
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Sat Feb 18 15:10:16 EST 2006</td>
59
+ <td>Mon Feb 20 19:06:43 EST 2006</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -77,8 +77,8 @@
77
77
  http11&nbsp;&nbsp;
78
78
  thread&nbsp;&nbsp;
79
79
  stringio&nbsp;&nbsp;
80
- timeout&nbsp;&nbsp;
81
- cgi&nbsp;&nbsp;
80
+ mongrel/cgi&nbsp;&nbsp;
81
+ mongrel/handlers&nbsp;&nbsp;
82
82
  </div>
83
83
  </div>
84
84
 
@@ -22,16 +22,13 @@
22
22
  <div id="index-entries">
23
23
  <a href="classes/FactoryError.html">FactoryError</a><br />
24
24
  <a href="classes/Mongrel.html">Mongrel</a><br />
25
- <a href="classes/Mongrel/CGIWrapper.html">Mongrel::CGIWrapper</a><br />
26
25
  <a href="classes/Mongrel/Const.html">Mongrel::Const</a><br />
27
- <a href="classes/Mongrel/DirHandler.html">Mongrel::DirHandler</a><br />
28
- <a href="classes/Mongrel/Error404Handler.html">Mongrel::Error404Handler</a><br />
29
26
  <a href="classes/Mongrel/HeaderOut.html">Mongrel::HeaderOut</a><br />
30
- <a href="classes/Mongrel/HttpHandler.html">Mongrel::HttpHandler</a><br />
31
27
  <a href="classes/Mongrel/HttpParser.html">Mongrel::HttpParser</a><br />
32
28
  <a href="classes/Mongrel/HttpRequest.html">Mongrel::HttpRequest</a><br />
33
29
  <a href="classes/Mongrel/HttpResponse.html">Mongrel::HttpResponse</a><br />
34
30
  <a href="classes/Mongrel/HttpServer.html">Mongrel::HttpServer</a><br />
31
+ <a href="classes/Mongrel/StopServer.html">Mongrel::StopServer</a><br />
35
32
  <a href="classes/Mongrel/URIClassifier.html">Mongrel::URIClassifier</a><br />
36
33
  <a href="classes/PluginFactory.html">PluginFactory</a><br />
37
34
  </div>
@@ -20,64 +20,47 @@
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#M000034">[]= (Mongrel::HeaderOut)</a><br />
24
- <a href="classes/Mongrel/DirHandler.html#M000027">add_mime_type (Mongrel::DirHandler)</a><br />
25
- <a href="classes/Mongrel/CGIWrapper.html#M000052">args (Mongrel::CGIWrapper)</a><br />
26
- <a href="classes/Mongrel/DirHandler.html#M000023">can_serve (Mongrel::DirHandler)</a><br />
23
+ <a href="classes/Mongrel/HeaderOut.html#M000029">[]= (Mongrel::HeaderOut)</a><br />
27
24
  <a href="classes/PluginFactory.html#M000009">create (PluginFactory)</a><br />
28
25
  <a href="classes/PluginFactory.html#M000008">derivativeClasses (PluginFactory)</a><br />
29
26
  <a href="classes/PluginFactory.html#M000005">derivatives (PluginFactory)</a><br />
30
- <a href="classes/Mongrel/CGIWrapper.html#M000053">env_table (Mongrel::CGIWrapper)</a><br />
31
27
  <a href="classes/Mongrel/HttpParser.html#M000019">error? (Mongrel::HttpParser)</a><br />
32
28
  <a href="classes/Mongrel/HttpParser.html#M000018">execute (Mongrel::HttpParser)</a><br />
33
29
  <a href="classes/PluginFactory.html#M000004">extend_object (PluginFactory)</a><br />
34
30
  <a href="classes/PluginFactory.html#M000006">factoryType (PluginFactory)</a><br />
35
31
  <a href="classes/Mongrel/HttpParser.html#M000017">finish (Mongrel::HttpParser)</a><br />
36
- <a href="classes/Mongrel/HttpResponse.html#M000046">finished (Mongrel::HttpResponse)</a><br />
32
+ <a href="classes/Mongrel/HttpResponse.html#M000040">finished (Mongrel::HttpResponse)</a><br />
37
33
  <a href="classes/Mongrel/HttpParser.html#M000020">finished? (Mongrel::HttpParser)</a><br />
38
34
  <a href="classes/PluginFactory.html#M000012">getModuleName (PluginFactory)</a><br />
39
35
  <a href="classes/PluginFactory.html#M000010">getSubclass (PluginFactory)</a><br />
40
- <a href="classes/Mongrel/CGIWrapper.html#M000048">header (Mongrel::CGIWrapper)</a><br />
41
36
  <a href="classes/PluginFactory.html#M000003">included (PluginFactory)</a><br />
42
37
  <a href="classes/PluginFactory.html#M000007">inherited (PluginFactory)</a><br />
43
38
  <a href="classes/PluginFactory.html#M000011">loadDerivative (PluginFactory)</a><br />
44
39
  <a href="classes/PluginFactory.html#M000002">log (PluginFactory)</a><br />
45
40
  <a href="classes/PluginFactory.html#M000014">makeRequirePath (PluginFactory)</a><br />
46
- <a href="classes/Mongrel/DirHandler.html#M000022">new (Mongrel::DirHandler)</a><br />
47
- <a href="classes/Mongrel/CGIWrapper.html#M000047">new (Mongrel::CGIWrapper)</a><br />
48
- <a href="classes/Mongrel/Error404Handler.html#M000056">new (Mongrel::Error404Handler)</a><br />
41
+ <a href="classes/Mongrel/HeaderOut.html#M000028">new (Mongrel::HeaderOut)</a><br />
42
+ <a href="classes/Mongrel/HttpResponse.html#M000034">new (Mongrel::HttpResponse)</a><br />
49
43
  <a href="classes/Mongrel/HttpParser.html#M000015">new (Mongrel::HttpParser)</a><br />
50
- <a href="classes/Mongrel/HttpServer.html#M000028">new (Mongrel::HttpServer)</a><br />
51
- <a href="classes/Mongrel/HttpResponse.html#M000040">new (Mongrel::HttpResponse)</a><br />
52
- <a href="classes/Mongrel/HeaderOut.html#M000033">new (Mongrel::HeaderOut)</a><br />
53
- <a href="classes/Mongrel/URIClassifier.html#M000035">new (Mongrel::URIClassifier)</a><br />
44
+ <a href="classes/Mongrel/HttpServer.html#M000022">new (Mongrel::HttpServer)</a><br />
45
+ <a href="classes/Mongrel/URIClassifier.html#M000030">new (Mongrel::URIClassifier)</a><br />
54
46
  <a href="classes/FactoryError.html#M000001">new (FactoryError)</a><br />
55
- <a href="classes/Mongrel/HttpRequest.html#M000058">new (Mongrel::HttpRequest)</a><br />
47
+ <a href="classes/Mongrel/HttpRequest.html#M000041">new (Mongrel::HttpRequest)</a><br />
56
48
  <a href="classes/Mongrel/HttpParser.html#M000021">nread (Mongrel::HttpParser)</a><br />
57
- <a href="classes/Mongrel/CGIWrapper.html#M000050">out (Mongrel::CGIWrapper)</a><br />
58
- <a href="classes/Mongrel/HttpHandler.html#M000039">process (Mongrel::HttpHandler)</a><br />
59
- <a href="classes/Mongrel/Error404Handler.html#M000057">process (Mongrel::Error404Handler)</a><br />
60
- <a href="classes/Mongrel/DirHandler.html#M000026">process (Mongrel::DirHandler)</a><br />
61
- <a href="classes/Mongrel/HttpServer.html#M000029">process_client (Mongrel::HttpServer)</a><br />
62
- <a href="classes/Mongrel/URIClassifier.html#M000036">register (Mongrel::URIClassifier)</a><br />
63
- <a href="classes/Mongrel/HttpServer.html#M000031">register (Mongrel::HttpServer)</a><br />
49
+ <a href="classes/Mongrel/HttpServer.html#M000023">process_client (Mongrel::HttpServer)</a><br />
50
+ <a href="classes/Mongrel/HttpServer.html#M000025">register (Mongrel::HttpServer)</a><br />
51
+ <a href="classes/Mongrel/URIClassifier.html#M000031">register (Mongrel::URIClassifier)</a><br />
64
52
  <a href="classes/PluginFactory.html#M000013">requireDerivative (PluginFactory)</a><br />
53
+ <a href="classes/Mongrel/HttpResponse.html#M000036">reset (Mongrel::HttpResponse)</a><br />
65
54
  <a href="classes/Mongrel/HttpParser.html#M000016">reset (Mongrel::HttpParser)</a><br />
66
- <a href="classes/Mongrel/HttpResponse.html#M000042">reset (Mongrel::HttpResponse)</a><br />
67
- <a href="classes/Mongrel/URIClassifier.html#M000038">resolve (Mongrel::URIClassifier)</a><br />
68
- <a href="classes/Mongrel/HttpServer.html#M000030">run (Mongrel::HttpServer)</a><br />
69
- <a href="classes/Mongrel/HttpResponse.html#M000045">send_body (Mongrel::HttpResponse)</a><br />
70
- <a href="classes/Mongrel/CGIWrapper.html#M000049">send_cookies (Mongrel::CGIWrapper)</a><br />
71
- <a href="classes/Mongrel/DirHandler.html#M000024">send_dir_listing (Mongrel::DirHandler)</a><br />
72
- <a href="classes/Mongrel/DirHandler.html#M000025">send_file (Mongrel::DirHandler)</a><br />
73
- <a href="classes/Mongrel/HttpResponse.html#M000044">send_header (Mongrel::HttpResponse)</a><br />
74
- <a href="classes/Mongrel/HttpResponse.html#M000043">send_status (Mongrel::HttpResponse)</a><br />
75
- <a href="classes/Mongrel/HttpResponse.html#M000041">start (Mongrel::HttpResponse)</a><br />
76
- <a href="classes/Mongrel/CGIWrapper.html#M000051">status (Mongrel::CGIWrapper)</a><br />
77
- <a href="classes/Mongrel/CGIWrapper.html#M000054">stdinput (Mongrel::CGIWrapper)</a><br />
78
- <a href="classes/Mongrel/CGIWrapper.html#M000055">stdoutput (Mongrel::CGIWrapper)</a><br />
79
- <a href="classes/Mongrel/URIClassifier.html#M000037">unregister (Mongrel::URIClassifier)</a><br />
80
- <a href="classes/Mongrel/HttpServer.html#M000032">unregister (Mongrel::HttpServer)</a><br />
55
+ <a href="classes/Mongrel/URIClassifier.html#M000033">resolve (Mongrel::URIClassifier)</a><br />
56
+ <a href="classes/Mongrel/HttpServer.html#M000024">run (Mongrel::HttpServer)</a><br />
57
+ <a href="classes/Mongrel/HttpResponse.html#M000039">send_body (Mongrel::HttpResponse)</a><br />
58
+ <a href="classes/Mongrel/HttpResponse.html#M000038">send_header (Mongrel::HttpResponse)</a><br />
59
+ <a href="classes/Mongrel/HttpResponse.html#M000037">send_status (Mongrel::HttpResponse)</a><br />
60
+ <a href="classes/Mongrel/HttpResponse.html#M000035">start (Mongrel::HttpResponse)</a><br />
61
+ <a href="classes/Mongrel/HttpServer.html#M000027">stop (Mongrel::HttpServer)</a><br />
62
+ <a href="classes/Mongrel/URIClassifier.html#M000032">unregister (Mongrel::URIClassifier)</a><br />
63
+ <a href="classes/Mongrel/HttpServer.html#M000026">unregister (Mongrel::HttpServer)</a><br />
81
64
  </div>
82
65
  </div>
83
66
  </body>
@@ -0,0 +1,92 @@
1
+ ###############################################
2
+ # mongrel_simple_ctrl.rb
3
+ #
4
+ # Control script for the Mongrel server
5
+ ###############################################
6
+ require "optparse"
7
+ require "win32/service"
8
+ include Win32
9
+
10
+ # I start the service name with an 'A' so that it appears at the top
11
+ SERVICE_NAME = "MongrelSvc"
12
+ SERVICE_DISPLAYNAME = "Mongrel HTTP Server"
13
+ SCRIPT_ROOT = File.join(File.dirname(__FILE__), '.')
14
+ SCRIPT_NAME = "mongrel_simple_service.rb"
15
+ SERVICE_SCRIPT = File.expand_path(SCRIPT_ROOT + '/' + SCRIPT_NAME)
16
+
17
+ OPTIONS = {}
18
+
19
+ ARGV.options do |opts|
20
+ opts.on("-d", "--delete", "Delete the service"){ OPTIONS[:delete] = true }
21
+ opts.on("-u", "--uninstall","Delete the service"){ OPTIONS[:uninstall] = true }
22
+ opts.on("-s", "--start", "Start the service"){ OPTIONS[:start] = true }
23
+ opts.on("-x", "--stop", "Stop the service"){ OPTIONS[:stop] = true }
24
+ opts.on("-i", "--install","Install the service"){ OPTIONS[:install] = true }
25
+
26
+ opts.on("-h", "--help", "Show this help message."){ puts opts; exit }
27
+
28
+ opts.parse!
29
+ end
30
+
31
+ # Install the service
32
+ if OPTIONS[:install]
33
+ require 'rbconfig'
34
+
35
+ svc = Service.new
36
+ svc.create_service{ |s|
37
+ s.service_name = SERVICE_NAME
38
+ s.display_name = SERVICE_DISPLAYNAME
39
+ s.binary_path_name = Config::CONFIG['bindir'] + '/ruby ' + SERVICE_SCRIPT
40
+ s.dependencies = []
41
+ }
42
+ svc.close
43
+ puts "#{SERVICE_DISPLAYNAME} service installed"
44
+ end
45
+
46
+ # Start the service
47
+ if OPTIONS[:start]
48
+ Service.start(SERVICE_NAME)
49
+ started = false
50
+ while started == false
51
+ s = Service.status(SERVICE_NAME)
52
+ started = true if s.current_state == "running"
53
+ break if started == true
54
+ puts "One moment, " + s.current_state
55
+ sleep 1
56
+ end
57
+ puts "#{SERVICE_DISPLAYNAME} service started"
58
+ end
59
+
60
+ # Stop the service
61
+ if OPTIONS[:stop]
62
+ Service.stop(SERVICE_NAME)
63
+ stopped = false
64
+ while stopped == false
65
+ s = Service.status(SERVICE_NAME)
66
+ stopped = true if s.current_state == "stopped"
67
+ break if stopped == true
68
+ puts "One moment, " + s.current_state
69
+ sleep 1
70
+ end
71
+ puts "#{SERVICE_DISPLAYNAME} service stopped"
72
+ end
73
+
74
+ # Delete the service. Stop it first.
75
+ if OPTIONS[:delete] || OPTIONS[:uninstall]
76
+ begin
77
+ Service.stop(SERVICE_NAME)
78
+ rescue
79
+ end
80
+ begin
81
+ Service.delete(SERVICE_NAME)
82
+ rescue
83
+ end
84
+ puts "#{SERVICE_DISPLAYNAME} service deleted"
85
+ end
86
+ # END mongrel_rails_ctrl.rb
87
+
88
+
89
+
90
+
91
+
92
+
@@ -0,0 +1,116 @@
1
+ # This script emualtes script/server behavior but running webrick http server
2
+ require 'rubygems'
3
+
4
+ require 'mongrel'
5
+ require 'yaml'
6
+ require 'zlib'
7
+
8
+ require 'win32/service'
9
+
10
+ DEBUG_LOG_FILE = File.expand_path(File.dirname(__FILE__) + '/debug.log')
11
+
12
+ class SimpleHandler < Mongrel::HttpHandler
13
+ def process(request, response)
14
+ response.start do |head,out|
15
+ head["Content-Type"] = "text/html"
16
+ results = "<html><body>Your request:<br /><pre>#{request.params.to_yaml}</pre><a href=\"/files\">View the files.</a></body></html>"
17
+ if request.params["HTTP_ACCEPT_ENCODING"] == "gzip,deflate"
18
+ head["Content-Encoding"] = "deflate"
19
+ # send it back deflated
20
+ out << Zlib::Deflate.deflate(results)
21
+ else
22
+ # no gzip supported, send it back normal
23
+ out << results
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ class MongrelDaemon < Win32::Daemon
30
+ def initialize(options)
31
+ @options = options
32
+ end
33
+
34
+ def service_init
35
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_init entered") }
36
+
37
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("Mongrel running on #{@options[:ip]}:#{@options[:port]} with docroot #{@options[:server_root]}") }
38
+
39
+ @simple = SimpleHandler.new
40
+ @files = Mongrel::DirHandler.new(@options[:server_root])
41
+
42
+ @http_server = Mongrel::HttpServer.new(@options[:ip], @options[:port])
43
+ @http_server.register("/", @simple)
44
+ @http_server.register("/files", @files)
45
+
46
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_init left") }
47
+ end
48
+
49
+ def service_stop
50
+ File.open(DEBUG_LOG_FILE,"a+"){ |f|
51
+ f.puts "stop signal received: " + Time.now.to_s
52
+ f.puts "sending stop to mongrel threads: " + Time.now.to_s
53
+ }
54
+ #@http_server.stop
55
+ end
56
+
57
+ def service_pause
58
+ File.open(DEBUG_LOG_FILE,"a+"){ |f|
59
+ f.puts "pause signal received: " + Time.now.to_s
60
+ }
61
+ end
62
+
63
+ def service_resume
64
+ File.open(DEBUG_LOG_FILE,"a+"){ |f|
65
+ f.puts "continue/resume signal received: " + Time.now.to_s
66
+ }
67
+ end
68
+
69
+ def service_main
70
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_main entered") }
71
+
72
+ begin
73
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - http_server.run") }
74
+ @http_server.run
75
+
76
+ # No runner thread was needed after all!
77
+ #@runner = Thread.new do
78
+ # @http_server.acceptor.join
79
+ #end
80
+ #File.open("d:\\test.log","a+") { |f| f.puts("#{Time.now} - runner.run") }
81
+ #@runner.run
82
+
83
+ # here is where magic happens!
84
+ # if put blocking code here, the thread never left service_main, and the rb_func_call in service.c
85
+ # never exit, even if the stop signal is received.
86
+ #
87
+ # to probe my theory, just comment the while loop and remove the '1' from sleep function
88
+ # service start ok, but fail to stop.
89
+ #
90
+ # Even if no functional code is in service_main (because we have other working threads),
91
+ # we must monitor the state of the service to exit when the STOP event is received.
92
+ #
93
+ # Note: maybe not loop in 1 second intervals?
94
+ while state == RUNNING
95
+ sleep 1
96
+ end
97
+
98
+ rescue StandardError, Exception, interrupt => err
99
+ File.open(DEBUG_LOG_FILE,"a+"){ |f| f.puts("#{Time.now} - Error: #{err}") }
100
+ File.open(DEBUG_LOG_FILE,"a+"){ |f| f.puts("BACKTRACE: " + err.backtrace.join("\n")) }
101
+
102
+ end
103
+
104
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_main left") }
105
+ end
106
+
107
+ end
108
+
109
+ OPTIONS = {
110
+ :port => 3000,
111
+ :ip => "0.0.0.0",
112
+ :server_root => File.expand_path(File.dirname(__FILE__)),
113
+ }
114
+
115
+ web_server = MongrelDaemon.new(OPTIONS)
116
+ web_server.mainloop
@@ -24,11 +24,13 @@ if ARGV.length != 3
24
24
  exit(1)
25
25
  end
26
26
 
27
- h = Mongrel::HttpServer.new(ARGV[0], ARGV[1])
27
+ h = Mongrel::HttpServer.new(ARGV[0], ARGV[1].to_i)
28
28
  h.register("/", SimpleHandler.new)
29
29
  h.register("/files", Mongrel::DirHandler.new(ARGV[2]))
30
30
  h.run
31
31
 
32
+ trap("INT") { h.stop }
33
+
32
34
  puts "Mongrel running on #{ARGV[0]}:#{ARGV[1]} with docroot #{ARGV[2]}"
33
35
 
34
36
  h.acceptor.join
@@ -17,7 +17,7 @@
17
17
  #line 18 "ext/http11/http11_parser.c"
18
18
  static int http_parser_start = 0;
19
19
 
20
- static int http_parser_first_final = 56;
20
+ static int http_parser_first_final = 53;
21
21
 
22
22
  static int http_parser_error = 1;
23
23
 
@@ -162,7 +162,7 @@ tr34:
162
162
  parser->request_uri(parser->data, parser->mark, p - parser->mark);
163
163
  }
164
164
  goto st10;
165
- tr48:
165
+ tr46:
166
166
  #line 37 "ext/http11/http11_parser.rl"
167
167
  {
168
168
  if(parser->query_string != NULL)
@@ -249,11 +249,21 @@ tr37:
249
249
  parser->http_version(parser->data, parser->mark, p - parser->mark);
250
250
  }
251
251
  goto st19;
252
+ tr49:
253
+ #line 22 "ext/http11/http11_parser.rl"
254
+ {
255
+ if(parser->http_field != NULL) {
256
+ parser->http_field(parser->data,
257
+ parser->field_start, parser->field_len,
258
+ parser->mark+1, p - (parser->mark +1));
259
+ }
260
+ }
261
+ goto st19;
252
262
  st19:
253
263
  if ( ++p == pe )
254
264
  goto _out19;
255
265
  case 19:
256
- #line 257 "ext/http11/http11_parser.c"
266
+ #line 267 "ext/http11/http11_parser.c"
257
267
  if ( (*p) == 10 )
258
268
  goto st20;
259
269
  goto st1;
@@ -295,14 +305,14 @@ case 21:
295
305
  tr40:
296
306
  #line 46 "ext/http11/http11_parser.rl"
297
307
  {
298
- parser->body_start = p+1; goto _out56;
308
+ parser->body_start = p+1; goto _out53;
299
309
  }
300
- goto st56;
301
- st56:
310
+ goto st53;
311
+ st53:
302
312
  if ( ++p == pe )
303
- goto _out56;
304
- case 56:
305
- #line 306 "ext/http11/http11_parser.c"
313
+ goto _out53;
314
+ case 53:
315
+ #line 316 "ext/http11/http11_parser.c"
306
316
  goto st1;
307
317
  tr36:
308
318
  #line 16 "ext/http11/http11_parser.rl"
@@ -312,7 +322,7 @@ st22:
312
322
  if ( ++p == pe )
313
323
  goto _out22;
314
324
  case 22:
315
- #line 316 "ext/http11/http11_parser.c"
325
+ #line 326 "ext/http11/http11_parser.c"
316
326
  switch( (*p) ) {
317
327
  case 33: goto st22;
318
328
  case 58: goto tr32;
@@ -347,11 +357,11 @@ st23:
347
357
  if ( ++p == pe )
348
358
  goto _out23;
349
359
  case 23:
350
- #line 351 "ext/http11/http11_parser.c"
360
+ #line 361 "ext/http11/http11_parser.c"
351
361
  if ( (*p) == 13 )
352
- goto tr56;
353
- goto tr55;
354
- tr55:
362
+ goto tr49;
363
+ goto tr52;
364
+ tr52:
355
365
  #line 21 "ext/http11/http11_parser.rl"
356
366
  { MARK(parser, p); }
357
367
  goto st24;
@@ -359,141 +369,47 @@ st24:
359
369
  if ( ++p == pe )
360
370
  goto _out24;
361
371
  case 24:
362
- #line 363 "ext/http11/http11_parser.c"
372
+ #line 373 "ext/http11/http11_parser.c"
363
373
  if ( (*p) == 13 )
364
- goto tr51;
374
+ goto tr49;
365
375
  goto st24;
366
- tr51:
367
- #line 22 "ext/http11/http11_parser.rl"
368
- {
369
- if(parser->http_field != NULL) {
370
- parser->http_field(parser->data,
371
- parser->field_start, parser->field_len,
372
- parser->mark+1, p - (parser->mark +1));
373
- }
374
- }
375
- goto st25;
376
- tr56:
377
- #line 21 "ext/http11/http11_parser.rl"
376
+ tr28:
377
+ #line 14 "ext/http11/http11_parser.rl"
378
378
  { MARK(parser, p); }
379
- #line 22 "ext/http11/http11_parser.rl"
380
- {
381
- if(parser->http_field != NULL) {
382
- parser->http_field(parser->data,
383
- parser->field_start, parser->field_len,
384
- parser->mark+1, p - (parser->mark +1));
385
- }
386
- }
387
379
  goto st25;
388
380
  st25:
389
381
  if ( ++p == pe )
390
382
  goto _out25;
391
383
  case 25:
392
- #line 393 "ext/http11/http11_parser.c"
393
- switch( (*p) ) {
394
- case 10: goto st26;
395
- case 13: goto tr51;
396
- }
397
- goto st24;
398
- st26:
399
- if ( ++p == pe )
400
- goto _out26;
401
- case 26:
384
+ #line 385 "ext/http11/http11_parser.c"
402
385
  switch( (*p) ) {
403
- case 13: goto st21;
404
- case 33: goto tr42;
405
- case 124: goto tr42;
406
- case 126: goto tr42;
407
- }
408
- if ( (*p) < 45 ) {
409
- if ( (*p) > 39 ) {
410
- if ( 42 <= (*p) && (*p) <= 43 )
411
- goto tr42;
412
- } else if ( (*p) >= 35 )
413
- goto tr42;
414
- } else if ( (*p) > 46 ) {
415
- if ( (*p) < 65 ) {
416
- if ( 48 <= (*p) && (*p) <= 57 )
417
- goto tr42;
418
- } else if ( (*p) > 90 ) {
419
- if ( 94 <= (*p) && (*p) <= 122 )
420
- goto tr42;
421
- } else
422
- goto tr42;
423
- } else
424
- goto tr42;
425
- goto st24;
426
- tr42:
427
- #line 16 "ext/http11/http11_parser.rl"
428
- { parser->field_start = p; }
429
- goto st27;
430
- st27:
431
- if ( ++p == pe )
432
- goto _out27;
433
- case 27:
434
- #line 435 "ext/http11/http11_parser.c"
435
- switch( (*p) ) {
436
- case 13: goto tr51;
437
- case 33: goto st27;
438
- case 58: goto tr32;
439
- case 124: goto st27;
440
- case 126: goto st27;
441
- }
442
- if ( (*p) < 45 ) {
443
- if ( (*p) > 39 ) {
444
- if ( 42 <= (*p) && (*p) <= 43 )
445
- goto st27;
446
- } else if ( (*p) >= 35 )
447
- goto st27;
448
- } else if ( (*p) > 46 ) {
449
- if ( (*p) < 65 ) {
450
- if ( 48 <= (*p) && (*p) <= 57 )
451
- goto st27;
452
- } else if ( (*p) > 90 ) {
453
- if ( 94 <= (*p) && (*p) <= 122 )
454
- goto st27;
455
- } else
456
- goto st27;
457
- } else
458
- goto st27;
459
- goto st24;
460
- tr28:
461
- #line 14 "ext/http11/http11_parser.rl"
462
- { MARK(parser, p); }
463
- goto st28;
464
- st28:
465
- if ( ++p == pe )
466
- goto _out28;
467
- case 28:
468
- #line 469 "ext/http11/http11_parser.c"
469
- switch( (*p) ) {
470
- case 43: goto st28;
471
- case 58: goto st29;
386
+ case 43: goto st25;
387
+ case 58: goto st26;
472
388
  }
473
389
  if ( (*p) < 48 ) {
474
390
  if ( 45 <= (*p) && (*p) <= 46 )
475
- goto st28;
391
+ goto st25;
476
392
  } else if ( (*p) > 57 ) {
477
393
  if ( (*p) > 90 ) {
478
394
  if ( 97 <= (*p) && (*p) <= 122 )
479
- goto st28;
395
+ goto st25;
480
396
  } else if ( (*p) >= 65 )
481
- goto st28;
397
+ goto st25;
482
398
  } else
483
- goto st28;
399
+ goto st25;
484
400
  goto st1;
485
401
  tr30:
486
402
  #line 14 "ext/http11/http11_parser.rl"
487
403
  { MARK(parser, p); }
488
- goto st29;
489
- st29:
404
+ goto st26;
405
+ st26:
490
406
  if ( ++p == pe )
491
- goto _out29;
492
- case 29:
493
- #line 494 "ext/http11/http11_parser.c"
407
+ goto _out26;
408
+ case 26:
409
+ #line 410 "ext/http11/http11_parser.c"
494
410
  switch( (*p) ) {
495
411
  case 32: goto tr34;
496
- case 37: goto st30;
412
+ case 37: goto st27;
497
413
  case 60: goto st1;
498
414
  case 62: goto st1;
499
415
  case 127: goto st1;
@@ -503,49 +419,49 @@ case 29:
503
419
  goto st1;
504
420
  } else if ( (*p) >= 0 )
505
421
  goto st1;
506
- goto st29;
507
- st30:
422
+ goto st26;
423
+ st27:
508
424
  if ( ++p == pe )
509
- goto _out30;
510
- case 30:
425
+ goto _out27;
426
+ case 27:
511
427
  if ( (*p) < 65 ) {
512
428
  if ( 48 <= (*p) && (*p) <= 57 )
513
- goto st31;
429
+ goto st28;
514
430
  } else if ( (*p) > 70 ) {
515
431
  if ( 97 <= (*p) && (*p) <= 102 )
516
- goto st31;
432
+ goto st28;
517
433
  } else
518
- goto st31;
434
+ goto st28;
519
435
  goto st1;
520
- st31:
436
+ st28:
521
437
  if ( ++p == pe )
522
- goto _out31;
523
- case 31:
438
+ goto _out28;
439
+ case 28:
524
440
  if ( (*p) < 65 ) {
525
441
  if ( 48 <= (*p) && (*p) <= 57 )
526
- goto st29;
442
+ goto st26;
527
443
  } else if ( (*p) > 70 ) {
528
444
  if ( 97 <= (*p) && (*p) <= 102 )
529
- goto st29;
445
+ goto st26;
530
446
  } else
531
- goto st29;
447
+ goto st26;
532
448
  goto st1;
533
449
  tr29:
534
450
  #line 14 "ext/http11/http11_parser.rl"
535
451
  { MARK(parser, p); }
536
- goto st32;
537
- st32:
452
+ goto st29;
453
+ st29:
538
454
  if ( ++p == pe )
539
- goto _out32;
540
- case 32:
541
- #line 542 "ext/http11/http11_parser.c"
455
+ goto _out29;
456
+ case 29:
457
+ #line 458 "ext/http11/http11_parser.c"
542
458
  switch( (*p) ) {
543
459
  case 32: goto tr34;
544
- case 37: goto st34;
460
+ case 37: goto st31;
545
461
  case 47: goto st1;
546
462
  case 60: goto st1;
547
463
  case 62: goto st1;
548
- case 63: goto tr46;
464
+ case 63: goto tr44;
549
465
  case 127: goto st1;
550
466
  }
551
467
  if ( (*p) > 31 ) {
@@ -553,17 +469,17 @@ case 32:
553
469
  goto st1;
554
470
  } else if ( (*p) >= 0 )
555
471
  goto st1;
556
- goto st33;
557
- st33:
472
+ goto st30;
473
+ st30:
558
474
  if ( ++p == pe )
559
- goto _out33;
560
- case 33:
475
+ goto _out30;
476
+ case 30:
561
477
  switch( (*p) ) {
562
478
  case 32: goto tr34;
563
- case 37: goto st34;
479
+ case 37: goto st31;
564
480
  case 60: goto st1;
565
481
  case 62: goto st1;
566
- case 63: goto tr46;
482
+ case 63: goto tr44;
567
483
  case 127: goto st1;
568
484
  }
569
485
  if ( (*p) > 31 ) {
@@ -571,48 +487,48 @@ case 33:
571
487
  goto st1;
572
488
  } else if ( (*p) >= 0 )
573
489
  goto st1;
574
- goto st33;
575
- st34:
490
+ goto st30;
491
+ st31:
576
492
  if ( ++p == pe )
577
- goto _out34;
578
- case 34:
493
+ goto _out31;
494
+ case 31:
579
495
  if ( (*p) < 65 ) {
580
496
  if ( 48 <= (*p) && (*p) <= 57 )
581
- goto st35;
497
+ goto st32;
582
498
  } else if ( (*p) > 70 ) {
583
499
  if ( 97 <= (*p) && (*p) <= 102 )
584
- goto st35;
500
+ goto st32;
585
501
  } else
586
- goto st35;
502
+ goto st32;
587
503
  goto st1;
588
- st35:
504
+ st32:
589
505
  if ( ++p == pe )
590
- goto _out35;
591
- case 35:
506
+ goto _out32;
507
+ case 32:
592
508
  if ( (*p) < 65 ) {
593
509
  if ( 48 <= (*p) && (*p) <= 57 )
594
- goto st33;
510
+ goto st30;
595
511
  } else if ( (*p) > 70 ) {
596
512
  if ( 97 <= (*p) && (*p) <= 102 )
597
- goto st33;
513
+ goto st30;
598
514
  } else
599
- goto st33;
515
+ goto st30;
600
516
  goto st1;
601
- tr46:
517
+ tr44:
602
518
  #line 33 "ext/http11/http11_parser.rl"
603
519
  {
604
520
  if(parser->request_uri != NULL)
605
521
  parser->request_uri(parser->data, parser->mark, p - parser->mark);
606
522
  }
607
- goto st36;
608
- st36:
523
+ goto st33;
524
+ st33:
609
525
  if ( ++p == pe )
610
- goto _out36;
611
- case 36:
612
- #line 613 "ext/http11/http11_parser.c"
526
+ goto _out33;
527
+ case 33:
528
+ #line 529 "ext/http11/http11_parser.c"
613
529
  switch( (*p) ) {
614
- case 32: goto tr48;
615
- case 37: goto tr54;
530
+ case 32: goto tr46;
531
+ case 37: goto tr51;
616
532
  case 60: goto st1;
617
533
  case 62: goto st1;
618
534
  case 127: goto st1;
@@ -622,19 +538,19 @@ case 36:
622
538
  goto st1;
623
539
  } else if ( (*p) >= 0 )
624
540
  goto st1;
625
- goto tr53;
626
- tr53:
541
+ goto tr50;
542
+ tr50:
627
543
  #line 14 "ext/http11/http11_parser.rl"
628
544
  { MARK(parser, p); }
629
- goto st37;
630
- st37:
545
+ goto st34;
546
+ st34:
631
547
  if ( ++p == pe )
632
- goto _out37;
633
- case 37:
634
- #line 635 "ext/http11/http11_parser.c"
548
+ goto _out34;
549
+ case 34:
550
+ #line 551 "ext/http11/http11_parser.c"
635
551
  switch( (*p) ) {
636
- case 32: goto tr48;
637
- case 37: goto st38;
552
+ case 32: goto tr46;
553
+ case 37: goto st35;
638
554
  case 60: goto st1;
639
555
  case 62: goto st1;
640
556
  case 127: goto st1;
@@ -644,58 +560,84 @@ case 37:
644
560
  goto st1;
645
561
  } else if ( (*p) >= 0 )
646
562
  goto st1;
647
- goto st37;
648
- tr54:
563
+ goto st34;
564
+ tr51:
649
565
  #line 14 "ext/http11/http11_parser.rl"
650
566
  { MARK(parser, p); }
651
- goto st38;
652
- st38:
567
+ goto st35;
568
+ st35:
653
569
  if ( ++p == pe )
654
- goto _out38;
655
- case 38:
656
- #line 657 "ext/http11/http11_parser.c"
570
+ goto _out35;
571
+ case 35:
572
+ #line 573 "ext/http11/http11_parser.c"
657
573
  if ( (*p) < 65 ) {
658
574
  if ( 48 <= (*p) && (*p) <= 57 )
659
- goto st39;
575
+ goto st36;
660
576
  } else if ( (*p) > 70 ) {
661
577
  if ( 97 <= (*p) && (*p) <= 102 )
662
- goto st39;
578
+ goto st36;
663
579
  } else
664
- goto st39;
580
+ goto st36;
665
581
  goto st1;
666
- st39:
582
+ st36:
667
583
  if ( ++p == pe )
668
- goto _out39;
669
- case 39:
584
+ goto _out36;
585
+ case 36:
670
586
  if ( (*p) < 65 ) {
671
587
  if ( 48 <= (*p) && (*p) <= 57 )
672
- goto st37;
588
+ goto st34;
673
589
  } else if ( (*p) > 70 ) {
674
590
  if ( 97 <= (*p) && (*p) <= 102 )
675
- goto st37;
591
+ goto st34;
676
592
  } else
677
- goto st37;
593
+ goto st34;
678
594
  goto st1;
679
595
  tr14:
680
596
  #line 14 "ext/http11/http11_parser.rl"
681
597
  { MARK(parser, p); }
682
- goto st40;
598
+ goto st37;
599
+ st37:
600
+ if ( ++p == pe )
601
+ goto _out37;
602
+ case 37:
603
+ #line 604 "ext/http11/http11_parser.c"
604
+ if ( (*p) == 69 )
605
+ goto st38;
606
+ goto st1;
607
+ st38:
608
+ if ( ++p == pe )
609
+ goto _out38;
610
+ case 38:
611
+ if ( (*p) == 84 )
612
+ goto st7;
613
+ goto st1;
614
+ tr15:
615
+ #line 14 "ext/http11/http11_parser.rl"
616
+ { MARK(parser, p); }
617
+ goto st39;
618
+ st39:
619
+ if ( ++p == pe )
620
+ goto _out39;
621
+ case 39:
622
+ #line 623 "ext/http11/http11_parser.c"
623
+ if ( (*p) == 69 )
624
+ goto st40;
625
+ goto st1;
683
626
  st40:
684
627
  if ( ++p == pe )
685
628
  goto _out40;
686
629
  case 40:
687
- #line 688 "ext/http11/http11_parser.c"
688
- if ( (*p) == 69 )
630
+ if ( (*p) == 65 )
689
631
  goto st41;
690
632
  goto st1;
691
633
  st41:
692
634
  if ( ++p == pe )
693
635
  goto _out41;
694
636
  case 41:
695
- if ( (*p) == 84 )
637
+ if ( (*p) == 68 )
696
638
  goto st7;
697
639
  goto st1;
698
- tr15:
640
+ tr16:
699
641
  #line 14 "ext/http11/http11_parser.rl"
700
642
  { MARK(parser, p); }
701
643
  goto st42;
@@ -703,115 +645,89 @@ st42:
703
645
  if ( ++p == pe )
704
646
  goto _out42;
705
647
  case 42:
706
- #line 707 "ext/http11/http11_parser.c"
707
- if ( (*p) == 69 )
648
+ #line 649 "ext/http11/http11_parser.c"
649
+ if ( (*p) == 80 )
708
650
  goto st43;
709
651
  goto st1;
710
652
  st43:
711
653
  if ( ++p == pe )
712
654
  goto _out43;
713
655
  case 43:
714
- if ( (*p) == 65 )
656
+ if ( (*p) == 84 )
715
657
  goto st44;
716
658
  goto st1;
717
659
  st44:
718
660
  if ( ++p == pe )
719
661
  goto _out44;
720
662
  case 44:
721
- if ( (*p) == 68 )
722
- goto st7;
663
+ if ( (*p) == 73 )
664
+ goto st45;
723
665
  goto st1;
724
- tr16:
725
- #line 14 "ext/http11/http11_parser.rl"
726
- { MARK(parser, p); }
727
- goto st45;
728
666
  st45:
729
667
  if ( ++p == pe )
730
668
  goto _out45;
731
669
  case 45:
732
- #line 733 "ext/http11/http11_parser.c"
733
- if ( (*p) == 80 )
670
+ if ( (*p) == 79 )
734
671
  goto st46;
735
672
  goto st1;
736
673
  st46:
737
674
  if ( ++p == pe )
738
675
  goto _out46;
739
676
  case 46:
740
- if ( (*p) == 84 )
677
+ if ( (*p) == 78 )
741
678
  goto st47;
742
679
  goto st1;
743
680
  st47:
744
681
  if ( ++p == pe )
745
682
  goto _out47;
746
683
  case 47:
747
- if ( (*p) == 73 )
748
- goto st48;
684
+ if ( (*p) == 83 )
685
+ goto st7;
749
686
  goto st1;
687
+ tr17:
688
+ #line 14 "ext/http11/http11_parser.rl"
689
+ { MARK(parser, p); }
690
+ goto st48;
750
691
  st48:
751
692
  if ( ++p == pe )
752
693
  goto _out48;
753
694
  case 48:
754
- if ( (*p) == 79 )
755
- goto st49;
695
+ #line 696 "ext/http11/http11_parser.c"
696
+ switch( (*p) ) {
697
+ case 79: goto st49;
698
+ case 85: goto st38;
699
+ }
756
700
  goto st1;
757
701
  st49:
758
702
  if ( ++p == pe )
759
703
  goto _out49;
760
704
  case 49:
761
- if ( (*p) == 78 )
762
- goto st50;
705
+ if ( (*p) == 83 )
706
+ goto st38;
763
707
  goto st1;
708
+ tr18:
709
+ #line 14 "ext/http11/http11_parser.rl"
710
+ { MARK(parser, p); }
711
+ goto st50;
764
712
  st50:
765
713
  if ( ++p == pe )
766
714
  goto _out50;
767
715
  case 50:
768
- if ( (*p) == 83 )
769
- goto st7;
716
+ #line 717 "ext/http11/http11_parser.c"
717
+ if ( (*p) == 82 )
718
+ goto st51;
770
719
  goto st1;
771
- tr17:
772
- #line 14 "ext/http11/http11_parser.rl"
773
- { MARK(parser, p); }
774
- goto st51;
775
720
  st51:
776
721
  if ( ++p == pe )
777
722
  goto _out51;
778
723
  case 51:
779
- #line 780 "ext/http11/http11_parser.c"
780
- switch( (*p) ) {
781
- case 79: goto st52;
782
- case 85: goto st41;
783
- }
724
+ if ( (*p) == 65 )
725
+ goto st52;
784
726
  goto st1;
785
727
  st52:
786
728
  if ( ++p == pe )
787
729
  goto _out52;
788
730
  case 52:
789
- if ( (*p) == 83 )
790
- goto st41;
791
- goto st1;
792
- tr18:
793
- #line 14 "ext/http11/http11_parser.rl"
794
- { MARK(parser, p); }
795
- goto st53;
796
- st53:
797
- if ( ++p == pe )
798
- goto _out53;
799
- case 53:
800
- #line 801 "ext/http11/http11_parser.c"
801
- if ( (*p) == 82 )
802
- goto st54;
803
- goto st1;
804
- st54:
805
- if ( ++p == pe )
806
- goto _out54;
807
- case 54:
808
- if ( (*p) == 65 )
809
- goto st55;
810
- goto st1;
811
- st55:
812
- if ( ++p == pe )
813
- goto _out55;
814
- case 55:
815
731
  if ( (*p) == 67 )
816
732
  goto st6;
817
733
  goto st1;
@@ -837,7 +753,7 @@ case 55:
837
753
  _out19: cs = 19; goto _out;
838
754
  _out20: cs = 20; goto _out;
839
755
  _out21: cs = 21; goto _out;
840
- _out56: cs = 56; goto _out;
756
+ _out53: cs = 53; goto _out;
841
757
  _out22: cs = 22; goto _out;
842
758
  _out23: cs = 23; goto _out;
843
759
  _out24: cs = 24; goto _out;
@@ -869,9 +785,6 @@ case 55:
869
785
  _out50: cs = 50; goto _out;
870
786
  _out51: cs = 51; goto _out;
871
787
  _out52: cs = 52; goto _out;
872
- _out53: cs = 53; goto _out;
873
- _out54: cs = 54; goto _out;
874
- _out55: cs = 55; goto _out;
875
788
 
876
789
  _out: {}
877
790
  }
@@ -882,7 +795,7 @@ case 55:
882
795
  if(parser->body_start) {
883
796
  /* final \r\n combo encountered so stop right here */
884
797
 
885
- #line 886 "ext/http11/http11_parser.c"
798
+ #line 799 "ext/http11/http11_parser.c"
886
799
  #line 131 "ext/http11/http11_parser.rl"
887
800
  parser->nread++;
888
801
  }
@@ -895,7 +808,7 @@ int http_parser_finish(http_parser *parser)
895
808
  int cs = parser->cs;
896
809
 
897
810
 
898
- #line 899 "ext/http11/http11_parser.c"
811
+ #line 812 "ext/http11/http11_parser.c"
899
812
  #line 142 "ext/http11/http11_parser.rl"
900
813
 
901
814
  parser->cs = cs;