passenger 5.0.0.beta3 → 5.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.editorconfig +11 -5
- data/CHANGELOG +38 -0
- data/CONTRIBUTING.md +1 -4
- data/Gemfile +0 -1
- data/Gemfile.lock +0 -2
- data/Rakefile +33 -33
- data/bin/passenger +1 -1
- data/bin/passenger-config +1 -1
- data/bin/passenger-install-apache2-module +800 -800
- data/bin/passenger-install-nginx-module +592 -592
- data/bin/passenger-memory-stats +127 -127
- data/bin/passenger-status +216 -216
- data/build/agents.rb +127 -127
- data/build/apache2.rb +87 -87
- data/build/basics.rb +60 -60
- data/build/common_library.rb +165 -165
- data/build/cplusplus_support.rb +51 -51
- data/build/cxx_tests.rb +268 -268
- data/build/debian.rb +143 -143
- data/build/documentation.rb +58 -58
- data/build/integration_tests.rb +81 -81
- data/build/misc.rb +132 -132
- data/build/nginx.rb +20 -20
- data/build/node_tests.rb +7 -7
- data/build/oxt_tests.rb +14 -14
- data/build/packaging.rb +570 -570
- data/build/preprocessor.rb +260 -260
- data/build/rake_extensions.rb +71 -71
- data/build/ruby_extension.rb +29 -29
- data/build/ruby_tests.rb +6 -6
- data/build/test_basics.rb +37 -37
- data/debian.template/control.template +3 -5
- data/dev/copy_boost_headers +134 -134
- data/dev/install_scripts_bootstrap_code.rb +25 -25
- data/dev/list_tests +20 -20
- data/dev/ruby_server.rb +223 -223
- data/dev/runner +18 -18
- data/doc/ServerOptimizationGuide.txt.md +55 -2
- data/doc/Users guide Nginx.txt +0 -26
- data/doc/Users guide Standalone.txt +5 -1
- data/doc/users_guide_snippets/tips.txt +9 -0
- data/ext/common/ApplicationPool2/Group.h +23 -11
- data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
- data/ext/common/ApplicationPool2/Pool.h +22 -17
- data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
- data/ext/common/ApplicationPool2/Spawner.h +1 -1
- data/ext/common/Constants.h +1 -1
- data/ext/common/agents/Base.cpp +35 -20
- data/ext/common/agents/HelperAgent/Main.cpp +8 -1
- data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
- data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
- data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
- data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
- data/ext/common/agents/Main.cpp +1 -1
- data/ext/common/agents/Watchdog/Main.cpp +54 -19
- data/ext/nginx/Configuration.c +7 -0
- data/ext/nginx/ContentHandler.c +9 -1
- data/helper-scripts/backtrace-sanitizer.rb +106 -87
- data/helper-scripts/crash-watch.rb +32 -0
- data/helper-scripts/download_binaries/extconf.rb +38 -38
- data/helper-scripts/meteor-loader.rb +107 -107
- data/helper-scripts/prespawn +101 -101
- data/helper-scripts/rack-loader.rb +96 -96
- data/helper-scripts/rack-preloader.rb +137 -137
- data/lib/phusion_passenger.rb +292 -292
- data/lib/phusion_passenger/abstract_installer.rb +438 -438
- data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
- data/lib/phusion_passenger/admin_tools.rb +20 -20
- data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
- data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
- data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
- data/lib/phusion_passenger/apache2/config_options.rb +182 -182
- data/lib/phusion_passenger/common_library.rb +479 -485
- data/lib/phusion_passenger/config/about_command.rb +161 -161
- data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
- data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
- data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
- data/lib/phusion_passenger/config/command.rb +25 -25
- data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
- data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
- data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
- data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
- data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
- data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
- data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
- data/lib/phusion_passenger/config/installation_utils.rb +204 -204
- data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
- data/lib/phusion_passenger/config/main.rb +152 -152
- data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
- data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
- data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
- data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
- data/lib/phusion_passenger/config/utils.rb +95 -95
- data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
- data/lib/phusion_passenger/console_text_template.rb +25 -25
- data/lib/phusion_passenger/constants.rb +90 -90
- data/lib/phusion_passenger/debug_logging.rb +106 -106
- data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
- data/lib/phusion_passenger/message_channel.rb +312 -312
- data/lib/phusion_passenger/message_client.rb +176 -176
- data/lib/phusion_passenger/native_support.rb +369 -369
- data/lib/phusion_passenger/nginx/config_options.rb +297 -297
- data/lib/phusion_passenger/packaging.rb +131 -131
- data/lib/phusion_passenger/platform_info.rb +360 -360
- data/lib/phusion_passenger/platform_info/apache.rb +767 -767
- data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
- data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
- data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
- data/lib/phusion_passenger/platform_info/curl.rb +32 -32
- data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
- data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
- data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
- data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
- data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
- data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
- data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
- data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
- data/lib/phusion_passenger/platform_info/linux.rb +55 -55
- data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
- data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
- data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
- data/lib/phusion_passenger/plugin.rb +66 -66
- data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
- data/lib/phusion_passenger/public_api.rb +191 -191
- data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
- data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
- data/lib/phusion_passenger/request_handler.rb +567 -577
- data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
- data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
- data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
- data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
- data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
- data/lib/phusion_passenger/standalone/command.rb +44 -40
- data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
- data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
- data/lib/phusion_passenger/standalone/main.rb +73 -73
- data/lib/phusion_passenger/standalone/start_command.rb +697 -685
- data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
- data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
- data/lib/phusion_passenger/standalone/status_command.rb +64 -64
- data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
- data/lib/phusion_passenger/standalone/version_command.rb +9 -9
- data/lib/phusion_passenger/union_station/connection.rb +32 -32
- data/lib/phusion_passenger/union_station/core.rb +251 -251
- data/lib/phusion_passenger/union_station/transaction.rb +126 -126
- data/lib/phusion_passenger/utils.rb +199 -167
- data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
- data/lib/phusion_passenger/utils/download.rb +196 -196
- data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
- data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
- data/lib/phusion_passenger/utils/lock.rb +31 -31
- data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
- data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
- data/lib/phusion_passenger/utils/shellwords.rb +20 -20
- data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
- data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
- data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
- data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
- data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
- data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
- data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
- data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
- data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
- data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
- data/passenger.gemspec +0 -1
- data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
- data/resources/templates/standalone/config.erb +19 -15
- data/test/integration_tests/apache2_tests.rb +566 -566
- data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
- data/test/integration_tests/native_packaging_spec.rb +296 -296
- data/test/integration_tests/nginx_tests.rb +393 -393
- data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
- data/test/integration_tests/source_packaging_test.rb +138 -138
- data/test/integration_tests/spec_helper.rb +5 -5
- data/test/integration_tests/standalone_tests.rb +367 -367
- data/test/ruby/debug_logging_spec.rb +133 -133
- data/test/ruby/message_channel_spec.rb +186 -186
- data/test/ruby/rack/loader_spec.rb +28 -28
- data/test/ruby/rack/preloader_spec.rb +34 -34
- data/test/ruby/rails3.0/loader_spec.rb +12 -12
- data/test/ruby/rails3.0/preloader_spec.rb +18 -18
- data/test/ruby/rails3.1/loader_spec.rb +12 -12
- data/test/ruby/rails3.1/preloader_spec.rb +18 -18
- data/test/ruby/rails3.2/loader_spec.rb +12 -12
- data/test/ruby/rails3.2/preloader_spec.rb +18 -18
- data/test/ruby/rails4.0/loader_spec.rb +12 -12
- data/test/ruby/rails4.0/preloader_spec.rb +18 -18
- data/test/ruby/rails4.1/loader_spec.rb +12 -12
- data/test/ruby/rails4.1/preloader_spec.rb +18 -18
- data/test/ruby/request_handler_spec.rb +730 -730
- data/test/ruby/shared/loader_sharedspec.rb +224 -224
- data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
- data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
- data/test/ruby/spec_helper.rb +65 -65
- data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
- data/test/ruby/union_station_spec.rb +276 -276
- data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
- data/test/ruby/utils/hosts_file_parser.rb +248 -248
- data/test/ruby/utils/tee_input_spec.rb +215 -215
- data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
- data/test/ruby/utils_spec.rb +21 -21
- data/test/stub/rack/config.ru +87 -87
- data/test/stub/rack/library.rb +8 -8
- data/test/stub/rack/start.rb +30 -30
- data/test/support/apache2_controller.rb +191 -191
- data/test/support/nginx_controller.rb +90 -99
- data/test/support/placebo-preloader.rb +57 -57
- data/test/support/test_helper.rb +435 -435
- metadata +11 -21
- metadata.gz.asc +7 -7
- data/lib/phusion_passenger/standalone/command2.rb +0 -292
- data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
- data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
- data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
- data/resources/templates/standalone/run_installer_as_root.txt.erb +0 -8
@@ -24,276 +24,276 @@
|
|
24
24
|
PhusionPassenger.require_passenger_lib 'utils' # So that we can know whether #writev is supported.
|
25
25
|
|
26
26
|
module PhusionPassenger
|
27
|
-
module Utils
|
28
|
-
|
29
|
-
# Some frameworks (e.g. Merb) call `seek` and `rewind` on the input stream
|
30
|
-
# if it responds to these methods. In case of Phusion Passenger, the input
|
31
|
-
# stream is a socket, and altough socket objects respond to `seek` and
|
32
|
-
# `rewind`, calling these methods will raise an exception. We don't want
|
33
|
-
# this to happen so in AbstractRequestHandler we wrap the client socket
|
34
|
-
# into an UnseekableSocket wrapper, which doesn't respond to these methods.
|
35
|
-
#
|
36
|
-
# We used to dynamically undef `seek` and `rewind` on sockets, but this
|
37
|
-
# blows the Ruby interpreter's method cache and made things slower.
|
38
|
-
# Wrapping a socket is faster despite extra method calls.
|
39
|
-
#
|
40
|
-
# Furthermore, all exceptions originating from the wrapped socket will
|
41
|
-
# be annotated. One can check whether a certain exception originates
|
42
|
-
# from the wrapped socket by calling #source_of_exception?
|
43
|
-
class UnseekableSocket
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
private
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
end
|
297
|
-
|
298
|
-
end # module Utils
|
27
|
+
module Utils
|
28
|
+
|
29
|
+
# Some frameworks (e.g. Merb) call `seek` and `rewind` on the input stream
|
30
|
+
# if it responds to these methods. In case of Phusion Passenger, the input
|
31
|
+
# stream is a socket, and altough socket objects respond to `seek` and
|
32
|
+
# `rewind`, calling these methods will raise an exception. We don't want
|
33
|
+
# this to happen so in AbstractRequestHandler we wrap the client socket
|
34
|
+
# into an UnseekableSocket wrapper, which doesn't respond to these methods.
|
35
|
+
#
|
36
|
+
# We used to dynamically undef `seek` and `rewind` on sockets, but this
|
37
|
+
# blows the Ruby interpreter's method cache and made things slower.
|
38
|
+
# Wrapping a socket is faster despite extra method calls.
|
39
|
+
#
|
40
|
+
# Furthermore, all exceptions originating from the wrapped socket will
|
41
|
+
# be annotated. One can check whether a certain exception originates
|
42
|
+
# from the wrapped socket by calling #source_of_exception?
|
43
|
+
class UnseekableSocket
|
44
|
+
def self.wrap(socket)
|
45
|
+
return new.wrap(socket)
|
46
|
+
end
|
47
|
+
|
48
|
+
def wrap(socket)
|
49
|
+
# Some people report that sometimes their Ruby (MRI/REE)
|
50
|
+
# processes get stuck with 100% CPU usage. Upon further
|
51
|
+
# inspection with strace, it turns out that these Ruby
|
52
|
+
# processes are continuously calling lseek() on a socket,
|
53
|
+
# which of course returns ESPIPE as error. gdb reveals
|
54
|
+
# lseek() is called by fwrite(), which in turn is called
|
55
|
+
# by rb_fwrite(). The affected socket is the
|
56
|
+
# AbstractRequestHandler client socket.
|
57
|
+
#
|
58
|
+
# I inspected the MRI source code and didn't find
|
59
|
+
# anything that would explain this behavior. This makes
|
60
|
+
# me think that it's a glibc bug, but that's very
|
61
|
+
# unlikely.
|
62
|
+
#
|
63
|
+
# The rb_fwrite() implementation takes an entirely
|
64
|
+
# different code path if I set 'sync' to true: it will
|
65
|
+
# skip fwrite() and use write() instead. So here we set
|
66
|
+
# 'sync' to true in the hope that this will work around
|
67
|
+
# the problem.
|
68
|
+
socket.sync = true
|
69
|
+
|
70
|
+
# There's no need to set the encoding for Ruby 1.9 because
|
71
|
+
# abstract_request_handler.rb is tagged with 'encoding: binary'.
|
72
|
+
|
73
|
+
@socket = socket
|
74
|
+
|
75
|
+
return self
|
76
|
+
end
|
77
|
+
|
78
|
+
# Don't allow disabling of sync.
|
79
|
+
def sync=(value)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Socket is sync'ed so flushing shouldn't do anything.
|
83
|
+
def flush
|
84
|
+
end
|
85
|
+
|
86
|
+
# Already set to binary mode.
|
87
|
+
def binmode
|
88
|
+
end
|
89
|
+
|
90
|
+
# This makes select() work.
|
91
|
+
def to_io
|
92
|
+
@socket
|
93
|
+
end
|
94
|
+
|
95
|
+
def simulate_eof!
|
96
|
+
@simulate_eof = true
|
97
|
+
end
|
98
|
+
|
99
|
+
def stop_simulating_eof!
|
100
|
+
@simulate_eof = false
|
101
|
+
end
|
102
|
+
|
103
|
+
def fileno
|
104
|
+
@socket.fileno
|
105
|
+
end
|
106
|
+
|
107
|
+
def addr
|
108
|
+
@socket.addr
|
109
|
+
rescue => e
|
110
|
+
raise annotate(e)
|
111
|
+
end
|
112
|
+
|
113
|
+
def write(string)
|
114
|
+
@socket.write(string)
|
115
|
+
rescue => e
|
116
|
+
raise annotate(e)
|
117
|
+
end
|
118
|
+
|
119
|
+
def write_nonblock(string)
|
120
|
+
@socket.write_nonblock(string)
|
121
|
+
rescue => e
|
122
|
+
raise annotate(e)
|
123
|
+
end
|
124
|
+
|
125
|
+
def writev(components)
|
126
|
+
@socket.writev(components)
|
127
|
+
rescue => e
|
128
|
+
raise annotate(e)
|
129
|
+
end if IO.method_defined?(:writev)
|
130
|
+
|
131
|
+
def writev2(components, components2)
|
132
|
+
@socket.writev2(components, components2)
|
133
|
+
rescue => e
|
134
|
+
raise annotate(e)
|
135
|
+
end if IO.method_defined?(:writev2)
|
136
|
+
|
137
|
+
def writev3(components, components2, components3)
|
138
|
+
@socket.writev3(components, components2, components3)
|
139
|
+
rescue => e
|
140
|
+
raise annotate(e)
|
141
|
+
end if IO.method_defined?(:writev3)
|
142
|
+
|
143
|
+
def send(*args)
|
144
|
+
@socket.send(*args)
|
145
|
+
rescue => e
|
146
|
+
raise annotate(e)
|
147
|
+
end
|
148
|
+
|
149
|
+
def sendmsg(*args)
|
150
|
+
@socket.sendmsg(*args)
|
151
|
+
rescue => e
|
152
|
+
raise annotate(e)
|
153
|
+
end
|
154
|
+
|
155
|
+
def sendmsg_nonblock(*args)
|
156
|
+
@socket.sendmsg_nonblock(*args)
|
157
|
+
rescue => e
|
158
|
+
raise annotate(e)
|
159
|
+
end
|
160
|
+
|
161
|
+
def puts(*args)
|
162
|
+
@socket.puts(*args)
|
163
|
+
rescue => e
|
164
|
+
raise annotate(e)
|
165
|
+
end
|
166
|
+
|
167
|
+
def gets
|
168
|
+
return nil if @simulate_eof
|
169
|
+
@socket.gets
|
170
|
+
rescue => e
|
171
|
+
raise annotate(e)
|
172
|
+
end
|
173
|
+
|
174
|
+
def read(*args)
|
175
|
+
if @simulate_eof
|
176
|
+
length, buffer = args
|
177
|
+
if buffer
|
178
|
+
buffer.replace(binary_string(""))
|
179
|
+
else
|
180
|
+
buffer = binary_string("")
|
181
|
+
end
|
182
|
+
if length
|
183
|
+
return nil
|
184
|
+
else
|
185
|
+
return buffer
|
186
|
+
end
|
187
|
+
end
|
188
|
+
@socket.read(*args)
|
189
|
+
rescue => e
|
190
|
+
raise annotate(e)
|
191
|
+
end
|
192
|
+
|
193
|
+
def read_nonblock(*args)
|
194
|
+
raise EOFError, "end of file reached" if @simulate_eof
|
195
|
+
@socket.read_nonblock(*args)
|
196
|
+
rescue => e
|
197
|
+
raise annotate(e)
|
198
|
+
end
|
199
|
+
|
200
|
+
def readpartial(*args)
|
201
|
+
raise EOFError, "end of file reached" if @simulate_eof
|
202
|
+
@socket.readpartial(*args)
|
203
|
+
rescue => e
|
204
|
+
raise annotate(e)
|
205
|
+
end
|
206
|
+
|
207
|
+
def readline
|
208
|
+
raise EOFError, "end of file reached" if @simulate_eof
|
209
|
+
@socket.readline
|
210
|
+
rescue => e
|
211
|
+
raise annotate(e)
|
212
|
+
end
|
213
|
+
|
214
|
+
def recv(*args)
|
215
|
+
raise EOFError, "end of file reached" if @simulate_eof
|
216
|
+
@socket.recv(*args)
|
217
|
+
rescue => e
|
218
|
+
raise annotate(e)
|
219
|
+
end
|
220
|
+
|
221
|
+
def recvfrom(*args)
|
222
|
+
raise EOFError, "end of file reached" if @simulate_eof
|
223
|
+
@socket.recvfrom(*args)
|
224
|
+
rescue => e
|
225
|
+
raise annotate(e)
|
226
|
+
end
|
227
|
+
|
228
|
+
def recvfrom_nonblock(*args)
|
229
|
+
raise EOFError, "end of file reached" if @simulate_eof
|
230
|
+
@socket.recvfrom_nonblock(*args)
|
231
|
+
rescue => e
|
232
|
+
raise annotate(e)
|
233
|
+
end
|
234
|
+
|
235
|
+
def each(&block)
|
236
|
+
return if @simulate_eof
|
237
|
+
@socket.each(&block)
|
238
|
+
rescue => e
|
239
|
+
raise annotate(e)
|
240
|
+
end
|
241
|
+
|
242
|
+
def eof?
|
243
|
+
return true if @simulate_eof
|
244
|
+
@socket.eof?
|
245
|
+
rescue => e
|
246
|
+
raise annotate(e)
|
247
|
+
end
|
248
|
+
|
249
|
+
def closed?
|
250
|
+
@socket.closed?
|
251
|
+
rescue => e
|
252
|
+
raise annotate(e)
|
253
|
+
end
|
254
|
+
|
255
|
+
def close
|
256
|
+
@socket.close
|
257
|
+
rescue => e
|
258
|
+
raise annotate(e)
|
259
|
+
end
|
260
|
+
|
261
|
+
def close_read
|
262
|
+
@socket.close_read
|
263
|
+
rescue => e
|
264
|
+
raise annotate(e)
|
265
|
+
end
|
266
|
+
|
267
|
+
def close_write
|
268
|
+
@socket.close_write
|
269
|
+
rescue => e
|
270
|
+
raise annotate(e)
|
271
|
+
end
|
272
|
+
|
273
|
+
def source_of_exception?(exception)
|
274
|
+
return exception.instance_variable_get(:"@from_unseekable_socket") == @socket.object_id
|
275
|
+
end
|
276
|
+
|
277
|
+
private
|
278
|
+
def annotate(exception)
|
279
|
+
exception.instance_variable_set(:"@from_unseekable_socket", @socket.object_id)
|
280
|
+
return exception
|
281
|
+
end
|
282
|
+
|
283
|
+
def raise_error_because_activity_disallowed!
|
284
|
+
raise IOError, "It is not possible to read or write from the client socket because the current."
|
285
|
+
end
|
286
|
+
|
287
|
+
if ''.respond_to?(:force_encoding)
|
288
|
+
def binary_string(str)
|
289
|
+
return ''.force_encoding('binary')
|
290
|
+
end
|
291
|
+
else
|
292
|
+
def binary_string(str)
|
293
|
+
return ''
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
end # module Utils
|
299
299
|
end # module PhusionPassenger
|