colouringcode-passenger 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/NEWS +129 -0
  2. data/Rakefile +2 -2
  3. data/bin/passenger-install-apache2-module +1 -0
  4. data/bin/passenger-install-nginx-module +4 -2
  5. data/ext/apache2/Hooks.cpp +4 -2
  6. data/ext/common/ApplicationPoolServer.h +1 -1
  7. data/ext/common/ApplicationPoolServerExecutable.cpp +1 -1
  8. data/ext/common/MessageChannel.h +48 -4
  9. data/ext/common/StandardApplicationPool.h +4 -2
  10. data/ext/common/Version.h +1 -1
  11. data/ext/nginx/Configuration.c +1 -1
  12. data/ext/nginx/HttpStatusExtractor.h +1 -0
  13. data/ext/nginx/ScgiRequestParser.h +1 -0
  14. data/ext/oxt/system_calls.cpp +11 -0
  15. data/ext/oxt/system_calls.hpp +2 -1
  16. data/ext/oxt/thread.hpp +97 -1
  17. data/ext/phusion_passenger/native_support.c +30 -1
  18. data/lib/phusion_passenger/constants.rb +1 -1
  19. data/lib/phusion_passenger/dependencies.rb +32 -0
  20. data/lib/phusion_passenger/message_channel.rb +45 -3
  21. data/lib/phusion_passenger/platform_info.rb +1 -1
  22. data/lib/phusion_passenger/rack/application_spawner.rb +10 -4
  23. data/lib/phusion_passenger/rack/request_handler.rb +2 -5
  24. data/lib/phusion_passenger/railz/application_spawner.rb +59 -7
  25. data/lib/phusion_passenger/utils.rb +70 -16
  26. data/{vendor/rack-1.0.0-git/lib/rack → lib/phusion_passenger/utils}/rewindable_input.rb +34 -9
  27. data/test/ApplicationPoolTest.cpp +1 -1
  28. data/test/MessageChannelTest.cpp +9 -1
  29. data/test/stub/message_channel.rb +1 -1
  30. data/test/stub/message_channel_2.rb +1 -1
  31. data/test/stub/message_channel_3.rb +2 -2
  32. metadata +43 -155
  33. data/doc/Architectural overview.html +0 -1
  34. data/doc/rdoc/classes/ConditionVariable.html +0 -194
  35. data/doc/rdoc/classes/Exception.html +0 -120
  36. data/doc/rdoc/classes/GC.html +0 -113
  37. data/doc/rdoc/classes/IO.html +0 -169
  38. data/doc/rdoc/classes/PhusionPassenger.html +0 -238
  39. data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +0 -153
  40. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +0 -517
  41. data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +0 -719
  42. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +0 -97
  43. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +0 -96
  44. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +0 -97
  45. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +0 -96
  46. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +0 -598
  47. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +0 -140
  48. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +0 -317
  49. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess/Instance.html +0 -138
  50. data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +0 -154
  51. data/doc/rdoc/classes/PhusionPassenger/Application.html +0 -283
  52. data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +0 -172
  53. data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +0 -145
  54. data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +0 -181
  55. data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +0 -141
  56. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +0 -92
  57. data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +0 -489
  58. data/doc/rdoc/classes/PhusionPassenger/NativeSupport.html +0 -350
  59. data/doc/rdoc/classes/PhusionPassenger/Rack.html +0 -91
  60. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +0 -188
  61. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +0 -199
  62. data/doc/rdoc/classes/PhusionPassenger/Railz.html +0 -95
  63. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +0 -438
  64. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner/Error.html +0 -98
  65. data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +0 -200
  66. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +0 -436
  67. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner/Error.html +0 -98
  68. data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +0 -155
  69. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +0 -402
  70. data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +0 -125
  71. data/doc/rdoc/classes/PhusionPassenger/Utils.html +0 -803
  72. data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +0 -169
  73. data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +0 -140
  74. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +0 -89
  75. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +0 -188
  76. data/doc/rdoc/classes/PlatformInfo.html +0 -866
  77. data/doc/rdoc/classes/RakeExtensions.html +0 -197
  78. data/doc/rdoc/classes/Signal.html +0 -131
  79. data/doc/rdoc/created.rid +0 -1
  80. data/doc/rdoc/files/DEVELOPERS_TXT.html +0 -255
  81. data/doc/rdoc/files/README.html +0 -175
  82. data/doc/rdoc/files/ext/phusion_passenger/native_support_c.html +0 -92
  83. data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +0 -129
  84. data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +0 -129
  85. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +0 -126
  86. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +0 -128
  87. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +0 -130
  88. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +0 -122
  89. data/doc/rdoc/files/lib/phusion_passenger/application_rb.html +0 -127
  90. data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +0 -126
  91. data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +0 -122
  92. data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +0 -134
  93. data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +0 -122
  94. data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +0 -122
  95. data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +0 -126
  96. data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +0 -120
  97. data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +0 -122
  98. data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +0 -127
  99. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +0 -133
  100. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +0 -125
  101. data/doc/rdoc/files/lib/phusion_passenger/railz/application_spawner_rb.html +0 -140
  102. data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +0 -126
  103. data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +0 -145
  104. data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +0 -125
  105. data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +0 -122
  106. data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +0 -159
  107. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +0 -174
  108. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +0 -129
  109. data/doc/rdoc/files/misc/rake/extensions_rb.html +0 -130
  110. data/doc/rdoc/fr_class_index.html +0 -91
  111. data/doc/rdoc/fr_file_index.html +0 -76
  112. data/doc/rdoc/fr_method_index.html +0 -205
  113. data/doc/rdoc/index.html +0 -26
  114. data/doc/rdoc/rdoc-style.css +0 -187
  115. data/vendor/README +0 -13
  116. data/vendor/README_FOR_PACKAGERS +0 -1
  117. data/vendor/rack-1.0.0-git/COPYING +0 -18
  118. data/vendor/rack-1.0.0-git/KNOWN-ISSUES +0 -18
  119. data/vendor/rack-1.0.0-git/README +0 -353
  120. data/vendor/rack-1.0.0-git/Rakefile +0 -164
  121. data/vendor/rack-1.0.0-git/lib/rack.rb +0 -90
  122. data/vendor/rack-1.0.0-git/lib/rack/adapter/camping.rb +0 -22
  123. data/vendor/rack-1.0.0-git/lib/rack/auth/abstract/handler.rb +0 -37
  124. data/vendor/rack-1.0.0-git/lib/rack/auth/abstract/request.rb +0 -37
  125. data/vendor/rack-1.0.0-git/lib/rack/auth/basic.rb +0 -58
  126. data/vendor/rack-1.0.0-git/lib/rack/auth/digest/md5.rb +0 -124
  127. data/vendor/rack-1.0.0-git/lib/rack/auth/digest/nonce.rb +0 -51
  128. data/vendor/rack-1.0.0-git/lib/rack/auth/digest/params.rb +0 -55
  129. data/vendor/rack-1.0.0-git/lib/rack/auth/digest/request.rb +0 -40
  130. data/vendor/rack-1.0.0-git/lib/rack/auth/openid.rb +0 -487
  131. data/vendor/rack-1.0.0-git/lib/rack/builder.rb +0 -63
  132. data/vendor/rack-1.0.0-git/lib/rack/cascade.rb +0 -41
  133. data/vendor/rack-1.0.0-git/lib/rack/chunked.rb +0 -49
  134. data/vendor/rack-1.0.0-git/lib/rack/commonlogger.rb +0 -52
  135. data/vendor/rack-1.0.0-git/lib/rack/conditionalget.rb +0 -47
  136. data/vendor/rack-1.0.0-git/lib/rack/content_length.rb +0 -29
  137. data/vendor/rack-1.0.0-git/lib/rack/content_type.rb +0 -23
  138. data/vendor/rack-1.0.0-git/lib/rack/deflater.rb +0 -96
  139. data/vendor/rack-1.0.0-git/lib/rack/directory.rb +0 -153
  140. data/vendor/rack-1.0.0-git/lib/rack/file.rb +0 -88
  141. data/vendor/rack-1.0.0-git/lib/rack/handler.rb +0 -69
  142. data/vendor/rack-1.0.0-git/lib/rack/handler/cgi.rb +0 -61
  143. data/vendor/rack-1.0.0-git/lib/rack/handler/evented_mongrel.rb +0 -8
  144. data/vendor/rack-1.0.0-git/lib/rack/handler/fastcgi.rb +0 -88
  145. data/vendor/rack-1.0.0-git/lib/rack/handler/lsws.rb +0 -55
  146. data/vendor/rack-1.0.0-git/lib/rack/handler/mongrel.rb +0 -84
  147. data/vendor/rack-1.0.0-git/lib/rack/handler/scgi.rb +0 -59
  148. data/vendor/rack-1.0.0-git/lib/rack/handler/swiftiplied_mongrel.rb +0 -8
  149. data/vendor/rack-1.0.0-git/lib/rack/handler/thin.rb +0 -18
  150. data/vendor/rack-1.0.0-git/lib/rack/handler/webrick.rb +0 -67
  151. data/vendor/rack-1.0.0-git/lib/rack/head.rb +0 -19
  152. data/vendor/rack-1.0.0-git/lib/rack/lint.rb +0 -537
  153. data/vendor/rack-1.0.0-git/lib/rack/lobster.rb +0 -65
  154. data/vendor/rack-1.0.0-git/lib/rack/lock.rb +0 -16
  155. data/vendor/rack-1.0.0-git/lib/rack/methodoverride.rb +0 -27
  156. data/vendor/rack-1.0.0-git/lib/rack/mime.rb +0 -204
  157. data/vendor/rack-1.0.0-git/lib/rack/mock.rb +0 -184
  158. data/vendor/rack-1.0.0-git/lib/rack/recursive.rb +0 -57
  159. data/vendor/rack-1.0.0-git/lib/rack/reloader.rb +0 -106
  160. data/vendor/rack-1.0.0-git/lib/rack/request.rb +0 -248
  161. data/vendor/rack-1.0.0-git/lib/rack/response.rb +0 -183
  162. data/vendor/rack-1.0.0-git/lib/rack/session/abstract/id.rb +0 -142
  163. data/vendor/rack-1.0.0-git/lib/rack/session/cookie.rb +0 -91
  164. data/vendor/rack-1.0.0-git/lib/rack/session/memcache.rb +0 -109
  165. data/vendor/rack-1.0.0-git/lib/rack/session/pool.rb +0 -100
  166. data/vendor/rack-1.0.0-git/lib/rack/showexceptions.rb +0 -349
  167. data/vendor/rack-1.0.0-git/lib/rack/showstatus.rb +0 -106
  168. data/vendor/rack-1.0.0-git/lib/rack/static.rb +0 -38
  169. data/vendor/rack-1.0.0-git/lib/rack/urlmap.rb +0 -55
  170. data/vendor/rack-1.0.0-git/lib/rack/utils.rb +0 -522
@@ -1,153 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
- <html>
6
- <head>
7
- <title>Class: PhusionPassenger::AbstractInstaller</title>
8
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
9
- <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
10
-
11
- <script language="JavaScript" type="text/javascript">
12
- // <![CDATA[
13
-
14
- function toggleSource( id )
15
- {
16
- var elem
17
- var link
18
-
19
- if( document.getElementById )
20
- {
21
- elem = document.getElementById( id )
22
- link = document.getElementById( "l_" + id )
23
- }
24
- else if ( document.all )
25
- {
26
- elem = eval( "document.all." + id )
27
- link = eval( "document.all.l_" + id )
28
- }
29
- else
30
- return false;
31
-
32
- if( elem.style.display == "block" )
33
- {
34
- elem.style.display = "none"
35
- link.innerHTML = "show source"
36
- }
37
- else
38
- {
39
- elem.style.display = "block"
40
- link.innerHTML = "hide source"
41
- }
42
- }
43
-
44
- function openCode( url )
45
- {
46
- window.open( url, "SOURCE_CODE", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=480,width=750" ).focus();
47
- }
48
- // ]]>
49
- </script>
50
- </head>
51
-
52
- <body>
53
- <table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr>
54
- <td class="file-title"><span class="file-title-prefix">Class</span><br />PhusionPassenger::AbstractInstaller</td>
55
- <td align="right">
56
- <table cellspacing="0" cellpadding="2">
57
- <tr valign="top">
58
- <td>In:</td>
59
- <td>
60
- <a href="../../files/lib/phusion_passenger/abstract_installer_rb.html">lib/phusion_passenger/abstract_installer.rb</a>
61
- </td>
62
- </tr>
63
- <tr>
64
- <td>Parent:</td>
65
- <td>
66
- Object
67
- </td>
68
- </tr>
69
- </table>
70
- </td>
71
- </tr>
72
- </table>
73
- <!-- banner header -->
74
-
75
- <div id="bodyContent">
76
- <div id="content">
77
-
78
- <div class="description"><p>
79
- Abstract base class for installers. Used by
80
- passenger-install-apache2-module and passenger-install-nginx-module.
81
- </p>
82
- </div>
83
-
84
-
85
-
86
- <div class="sectiontitle">Methods</div>
87
- <ul>
88
- <li><a href="#M000148">new</a></li>
89
- <li><a href="#M000149">start</a></li>
90
- </ul>
91
-
92
-
93
-
94
-
95
- <div class="sectiontitle">Constants</div>
96
- <table border='0' cellpadding='5'>
97
- <tr valign='top'>
98
- <td class="attr-name">PASSENGER_WEBSITE</td>
99
- <td>=</td>
100
- <td class="attr-value">&quot;http://www.modrails.com/&quot;</td>
101
- </tr>
102
- <tr valign='top'>
103
- <td class="attr-name">PHUSION_WEBSITE</td>
104
- <td>=</td>
105
- <td class="attr-value">&quot;www.phusion.nl&quot;</td>
106
- </tr>
107
- </table>
108
-
109
-
110
- <div class="sectiontitle">Public Class methods</div>
111
- <div class="method">
112
- <div class="title">
113
- <a name="M000148"></a><b>new</b>(options = {})
114
- </div>
115
- <div class="sourcecode">
116
- <p class="source-link">[ <a href="javascript:toggleSource('M000148_source')" id="l_M000148_source">show source</a> ]</p>
117
- <div id="M000148_source" class="dyn-source">
118
- <pre>
119
- <span class="ruby-comment cmt"># File lib/phusion_passenger/abstract_installer.rb, line 36</span>
120
- 36: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">options</span> = {})
121
- 37: <span class="ruby-identifier">options</span>.<span class="ruby-identifier">each_pair</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span><span class="ruby-operator">|</span>
122
- 38: <span class="ruby-identifier">instance_variable_set</span>(<span class="ruby-node">&quot;@#{key}&quot;</span><span class="ruby-node">&quot;@#{key}&quot;</span>, <span class="ruby-identifier">value</span>)
123
- 39: <span class="ruby-keyword kw">end</span>
124
- 40: <span class="ruby-keyword kw">end</span>
125
- </pre>
126
- </div>
127
- </div>
128
- </div>
129
- <div class="sectiontitle">Public Instance methods</div>
130
- <div class="method">
131
- <div class="title">
132
- <a name="M000149"></a><b>start</b>()
133
- </div>
134
- <div class="sourcecode">
135
- <p class="source-link">[ <a href="javascript:toggleSource('M000149_source')" id="l_M000149_source">show source</a> ]</p>
136
- <div id="M000149_source" class="dyn-source">
137
- <pre>
138
- <span class="ruby-comment cmt"># File lib/phusion_passenger/abstract_installer.rb, line 42</span>
139
- 42: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">start</span>
140
- 43: <span class="ruby-identifier">install!</span>
141
- 44: <span class="ruby-keyword kw">ensure</span>
142
- 45: <span class="ruby-identifier">reset_terminal_colors</span>
143
- 46: <span class="ruby-keyword kw">end</span>
144
- </pre>
145
- </div>
146
- </div>
147
- </div>
148
- </div>
149
-
150
- </div>
151
-
152
- </body>
153
- </html>
@@ -1,517 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
- <html>
6
- <head>
7
- <title>Class: PhusionPassenger::AbstractRequestHandler</title>
8
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
9
- <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
10
-
11
- <script language="JavaScript" type="text/javascript">
12
- // <![CDATA[
13
-
14
- function toggleSource( id )
15
- {
16
- var elem
17
- var link
18
-
19
- if( document.getElementById )
20
- {
21
- elem = document.getElementById( id )
22
- link = document.getElementById( "l_" + id )
23
- }
24
- else if ( document.all )
25
- {
26
- elem = eval( "document.all." + id )
27
- link = eval( "document.all.l_" + id )
28
- }
29
- else
30
- return false;
31
-
32
- if( elem.style.display == "block" )
33
- {
34
- elem.style.display = "none"
35
- link.innerHTML = "show source"
36
- }
37
- else
38
- {
39
- elem.style.display = "block"
40
- link.innerHTML = "hide source"
41
- }
42
- }
43
-
44
- function openCode( url )
45
- {
46
- window.open( url, "SOURCE_CODE", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=480,width=750" ).focus();
47
- }
48
- // ]]>
49
- </script>
50
- </head>
51
-
52
- <body>
53
- <table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr>
54
- <td class="file-title"><span class="file-title-prefix">Class</span><br />PhusionPassenger::AbstractRequestHandler</td>
55
- <td align="right">
56
- <table cellspacing="0" cellpadding="2">
57
- <tr valign="top">
58
- <td>In:</td>
59
- <td>
60
- <a href="../../files/lib/phusion_passenger/abstract_request_handler_rb.html">lib/phusion_passenger/abstract_request_handler.rb</a>
61
- </td>
62
- </tr>
63
- <tr>
64
- <td>Parent:</td>
65
- <td>
66
- Object
67
- </td>
68
- </tr>
69
- </table>
70
- </td>
71
- </tr>
72
- </table>
73
- <!-- banner header -->
74
-
75
- <div id="bodyContent">
76
- <div id="content">
77
-
78
- <div class="description"><p>
79
- The request handler is the layer which connects Apache with the underlying
80
- application&#8216;s request dispatcher (i.e. either Rails&#8216;s
81
- Dispatcher class or <a href="Rack.html">Rack</a>). The request
82
- handler&#8216;s job is to process incoming HTTP requests using the
83
- currently loaded Ruby on Rails application. HTTP requests are forwarded to
84
- the request handler by the web server. HTTP responses generated by the RoR
85
- application are forwarded to the web server, which, in turn, sends the
86
- response back to the HTTP client.
87
- </p>
88
- <p>
89
- <a href="AbstractRequestHandler.html">AbstractRequestHandler</a> is an
90
- abstract base class for easing the implementation of request handlers for
91
- Rails and <a href="Rack.html">Rack</a>.
92
- </p>
93
- <h2>Design decisions</h2>
94
- <p>
95
- Some design decisions are made because we want to decrease system
96
- administrator maintenance overhead. These decisions are documented in this
97
- section.
98
- </p>
99
- <h3>Owner pipes</h3>
100
- <p>
101
- Because only the web server communicates directly with a request handler,
102
- we want the request handler to exit if the web server has also exited. This
103
- is implemented by using a so-called _owner pipe_. The writable part of the
104
- pipe will be passed to the web server* via a Unix socket, and the web
105
- server will own that part of the pipe, while <a
106
- href="AbstractRequestHandler.html">AbstractRequestHandler</a> owns the
107
- readable part of the pipe. <a
108
- href="AbstractRequestHandler.html">AbstractRequestHandler</a> will
109
- continuously check whether the other side of the pipe has been closed. If
110
- so, then it knows that the web server has exited, and so the request
111
- handler will exit as well. This works even if the web server gets killed by
112
- SIGKILL.
113
- </p>
114
- <ul>
115
- <li>It might also be passed to the ApplicationPoolServerExecutable, if the web
116
- server&#8216;s using ApplicationPoolServer instead of
117
- StandardApplicationPool.
118
-
119
- </li>
120
- </ul>
121
- <h2>Request format</h2>
122
- <p>
123
- Incoming &quot;HTTP requests&quot; are not true HTTP requests, i.e. their
124
- binary representation do not conform to RFC 2616. Instead, the request
125
- format is based on CGI, and is similar to that of SCGI.
126
- </p>
127
- <p>
128
- The format consists of 3 parts:
129
- </p>
130
- <ul>
131
- <li>A 32-bit big-endian integer, containing the size of the transformed
132
- headers.
133
-
134
- </li>
135
- <li>The transformed HTTP headers.
136
-
137
- </li>
138
- <li>The verbatim (untransformed) HTTP request body.
139
-
140
- </li>
141
- </ul>
142
- <p>
143
- HTTP headers are transformed to a format that satisfies the following
144
- grammar:
145
- </p>
146
- <pre>
147
- headers ::= header*
148
- header ::= name NUL value NUL
149
- name ::= notnull+
150
- value ::= notnull+
151
- notnull ::= &quot;\x01&quot; | &quot;\x02&quot; | &quot;\x02&quot; | ... | &quot;\xFF&quot;
152
- NUL = &quot;\x00&quot;
153
- </pre>
154
- <p>
155
- The web server transforms the HTTP request to the aforementioned format,
156
- and sends it to the request handler.
157
- </p>
158
- </div>
159
-
160
-
161
-
162
- <div class="sectiontitle">Methods</div>
163
- <ul>
164
- <li><a href="#M000135">cleanup</a></li>
165
- <li><a href="#M000137">main_loop</a></li>
166
- <li><a href="#M000136">main_loop_running?</a></li>
167
- <li><a href="#M000134">new</a></li>
168
- <li><a href="#M000138">start_main_loop_thread</a></li>
169
- </ul>
170
-
171
- <div class="sectiontitle">Included Modules</div>
172
- <ul>
173
- <li><a href="Utils.html">Utils</a></li>
174
- </ul>
175
-
176
-
177
-
178
- <div class="sectiontitle">Constants</div>
179
- <table border='0' cellpadding='5'>
180
- <tr valign='top'>
181
- <td class="attr-name">HARD_TERMINATION_SIGNAL</td>
182
- <td>=</td>
183
- <td class="attr-value">&quot;SIGTERM&quot;</td>
184
- </tr>
185
- <tr valign='top'>
186
- <td>&nbsp;</td>
187
- <td colspan="2" class="attr-desc">
188
- <a href="../Signal.html">Signal</a> which will cause the Rails application
189
- to exit immediately.
190
-
191
- </td>
192
- </tr>
193
- <tr valign='top'>
194
- <td class="attr-name">SOFT_TERMINATION_SIGNAL</td>
195
- <td>=</td>
196
- <td class="attr-value">&quot;SIGUSR1&quot;</td>
197
- </tr>
198
- <tr valign='top'>
199
- <td>&nbsp;</td>
200
- <td colspan="2" class="attr-desc">
201
- <a href="../Signal.html">Signal</a> which will cause the Rails application
202
- to exit as soon as it&#8216;s done processing a request.
203
-
204
- </td>
205
- </tr>
206
- <tr valign='top'>
207
- <td class="attr-name">BACKLOG_SIZE</td>
208
- <td>=</td>
209
- <td class="attr-value">100</td>
210
- </tr>
211
- <tr valign='top'>
212
- <td class="attr-name">MAX_HEADER_SIZE</td>
213
- <td>=</td>
214
- <td class="attr-value">128 * 1024</td>
215
- </tr>
216
- <tr valign='top'>
217
- <td class="attr-name">PASSENGER_HEADER</td>
218
- <td>=</td>
219
- <td class="attr-value">determine_passenger_header</td>
220
- </tr>
221
- </table>
222
-
223
- <div class="sectiontitle">Attributes</div>
224
- <table border='0' cellpadding='5'>
225
- <tr valign='top'>
226
- <td class='attr-rw'>
227
- [R]
228
- </td>
229
- <td class='attr-name'>iterations</td>
230
- <td class='attr-desc'>
231
- The number of times the main loop has iterated so far. Mostly useful for
232
- unit test assertions.
233
-
234
- </td>
235
- </tr>
236
- <tr valign='top'>
237
- <td class='attr-rw'>
238
- [RW]
239
- </td>
240
- <td class='attr-name'>memory_limit</td>
241
- <td class='attr-desc'>
242
- Specifies the maximum allowed memory usage, in MB. If after having
243
- processed a request <a
244
- href="AbstractRequestHandler.html">AbstractRequestHandler</a> detects that
245
- memory usage has risen above this limit, then it will gracefully exit (that
246
- is, exit after having processed all pending requests).
247
-
248
- <p>
249
- A value of 0 (the default) indicates that there&#8216;s no limit.
250
- </p>
251
- </td>
252
- </tr>
253
- <tr valign='top'>
254
- <td class='attr-rw'>
255
- [R]
256
- </td>
257
- <td class='attr-name'>processed_requests</td>
258
- <td class='attr-desc'>
259
- Number of requests processed so far. This includes requests that raised
260
- exceptions.
261
-
262
- </td>
263
- </tr>
264
- <tr valign='top'>
265
- <td class='attr-rw'>
266
- [R]
267
- </td>
268
- <td class='attr-name'>socket_name</td>
269
- <td class='attr-desc'>
270
- The name of the socket on which the request handler accepts <a
271
- href="AbstractRequestHandler.html#M000134">new</a> connections. At this
272
- moment, this value is always the filename of a Unix domain socket.
273
-
274
- <p>
275
- See also #socket_type.
276
- </p>
277
- </td>
278
- </tr>
279
- <tr valign='top'>
280
- <td class='attr-rw'>
281
- [R]
282
- </td>
283
- <td class='attr-name'>socket_type</td>
284
- <td class='attr-desc'>
285
- The type of socket that #socket_name refers to. At the moment, the value is
286
- always &#8216;unix&#8217;, which indicates a Unix domain socket.
287
-
288
- </td>
289
- </tr>
290
- </table>
291
-
292
- <div class="sectiontitle">Public Class methods</div>
293
- <div class="method">
294
- <div class="title">
295
- <a name="M000134"></a><b>new</b>(owner_pipe, options = {})
296
- </div>
297
- <div class="description">
298
- <p>
299
- Create a <a href="AbstractRequestHandler.html#M000134">new</a>
300
- RequestHandler with the given owner pipe. <tt>owner_pipe</tt> must be the
301
- readable part of a pipe <a href="../IO.html">IO</a> object.
302
- </p>
303
- <p>
304
- Additionally, the following options may be given:
305
- </p>
306
- <ul>
307
- <li>memory_limit: Used to set the <tt>memory_limit</tt> attribute.
308
-
309
- </li>
310
- </ul>
311
- </div>
312
- <div class="sourcecode">
313
- <p class="source-link">[ <a href="javascript:toggleSource('M000134_source')" id="l_M000134_source">show source</a> ]</p>
314
- <div id="M000134_source" class="dyn-source">
315
- <pre>
316
- <span class="ruby-comment cmt"># File lib/phusion_passenger/abstract_request_handler.rb, line 137</span>
317
- 137: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">owner_pipe</span>, <span class="ruby-identifier">options</span> = {})
318
- 138: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">should_use_unix_sockets?</span>
319
- 139: <span class="ruby-identifier">create_unix_socket_on_filesystem</span>
320
- 140: <span class="ruby-keyword kw">else</span>
321
- 141: <span class="ruby-identifier">create_tcp_socket</span>
322
- 142: <span class="ruby-keyword kw">end</span>
323
- 143: <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">close_on_exec!</span>
324
- 144: <span class="ruby-ivar">@owner_pipe</span> = <span class="ruby-identifier">owner_pipe</span>
325
- 145: <span class="ruby-ivar">@previous_signal_handlers</span> = {}
326
- 146: <span class="ruby-ivar">@main_loop_generation</span> = <span class="ruby-value">0</span>
327
- 147: <span class="ruby-ivar">@main_loop_thread_lock</span> = <span class="ruby-constant">Mutex</span>.<span class="ruby-identifier">new</span>
328
- 148: <span class="ruby-ivar">@main_loop_thread_cond</span> = <span class="ruby-constant">ConditionVariable</span>.<span class="ruby-identifier">new</span>
329
- 149: <span class="ruby-ivar">@memory_limit</span> = <span class="ruby-identifier">options</span>[<span class="ruby-value str">&quot;memory_limit&quot;</span>] <span class="ruby-operator">||</span> <span class="ruby-value">0</span>
330
- 150: <span class="ruby-ivar">@iterations</span> = <span class="ruby-value">0</span>
331
- 151: <span class="ruby-ivar">@processed_requests</span> = <span class="ruby-value">0</span>
332
- 152: <span class="ruby-ivar">@main_loop_running</span> = <span class="ruby-keyword kw">false</span>
333
- 153: <span class="ruby-keyword kw">end</span>
334
- </pre>
335
- </div>
336
- </div>
337
- </div>
338
- <div class="sectiontitle">Public Instance methods</div>
339
- <div class="method">
340
- <div class="title">
341
- <a name="M000135"></a><b>cleanup</b>()
342
- </div>
343
- <div class="description">
344
- <p>
345
- Clean up temporary stuff created by the request handler.
346
- </p>
347
- <p>
348
- If the main loop was started by <a
349
- href="AbstractRequestHandler.html#M000137">#main_loop</a>, then this method
350
- may only be called after the main loop has exited.
351
- </p>
352
- <p>
353
- If the main loop was started by <a
354
- href="AbstractRequestHandler.html#M000138">#start_main_loop_thread</a>,
355
- then this method may be called at any time, and it will stop the main loop
356
- thread.
357
- </p>
358
- </div>
359
- <div class="sourcecode">
360
- <p class="source-link">[ <a href="javascript:toggleSource('M000135_source')" id="l_M000135_source">show source</a> ]</p>
361
- <div id="M000135_source" class="dyn-source">
362
- <pre>
363
- <span class="ruby-comment cmt"># File lib/phusion_passenger/abstract_request_handler.rb, line 162</span>
364
- 162: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">cleanup</span>
365
- 163: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@main_loop_thread</span>
366
- 164: <span class="ruby-ivar">@main_loop_thread_lock</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
367
- 165: <span class="ruby-ivar">@graceful_termination_pipe</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">close</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
368
- 166: <span class="ruby-keyword kw">end</span>
369
- 167: <span class="ruby-ivar">@main_loop_thread</span>.<span class="ruby-identifier">join</span>
370
- 168: <span class="ruby-keyword kw">end</span>
371
- 169: <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">close</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
372
- 170: <span class="ruby-ivar">@owner_pipe</span>.<span class="ruby-identifier">close</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
373
- 171: <span class="ruby-constant">File</span>.<span class="ruby-identifier">unlink</span>(<span class="ruby-ivar">@socket_name</span>) <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
374
- 172: <span class="ruby-keyword kw">end</span>
375
- </pre>
376
- </div>
377
- </div>
378
- </div>
379
- <div class="method">
380
- <div class="title">
381
- <a name="M000137"></a><b>main_loop</b>()
382
- </div>
383
- <div class="description">
384
- <p>
385
- Enter the request handler&#8216;s main loop.
386
- </p>
387
- </div>
388
- <div class="sourcecode">
389
- <p class="source-link">[ <a href="javascript:toggleSource('M000137_source')" id="l_M000137_source">show source</a> ]</p>
390
- <div id="M000137_source" class="dyn-source">
391
- <pre>
392
- <span class="ruby-comment cmt"># File lib/phusion_passenger/abstract_request_handler.rb, line 180</span>
393
- 180: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">main_loop</span>
394
- 181: <span class="ruby-identifier">reset_signal_handlers</span>
395
- 182: <span class="ruby-keyword kw">begin</span>
396
- 183: <span class="ruby-ivar">@graceful_termination_pipe</span> = <span class="ruby-constant">IO</span>.<span class="ruby-identifier">pipe</span>
397
- 184: <span class="ruby-ivar">@graceful_termination_pipe</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">close_on_exec!</span>
398
- 185: <span class="ruby-ivar">@graceful_termination_pipe</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">close_on_exec!</span>
399
- 186:
400
- 187: <span class="ruby-ivar">@main_loop_thread_lock</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
401
- 188: <span class="ruby-ivar">@main_loop_generation</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
402
- 189: <span class="ruby-ivar">@main_loop_running</span> = <span class="ruby-keyword kw">true</span>
403
- 190: <span class="ruby-ivar">@main_loop_thread_cond</span>.<span class="ruby-identifier">broadcast</span>
404
- 191: <span class="ruby-keyword kw">end</span>
405
- 192:
406
- 193: <span class="ruby-identifier">install_useful_signal_handlers</span>
407
- 194:
408
- 195: <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
409
- 196: <span class="ruby-ivar">@iterations</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
410
- 197: <span class="ruby-identifier">client</span> = <span class="ruby-identifier">accept_connection</span>
411
- 198: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">client</span>.<span class="ruby-identifier">nil?</span>
412
- 199: <span class="ruby-keyword kw">break</span>
413
- 200: <span class="ruby-keyword kw">end</span>
414
- 201: <span class="ruby-keyword kw">begin</span>
415
- 202: <span class="ruby-identifier">headers</span>, <span class="ruby-identifier">input</span> = <span class="ruby-identifier">parse_request</span>(<span class="ruby-identifier">client</span>)
416
- 203: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">headers</span>
417
- 204: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">headers</span>[<span class="ruby-constant">REQUEST_METHOD</span>] <span class="ruby-operator">==</span> <span class="ruby-constant">PING</span>
418
- 205: <span class="ruby-identifier">process_ping</span>(<span class="ruby-identifier">headers</span>, <span class="ruby-identifier">input</span>, <span class="ruby-identifier">client</span>)
419
- 206: <span class="ruby-keyword kw">else</span>
420
- 207: <span class="ruby-identifier">process_request</span>(<span class="ruby-identifier">headers</span>, <span class="ruby-identifier">input</span>, <span class="ruby-identifier">client</span>)
421
- 208: <span class="ruby-keyword kw">end</span>
422
- 209: <span class="ruby-keyword kw">end</span>
423
- 210: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">IOError</span>, <span class="ruby-constant">SocketError</span>, <span class="ruby-constant">SystemCallError</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
424
- 211: <span class="ruby-identifier">print_exception</span>(<span class="ruby-value str">&quot;Passenger RequestHandler&quot;</span>, <span class="ruby-identifier">e</span>)
425
- 212: <span class="ruby-keyword kw">ensure</span>
426
- 213: <span class="ruby-comment cmt"># 'input' is the same as 'client' so we don't</span>
427
- 214: <span class="ruby-comment cmt"># need to close that.</span>
428
- 215: <span class="ruby-comment cmt"># The 'close_write' here prevents forked child</span>
429
- 216: <span class="ruby-comment cmt"># processes from unintentionally keeping the</span>
430
- 217: <span class="ruby-comment cmt"># connection open.</span>
431
- 218: <span class="ruby-identifier">client</span>.<span class="ruby-identifier">close_write</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
432
- 219: <span class="ruby-identifier">client</span>.<span class="ruby-identifier">close</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
433
- 220: <span class="ruby-keyword kw">end</span>
434
- 221: <span class="ruby-ivar">@processed_requests</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
435
- 222: <span class="ruby-keyword kw">end</span>
436
- 223: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">EOFError</span>
437
- 224: <span class="ruby-comment cmt"># Exit main loop.</span>
438
- 225: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Interrupt</span>
439
- 226: <span class="ruby-comment cmt"># Exit main loop.</span>
440
- 227: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">SignalException</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">signal</span>
441
- 228: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">signal</span>.<span class="ruby-identifier">message</span> <span class="ruby-operator">!=</span> <span class="ruby-constant">HARD_TERMINATION_SIGNAL</span> <span class="ruby-operator">&amp;&amp;</span>
442
- 229: <span class="ruby-identifier">signal</span>.<span class="ruby-identifier">message</span> <span class="ruby-operator">!=</span> <span class="ruby-constant">SOFT_TERMINATION_SIGNAL</span>
443
- 230: <span class="ruby-identifier">raise</span>
444
- 231: <span class="ruby-keyword kw">end</span>
445
- 232: <span class="ruby-keyword kw">ensure</span>
446
- 233: <span class="ruby-identifier">revert_signal_handlers</span>
447
- 234: <span class="ruby-ivar">@main_loop_thread_lock</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
448
- 235: <span class="ruby-ivar">@graceful_termination_pipe</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">close</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
449
- 236: <span class="ruby-ivar">@graceful_termination_pipe</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">close</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
450
- 237: <span class="ruby-ivar">@main_loop_generation</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
451
- 238: <span class="ruby-ivar">@main_loop_running</span> = <span class="ruby-keyword kw">false</span>
452
- 239: <span class="ruby-ivar">@main_loop_thread_cond</span>.<span class="ruby-identifier">broadcast</span>
453
- 240: <span class="ruby-keyword kw">end</span>
454
- 241: <span class="ruby-keyword kw">end</span>
455
- 242: <span class="ruby-keyword kw">end</span>
456
- </pre>
457
- </div>
458
- </div>
459
- </div>
460
- <div class="method">
461
- <div class="title">
462
- <a name="M000136"></a><b>main_loop_running?</b>()
463
- </div>
464
- <div class="description">
465
- <p>
466
- Check whether the main loop&#8216;s currently running.
467
- </p>
468
- </div>
469
- <div class="sourcecode">
470
- <p class="source-link">[ <a href="javascript:toggleSource('M000136_source')" id="l_M000136_source">show source</a> ]</p>
471
- <div id="M000136_source" class="dyn-source">
472
- <pre>
473
- <span class="ruby-comment cmt"># File lib/phusion_passenger/abstract_request_handler.rb, line 175</span>
474
- 175: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">main_loop_running?</span>
475
- 176: <span class="ruby-keyword kw">return</span> <span class="ruby-ivar">@main_loop_running</span>
476
- 177: <span class="ruby-keyword kw">end</span>
477
- </pre>
478
- </div>
479
- </div>
480
- </div>
481
- <div class="method">
482
- <div class="title">
483
- <a name="M000138"></a><b>start_main_loop_thread</b>()
484
- </div>
485
- <div class="description">
486
- <p>
487
- Start the main loop in a <a
488
- href="AbstractRequestHandler.html#M000134">new</a> thread. This thread will
489
- be stopped by <a href="AbstractRequestHandler.html#M000135">#cleanup</a>.
490
- </p>
491
- </div>
492
- <div class="sourcecode">
493
- <p class="source-link">[ <a href="javascript:toggleSource('M000138_source')" id="l_M000138_source">show source</a> ]</p>
494
- <div id="M000138_source" class="dyn-source">
495
- <pre>
496
- <span class="ruby-comment cmt"># File lib/phusion_passenger/abstract_request_handler.rb, line 245</span>
497
- 245: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">start_main_loop_thread</span>
498
- 246: <span class="ruby-identifier">current_generation</span> = <span class="ruby-ivar">@main_loop_generation</span>
499
- 247: <span class="ruby-ivar">@main_loop_thread</span> = <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
500
- 248: <span class="ruby-identifier">main_loop</span>
501
- 249: <span class="ruby-keyword kw">end</span>
502
- 250: <span class="ruby-ivar">@main_loop_thread_lock</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
503
- 251: <span class="ruby-keyword kw">while</span> <span class="ruby-ivar">@main_loop_generation</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">current_generation</span>
504
- 252: <span class="ruby-ivar">@main_loop_thread_cond</span>.<span class="ruby-identifier">wait</span>(<span class="ruby-ivar">@main_loop_thread_lock</span>)
505
- 253: <span class="ruby-keyword kw">end</span>
506
- 254: <span class="ruby-keyword kw">end</span>
507
- 255: <span class="ruby-keyword kw">end</span>
508
- </pre>
509
- </div>
510
- </div>
511
- </div>
512
- </div>
513
-
514
- </div>
515
-
516
- </body>
517
- </html>