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,141 +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::InitializationError</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::InitializationError</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/exceptions_rb.html">lib/phusion_passenger/exceptions.rb</a>
61
- </td>
62
- </tr>
63
- <tr>
64
- <td>Parent:</td>
65
- <td>
66
- StandardError
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
- An abstract base class for <a href="AppInitError.html">AppInitError</a> and
80
- <a href="FrameworkInitError.html">FrameworkInitError</a>. This represents
81
- the failure when initializing something.
82
- </p>
83
- </div>
84
-
85
-
86
-
87
- <div class="sectiontitle">Methods</div>
88
- <ul>
89
- <li><a href="#M000156">new</a></li>
90
- </ul>
91
-
92
-
93
-
94
-
95
-
96
- <div class="sectiontitle">Attributes</div>
97
- <table border='0' cellpadding='5'>
98
- <tr valign='top'>
99
- <td class='attr-rw'>
100
- [RW]
101
- </td>
102
- <td class='attr-name'>child_exception</td>
103
- <td class='attr-desc'>
104
- The exception that caused initialization to fail. This may be nil.
105
-
106
- </td>
107
- </tr>
108
- </table>
109
-
110
- <div class="sectiontitle">Public Class methods</div>
111
- <div class="method">
112
- <div class="title">
113
- <a name="M000156"></a><b>new</b>(message, child_exception = nil)
114
- </div>
115
- <div class="description">
116
- <p>
117
- Create a <a href="InitializationError.html#M000156">new</a> <a
118
- href="InitializationError.html">InitializationError</a>. <tt>message</tt>
119
- is the error message, and <tt>child_exception</tt> is the exception that
120
- caused initialization to fail.
121
- </p>
122
- </div>
123
- <div class="sourcecode">
124
- <p class="source-link">[ <a href="javascript:toggleSource('M000156_source')" id="l_M000156_source">show source</a> ]</p>
125
- <div id="M000156_source" class="dyn-source">
126
- <pre>
127
- <span class="ruby-comment cmt"># File lib/phusion_passenger/exceptions.rb, line 48</span>
128
- 48: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">message</span>, <span class="ruby-identifier">child_exception</span> = <span class="ruby-keyword kw">nil</span>)
129
- 49: <span class="ruby-keyword kw">super</span>(<span class="ruby-identifier">message</span>)
130
- 50: <span class="ruby-ivar">@child_exception</span> = <span class="ruby-identifier">child_exception</span>
131
- 51: <span class="ruby-keyword kw">end</span>
132
- </pre>
133
- </div>
134
- </div>
135
- </div>
136
- </div>
137
-
138
- </div>
139
-
140
- </body>
141
- </html>
@@ -1,92 +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::InvalidPath</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::InvalidPath</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/exceptions_rb.html">lib/phusion_passenger/exceptions.rb</a>
61
- </td>
62
- </tr>
63
- <tr>
64
- <td>Parent:</td>
65
- <td>
66
- StandardError
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
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
- </div>
88
-
89
- </div>
90
-
91
- </body>
92
- </html>
@@ -1,489 +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::MessageChannel</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::MessageChannel</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/message_channel_rb.html">lib/phusion_passenger/message_channel.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
- This class provides convenience methods for:
80
- </p>
81
- <ul>
82
- <li>sending and receiving raw data over an <a href="../IO.html">IO</a> channel.
83
-
84
- </li>
85
- <li>sending and receiving messages over an <a href="../IO.html">IO</a> channel.
86
-
87
- </li>
88
- <li>file descriptor (<a href="../IO.html">IO</a> object) passing over a Unix
89
- socket.
90
-
91
- </li>
92
- </ul>
93
- <p>
94
- All of these methods use exceptions for error reporting.
95
- </p>
96
- <p>
97
- There are two kinds of messages:
98
- </p>
99
- <dl>
100
- <dt> Array messages </dt><dd>These are just a list of strings, and the message itself has a specific
101
- length. The contained strings may not contain NUL characters
102
- (<tt>&#8217;\0&#8216;</tt>). Note that an array message must have at least
103
- one element.
104
-
105
- </dd>
106
- <dt> Scalar messages </dt><dd>These are byte strings which may contain arbitrary binary data. Scalar
107
- messages also have a specific length.
108
-
109
- </dd>
110
- </dl>
111
- <p>
112
- The protocol is designed to be low overhead, easy to implement and easy to
113
- parse.
114
- </p>
115
- <p>
116
- <a href="MessageChannel.html">MessageChannel</a> is to be wrapped around an
117
- <a href="../IO.html">IO</a> object. For example:
118
- </p>
119
- <pre>
120
- a, b = IO.pipe
121
- channel1 = MessageChannel.new(a)
122
- channel2 = MessageChannel.new(b)
123
-
124
- # Send an array message.
125
- channel2.write(&quot;hello&quot;, &quot;world !!&quot;)
126
- channel1.read # =&gt; [&quot;hello&quot;, &quot;world !!&quot;]
127
-
128
- # Send a scalar message.
129
- channel2.write_scalar(&quot;some long string which can contain arbitrary binary data&quot;)
130
- channel1.read_scalar
131
- </pre>
132
- <p>
133
- The life time of a <a href="MessageChannel.html">MessageChannel</a> is
134
- independent from that of the wrapped <a href="../IO.html">IO</a> object. If
135
- a <a href="MessageChannel.html">MessageChannel</a> object is destroyed, the
136
- underlying <a href="../IO.html">IO</a> object is not automatically closed.
137
- Call <a href="MessageChannel.html#M000147">close</a>() if you want to <a
138
- href="MessageChannel.html#M000147">close</a> the underlying <a
139
- href="../IO.html">IO</a> object.
140
- </p>
141
- <p>
142
- Note: Be careful with mixing the sending/receiving of array messages,
143
- scalar messages and <a href="../IO.html">IO</a> objects. If you send a
144
- collection of any of these in a specific order, then the receiving side
145
- must receive them in the exact some order. So suppose you first send a
146
- message, then an <a href="../IO.html">IO</a> object, then a scalar, then
147
- the receiving side must first receive a message, then an <a
148
- href="../IO.html">IO</a> object, then a scalar. If the receiving side does
149
- things in the wrong order then bad things will happen.
150
- </p>
151
- </div>
152
-
153
-
154
-
155
- <div class="sectiontitle">Methods</div>
156
- <ul>
157
- <li><a href="#M000147">close</a></li>
158
- <li><a href="#M000146">fileno</a></li>
159
- <li><a href="#M000139">new</a></li>
160
- <li><a href="#M000140">read</a></li>
161
- <li><a href="#M000141">read_scalar</a></li>
162
- <li><a href="#M000144">recv_io</a></li>
163
- <li><a href="#M000145">send_io</a></li>
164
- <li><a href="#M000142">write</a></li>
165
- <li><a href="#M000143">write_scalar</a></li>
166
- </ul>
167
-
168
-
169
-
170
-
171
-
172
- <div class="sectiontitle">Attributes</div>
173
- <table border='0' cellpadding='5'>
174
- <tr valign='top'>
175
- <td class='attr-rw'>
176
- [R]
177
- </td>
178
- <td class='attr-name'>io</td>
179
- <td class='attr-desc'>
180
- The wrapped <a href="../IO.html">IO</a> object.
181
-
182
- </td>
183
- </tr>
184
- </table>
185
-
186
- <div class="sectiontitle">Public Class methods</div>
187
- <div class="method">
188
- <div class="title">
189
- <a name="M000139"></a><b>new</b>(io)
190
- </div>
191
- <div class="description">
192
- <p>
193
- Create a <a href="MessageChannel.html#M000139">new</a> <a
194
- href="MessageChannel.html">MessageChannel</a> by wrapping the given <a
195
- href="../IO.html">IO</a> object.
196
- </p>
197
- </div>
198
- <div class="sourcecode">
199
- <p class="source-link">[ <a href="javascript:toggleSource('M000139_source')" id="l_M000139_source">show source</a> ]</p>
200
- <div id="M000139_source" class="dyn-source">
201
- <pre>
202
- <span class="ruby-comment cmt"># File lib/phusion_passenger/message_channel.rb, line 83</span>
203
- 83: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">io</span>)
204
- 84: <span class="ruby-ivar">@io</span> = <span class="ruby-identifier">io</span>
205
- 85: <span class="ruby-keyword kw">end</span>
206
- </pre>
207
- </div>
208
- </div>
209
- </div>
210
- <div class="sectiontitle">Public Instance methods</div>
211
- <div class="method">
212
- <div class="title">
213
- <a name="M000147"></a><b>close</b>()
214
- </div>
215
- <div class="description">
216
- <p>
217
- Close the underlying <a href="../IO.html">IO</a> stream. Might raise
218
- SystemCallError or IOError when something goes wrong.
219
- </p>
220
- </div>
221
- <div class="sourcecode">
222
- <p class="source-link">[ <a href="javascript:toggleSource('M000147_source')" id="l_M000147_source">show source</a> ]</p>
223
- <div id="M000147_source" class="dyn-source">
224
- <pre>
225
- <span class="ruby-comment cmt"># File lib/phusion_passenger/message_channel.rb, line 217</span>
226
- 217: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">close</span>
227
- 218: <span class="ruby-ivar">@io</span>.<span class="ruby-identifier">close</span>
228
- 219: <span class="ruby-keyword kw">end</span>
229
- </pre>
230
- </div>
231
- </div>
232
- </div>
233
- <div class="method">
234
- <div class="title">
235
- <a name="M000146"></a><b>fileno</b>()
236
- </div>
237
- <div class="description">
238
- <p>
239
- Return the file descriptor of the underlying <a href="../IO.html">IO</a>
240
- object.
241
- </p>
242
- </div>
243
- <div class="sourcecode">
244
- <p class="source-link">[ <a href="javascript:toggleSource('M000146_source')" id="l_M000146_source">show source</a> ]</p>
245
- <div id="M000146_source" class="dyn-source">
246
- <pre>
247
- <span class="ruby-comment cmt"># File lib/phusion_passenger/message_channel.rb, line 211</span>
248
- 211: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">fileno</span>
249
- 212: <span class="ruby-keyword kw">return</span> <span class="ruby-ivar">@io</span>.<span class="ruby-identifier">fileno</span>
250
- 213: <span class="ruby-keyword kw">end</span>
251
- </pre>
252
- </div>
253
- </div>
254
- </div>
255
- <div class="method">
256
- <div class="title">
257
- <a name="M000140"></a><b>read</b>()
258
- </div>
259
- <div class="description">
260
- <p>
261
- Read an array message from the underlying file descriptor. Returns the
262
- array message as an array, or nil when end-of-stream has been reached.
263
- </p>
264
- <p>
265
- Might raise SystemCallError, IOError or SocketError when something goes
266
- wrong.
267
- </p>
268
- </div>
269
- <div class="sourcecode">
270
- <p class="source-link">[ <a href="javascript:toggleSource('M000140_source')" id="l_M000140_source">show source</a> ]</p>
271
- <div id="M000140_source" class="dyn-source">
272
- <pre>
273
- <span class="ruby-comment cmt"># File lib/phusion_passenger/message_channel.rb, line 93</span>
274
- 93: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">read</span>
275
- 94: <span class="ruby-identifier">buffer</span> = <span class="ruby-value str">''</span>
276
- 95: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&lt;</span> <span class="ruby-constant">HEADER_SIZE</span>
277
- 96: <span class="ruby-identifier">buffer</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-ivar">@io</span>.<span class="ruby-identifier">readpartial</span>(<span class="ruby-constant">HEADER_SIZE</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">size</span>)
278
- 97: <span class="ruby-keyword kw">end</span>
279
- 98:
280
- 99: <span class="ruby-identifier">chunk_size</span> = <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">unpack</span>(<span class="ruby-value str">'n'</span>)[<span class="ruby-value">0</span>]
281
- 100: <span class="ruby-identifier">buffer</span> = <span class="ruby-value str">''</span>
282
- 101: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">chunk_size</span>
283
- 102: <span class="ruby-identifier">buffer</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-ivar">@io</span>.<span class="ruby-identifier">readpartial</span>(<span class="ruby-identifier">chunk_size</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">size</span>)
284
- 103: <span class="ruby-keyword kw">end</span>
285
- 104:
286
- 105: <span class="ruby-identifier">message</span> = []
287
- 106: <span class="ruby-identifier">offset</span> = <span class="ruby-value">0</span>
288
- 107: <span class="ruby-identifier">delimiter_pos</span> = <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">index</span>(<span class="ruby-constant">DELIMITER</span>, <span class="ruby-identifier">offset</span>)
289
- 108: <span class="ruby-keyword kw">while</span> <span class="ruby-operator">!</span><span class="ruby-identifier">delimiter_pos</span>.<span class="ruby-identifier">nil?</span>
290
- 109: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">delimiter_pos</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
291
- 110: <span class="ruby-identifier">message</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;&quot;</span>
292
- 111: <span class="ruby-keyword kw">else</span>
293
- 112: <span class="ruby-identifier">message</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">buffer</span>[<span class="ruby-identifier">offset</span> <span class="ruby-operator">..</span> <span class="ruby-identifier">delimiter_pos</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>]
294
- 113: <span class="ruby-keyword kw">end</span>
295
- 114: <span class="ruby-identifier">offset</span> = <span class="ruby-identifier">delimiter_pos</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>
296
- 115: <span class="ruby-identifier">delimiter_pos</span> = <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">index</span>(<span class="ruby-constant">DELIMITER</span>, <span class="ruby-identifier">offset</span>)
297
- 116: <span class="ruby-keyword kw">end</span>
298
- 117: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">message</span>
299
- 118: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ECONNRESET</span>
300
- 119: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
301
- 120: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">EOFError</span>
302
- 121: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
303
- 122: <span class="ruby-keyword kw">end</span>
304
- </pre>
305
- </div>
306
- </div>
307
- </div>
308
- <div class="method">
309
- <div class="title">
310
- <a name="M000141"></a><b>read_scalar</b>(max_size = nil)
311
- </div>
312
- <div class="description">
313
- <p>
314
- Read a scalar message from the underlying <a href="../IO.html">IO</a>
315
- object. Returns the <a href="MessageChannel.html#M000140">read</a> message,
316
- or nil on end-of-stream.
317
- </p>
318
- <p>
319
- Might raise SystemCallError, IOError or SocketError when something goes
320
- wrong.
321
- </p>
322
- <p>
323
- The <tt>max_size</tt> argument allows one to specify the maximum allowed
324
- size for the scalar message. If the received scalar message&#8216;s size is
325
- larger than <tt>max_size</tt>, then a SecurityError will be raised.
326
- </p>
327
- </div>
328
- <div class="sourcecode">
329
- <p class="source-link">[ <a href="javascript:toggleSource('M000141_source')" id="l_M000141_source">show source</a> ]</p>
330
- <div id="M000141_source" class="dyn-source">
331
- <pre>
332
- <span class="ruby-comment cmt"># File lib/phusion_passenger/message_channel.rb, line 133</span>
333
- 133: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">read_scalar</span>(<span class="ruby-identifier">max_size</span> = <span class="ruby-keyword kw">nil</span>)
334
- 134: <span class="ruby-identifier">buffer</span> = <span class="ruby-value str">''</span>
335
- 135: <span class="ruby-identifier">temp</span> = <span class="ruby-value str">''</span>
336
- 136: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">4</span>
337
- 137: <span class="ruby-identifier">buffer</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-ivar">@io</span>.<span class="ruby-identifier">readpartial</span>(<span class="ruby-value">4</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">size</span>, <span class="ruby-identifier">temp</span>)
338
- 138: <span class="ruby-keyword kw">end</span>
339
- 139: <span class="ruby-identifier">size</span> = <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">unpack</span>(<span class="ruby-value str">'N'</span>)[<span class="ruby-value">0</span>]
340
- 140: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
341
- 141: <span class="ruby-keyword kw">return</span> <span class="ruby-value str">''</span>
342
- 142: <span class="ruby-keyword kw">else</span>
343
- 143: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">max_size</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">max_size</span>
344
- 144: <span class="ruby-identifier">raise</span> <span class="ruby-constant">SecurityError</span>, <span class="ruby-node">&quot;Scalar message size (#{size}) &quot;</span> <span class="ruby-operator">&lt;&lt;</span>
345
- 145: <span class="ruby-node">&quot;exceeds maximum allowed size (#{max_size}).&quot;</span>
346
- 146: <span class="ruby-keyword kw">end</span>
347
- 147: <span class="ruby-identifier">buffer</span> = <span class="ruby-value str">''</span>
348
- 148: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">size</span>
349
- 149: <span class="ruby-identifier">temp</span> = <span class="ruby-value str">''</span> <span class="ruby-comment cmt"># JRuby doesn't clear the buffer. TODO: remove this when JRuby has been fixed.</span>
350
- 150: <span class="ruby-identifier">buffer</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-ivar">@io</span>.<span class="ruby-identifier">readpartial</span>(<span class="ruby-identifier">size</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">size</span>, <span class="ruby-identifier">temp</span>)
351
- 151: <span class="ruby-keyword kw">end</span>
352
- 152: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">buffer</span>
353
- 153: <span class="ruby-keyword kw">end</span>
354
- 154: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ECONNRESET</span>
355
- 155: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
356
- 156: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">EOFError</span>
357
- 157: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
358
- 158: <span class="ruby-keyword kw">end</span>
359
- </pre>
360
- </div>
361
- </div>
362
- </div>
363
- <div class="method">
364
- <div class="title">
365
- <a name="M000144"></a><b>recv_io</b>()
366
- </div>
367
- <div class="description">
368
- <p>
369
- Receive an <a href="../IO.html">IO</a> object (a file descriptor) from the
370
- channel. The other side must have sent an <a href="../IO.html">IO</a>
371
- object by calling <a href="MessageChannel.html#M000145">send_io</a>(). Note
372
- that this only works on Unix sockets.
373
- </p>
374
- <p>
375
- Might raise SystemCallError, IOError or SocketError when something goes
376
- wrong.
377
- </p>
378
- </div>
379
- <div class="sourcecode">
380
- <p class="source-link">[ <a href="javascript:toggleSource('M000144_source')" id="l_M000144_source">show source</a> ]</p>
381
- <div id="M000144_source" class="dyn-source">
382
- <pre>
383
- <span class="ruby-comment cmt"># File lib/phusion_passenger/message_channel.rb, line 196</span>
384
- 196: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">recv_io</span>
385
- 197: <span class="ruby-keyword kw">return</span> <span class="ruby-ivar">@io</span>.<span class="ruby-identifier">recv_io</span>
386
- 198: <span class="ruby-keyword kw">end</span>
387
- </pre>
388
- </div>
389
- </div>
390
- </div>
391
- <div class="method">
392
- <div class="title">
393
- <a name="M000145"></a><b>send_io</b>(io)
394
- </div>
395
- <div class="description">
396
- <p>
397
- Send an <a href="../IO.html">IO</a> object (a file descriptor) over the
398
- channel. The other side must receive the <a href="../IO.html">IO</a> object
399
- by calling <a href="MessageChannel.html#M000144">recv_io</a>(). Note that
400
- this only works on Unix sockets.
401
- </p>
402
- <p>
403
- Might raise SystemCallError, IOError or SocketError when something goes
404
- wrong.
405
- </p>
406
- </div>
407
- <div class="sourcecode">
408
- <p class="source-link">[ <a href="javascript:toggleSource('M000145_source')" id="l_M000145_source">show source</a> ]</p>
409
- <div id="M000145_source" class="dyn-source">
410
- <pre>
411
- <span class="ruby-comment cmt"># File lib/phusion_passenger/message_channel.rb, line 206</span>
412
- 206: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">send_io</span>(<span class="ruby-identifier">io</span>)
413
- 207: <span class="ruby-ivar">@io</span>.<span class="ruby-identifier">send_io</span>(<span class="ruby-identifier">io</span>)
414
- 208: <span class="ruby-keyword kw">end</span>
415
- </pre>
416
- </div>
417
- </div>
418
- </div>
419
- <div class="method">
420
- <div class="title">
421
- <a name="M000142"></a><b>write</b>(name, *args)
422
- </div>
423
- <div class="description">
424
- <p>
425
- Send an array message, which consists of the given elements, over the
426
- underlying file descriptor. <em>name</em> is the first element in the
427
- message, and <em>args</em> are the other elements. These arguments will
428
- internally be converted to strings by calling to_s().
429
- </p>
430
- <p>
431
- Might raise SystemCallError, IOError or SocketError when something goes
432
- wrong.
433
- </p>
434
- </div>
435
- <div class="sourcecode">
436
- <p class="source-link">[ <a href="javascript:toggleSource('M000142_source')" id="l_M000142_source">show source</a> ]</p>
437
- <div id="M000142_source" class="dyn-source">
438
- <pre>
439
- <span class="ruby-comment cmt"># File lib/phusion_passenger/message_channel.rb, line 167</span>
440
- 167: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">write</span>(<span class="ruby-identifier">name</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>)
441
- 168: <span class="ruby-identifier">check_argument</span>(<span class="ruby-identifier">name</span>)
442
- 169: <span class="ruby-identifier">args</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">arg</span><span class="ruby-operator">|</span>
443
- 170: <span class="ruby-identifier">check_argument</span>(<span class="ruby-identifier">arg</span>)
444
- 171: <span class="ruby-keyword kw">end</span>
445
- 172:
446
- 173: <span class="ruby-identifier">message</span> = <span class="ruby-node">&quot;#{name}#{DELIMITER}&quot;</span>
447
- 174: <span class="ruby-identifier">args</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">arg</span><span class="ruby-operator">|</span>
448
- 175: <span class="ruby-identifier">message</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">arg</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">DELIMITER</span>
449
- 176: <span class="ruby-keyword kw">end</span>
450
- 177: <span class="ruby-ivar">@io</span>.<span class="ruby-identifier">write</span>([<span class="ruby-identifier">message</span>.<span class="ruby-identifier">size</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-value str">'n'</span>) <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">message</span>)
451
- 178: <span class="ruby-ivar">@io</span>.<span class="ruby-identifier">flush</span>
452
- 179: <span class="ruby-keyword kw">end</span>
453
- </pre>
454
- </div>
455
- </div>
456
- </div>
457
- <div class="method">
458
- <div class="title">
459
- <a name="M000143"></a><b>write_scalar</b>(data)
460
- </div>
461
- <div class="description">
462
- <p>
463
- Send a scalar message over the underlying <a href="../IO.html">IO</a>
464
- object.
465
- </p>
466
- <p>
467
- Might raise SystemCallError, IOError or SocketError when something goes
468
- wrong.
469
- </p>
470
- </div>
471
- <div class="sourcecode">
472
- <p class="source-link">[ <a href="javascript:toggleSource('M000143_source')" id="l_M000143_source">show source</a> ]</p>
473
- <div id="M000143_source" class="dyn-source">
474
- <pre>
475
- <span class="ruby-comment cmt"># File lib/phusion_passenger/message_channel.rb, line 185</span>
476
- 185: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">write_scalar</span>(<span class="ruby-identifier">data</span>)
477
- 186: <span class="ruby-ivar">@io</span>.<span class="ruby-identifier">write</span>([<span class="ruby-identifier">data</span>.<span class="ruby-identifier">size</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-value str">'N'</span>) <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">data</span>)
478
- 187: <span class="ruby-ivar">@io</span>.<span class="ruby-identifier">flush</span>
479
- 188: <span class="ruby-keyword kw">end</span>
480
- </pre>
481
- </div>
482
- </div>
483
- </div>
484
- </div>
485
-
486
- </div>
487
-
488
- </body>
489
- </html>