passenger 2.0.6 → 2.1.2
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.
- data/DEVELOPERS.TXT +10 -4
- data/LICENSE +1 -1
- data/NEWS +0 -0
- data/Rakefile +183 -117
- data/benchmark/dispatcher.rb +5 -9
- data/bin/passenger-install-apache2-module +52 -18
- data/bin/passenger-memory-stats +67 -13
- data/bin/passenger-spawn-server +8 -4
- data/bin/passenger-status +21 -46
- data/bin/passenger-stress-test +5 -5
- data/debian/postinst +1 -1
- data/doc/ApplicationPool algorithm.txt +180 -128
- data/doc/Architectural overview.html +1 -778
- data/doc/Security of user switching support.html +1 -643
- data/doc/Users guide Apache.html +3127 -0
- data/doc/Users guide Nginx.html +1458 -0
- data/doc/Users guide.html +1404 -467
- data/doc/Users guide.txt +843 -105
- data/doc/cxxapi/ApplicationPoolServer_8h-source.html +751 -641
- data/doc/cxxapi/ApplicationPool_8h-source.html +168 -171
- data/doc/cxxapi/Application_8h-source.html +494 -394
- data/doc/cxxapi/Bucket_8h-source.html +21 -15
- data/doc/cxxapi/CachedFileStat_8h-source.html +191 -0
- data/doc/cxxapi/Configuration_8h-source.html +311 -149
- data/doc/cxxapi/DirectoryMapper_8h-source.html +309 -0
- data/doc/cxxapi/DummySpawnManager_8h-source.html +3 -4
- data/doc/cxxapi/Exceptions_8h-source.html +182 -165
- data/doc/cxxapi/FileChecker_8h-source.html +130 -0
- data/doc/cxxapi/Hooks_8h-source.html +2 -3
- data/doc/cxxapi/Logging_8h-source.html +92 -89
- data/doc/cxxapi/MessageChannel_8h-source.html +585 -477
- data/doc/cxxapi/PoolOptions_8h-source.html +305 -0
- data/doc/cxxapi/SpawnManager_8h-source.html +515 -540
- data/doc/cxxapi/StandardApplicationPool_8h-source.html +779 -679
- data/doc/cxxapi/SystemTime_8h-source.html +104 -0
- data/doc/cxxapi/Utils_8h-source.html +331 -227
- data/doc/cxxapi/annotated.html +6 -7
- data/doc/cxxapi/classClient-members.html +1 -2
- data/doc/cxxapi/classClient.html +1 -2
- data/doc/cxxapi/classHooks-members.html +5 -2
- data/doc/cxxapi/classHooks.html +112 -2
- data/doc/cxxapi/classPassenger_1_1Application-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1Application.html +8 -9
- data/doc/cxxapi/classPassenger_1_1ApplicationPool-members.html +4 -4
- data/doc/cxxapi/classPassenger_1_1ApplicationPool.html +42 -81
- data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer.html +3 -4
- data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1Application_1_1Session-members.html +3 -2
- data/doc/cxxapi/classPassenger_1_1Application_1_1Session.html +74 -3
- data/doc/cxxapi/classPassenger_1_1BusyException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1BusyException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +38 -0
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +256 -0
- data/doc/cxxapi/classPassenger_1_1DummySpawnManager-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1DummySpawnManager.html +2 -3
- data/doc/cxxapi/{classPassenger_1_1Thread-members.html → classPassenger_1_1FileChecker-members.html} +4 -5
- data/doc/cxxapi/classPassenger_1_1FileChecker.html +121 -0
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1FileSystemException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1IOException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1IOException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +5 -2
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +155 -5
- data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption-members.html → classPassenger_1_1RuntimeException-members.html} +2 -3
- data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption.html → classPassenger_1_1RuntimeException.html} +10 -8
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1SpawnManager.html +15 -56
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool-members.html +5 -4
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool.html +20 -81
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1SystemException-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1SystemException.html +9 -10
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/{classboost_1_1this__thread_1_1disable__syscall__interruption-members.html → classPassenger_1_1SystemTime-members.html} +5 -3
- data/doc/cxxapi/classPassenger_1_1SystemTime.html +86 -0
- data/doc/cxxapi/classPassenger_1_1TempFile-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1TempFile.html +17 -9
- data/doc/cxxapi/definitions_8h-source.html +1 -2
- data/doc/cxxapi/files.html +6 -3
- data/doc/cxxapi/functions.html +98 -35
- data/doc/cxxapi/functions_func.html +60 -32
- data/doc/cxxapi/functions_type.html +1 -2
- data/doc/cxxapi/functions_vars.html +27 -2
- data/doc/cxxapi/graph_legend.html +1 -2
- data/doc/cxxapi/graph_legend.png +0 -0
- data/doc/cxxapi/group__Configuration.html +3 -4
- data/doc/cxxapi/group__Configuration.png +0 -0
- data/doc/cxxapi/group__Core.html +3 -4
- data/doc/cxxapi/group__Core.png +0 -0
- data/doc/cxxapi/group__Exceptions.html +4 -2
- data/doc/cxxapi/group__Hooks.html +1 -6
- data/doc/cxxapi/group__Hooks.png +0 -0
- data/doc/cxxapi/group__Support.html +259 -36
- data/doc/cxxapi/hierarchy.html +6 -7
- data/doc/cxxapi/inherit__graph__0.map +1 -1
- data/doc/cxxapi/inherit__graph__0.md5 +1 -1
- data/doc/cxxapi/inherit__graph__0.png +0 -0
- data/doc/cxxapi/inherit__graph__1.map +1 -1
- data/doc/cxxapi/inherit__graph__1.md5 +1 -1
- data/doc/cxxapi/inherit__graph__1.png +0 -0
- data/doc/cxxapi/inherit__graph__10.map +1 -1
- data/doc/cxxapi/inherit__graph__10.md5 +1 -1
- data/doc/cxxapi/inherit__graph__10.png +0 -0
- data/doc/cxxapi/inherit__graph__11.map +1 -1
- data/doc/cxxapi/inherit__graph__11.md5 +1 -1
- data/doc/cxxapi/inherit__graph__11.png +0 -0
- data/doc/cxxapi/inherit__graph__12.map +2 -1
- data/doc/cxxapi/inherit__graph__12.md5 +1 -1
- data/doc/cxxapi/inherit__graph__12.png +0 -0
- data/doc/cxxapi/inherit__graph__13.map +1 -1
- data/doc/cxxapi/inherit__graph__13.md5 +1 -1
- data/doc/cxxapi/inherit__graph__13.png +0 -0
- data/doc/cxxapi/inherit__graph__14.map +1 -2
- data/doc/cxxapi/inherit__graph__14.md5 +1 -1
- data/doc/cxxapi/inherit__graph__14.png +0 -0
- data/doc/cxxapi/inherit__graph__15.map +1 -1
- data/doc/cxxapi/inherit__graph__15.md5 +1 -1
- data/doc/cxxapi/inherit__graph__15.png +0 -0
- data/doc/cxxapi/inherit__graph__16.map +1 -1
- data/doc/cxxapi/inherit__graph__16.md5 +1 -1
- data/doc/cxxapi/inherit__graph__16.png +0 -0
- data/doc/cxxapi/inherit__graph__17.png +0 -0
- data/doc/cxxapi/inherit__graph__18.png +0 -0
- data/doc/cxxapi/inherit__graph__19.png +0 -0
- data/doc/cxxapi/inherit__graph__2.map +1 -1
- data/doc/cxxapi/inherit__graph__2.md5 +1 -1
- data/doc/cxxapi/inherit__graph__2.png +0 -0
- data/doc/cxxapi/inherit__graph__20.map +1 -1
- data/doc/cxxapi/inherit__graph__20.md5 +1 -1
- data/doc/cxxapi/inherit__graph__20.png +0 -0
- data/doc/cxxapi/inherit__graph__21.map +1 -1
- data/doc/cxxapi/inherit__graph__21.md5 +1 -1
- data/doc/cxxapi/inherit__graph__21.png +0 -0
- data/doc/cxxapi/inherit__graph__3.map +1 -1
- data/doc/cxxapi/inherit__graph__3.md5 +1 -1
- data/doc/cxxapi/inherit__graph__3.png +0 -0
- data/doc/cxxapi/inherit__graph__4.map +1 -1
- data/doc/cxxapi/inherit__graph__4.md5 +1 -1
- data/doc/cxxapi/inherit__graph__4.png +0 -0
- data/doc/cxxapi/inherit__graph__5.map +2 -1
- data/doc/cxxapi/inherit__graph__5.md5 +1 -1
- data/doc/cxxapi/inherit__graph__5.png +0 -0
- data/doc/cxxapi/inherit__graph__6.map +1 -1
- data/doc/cxxapi/inherit__graph__6.md5 +1 -1
- data/doc/cxxapi/inherit__graph__6.png +0 -0
- data/doc/cxxapi/inherit__graph__7.map +1 -1
- data/doc/cxxapi/inherit__graph__7.md5 +1 -1
- data/doc/cxxapi/inherit__graph__7.png +0 -0
- data/doc/cxxapi/inherit__graph__8.map +1 -1
- data/doc/cxxapi/inherit__graph__8.md5 +1 -1
- data/doc/cxxapi/inherit__graph__8.png +0 -0
- data/doc/cxxapi/inherit__graph__9.map +1 -2
- data/doc/cxxapi/inherit__graph__9.md5 +1 -1
- data/doc/cxxapi/inherit__graph__9.png +0 -0
- data/doc/cxxapi/inherits.html +30 -31
- data/doc/cxxapi/main.html +1 -2
- data/doc/cxxapi/modules.html +1 -2
- data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +1 -2
- data/doc/cxxapi/structPassenger_1_1AnythingToString.html +2 -3
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +1 -2
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +2 -3
- data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +49 -0
- data/doc/cxxapi/structPassenger_1_1PoolOptions.html +404 -0
- data/doc/cxxapi/tree.html +18 -20
- data/doc/images/conservative_spawning.png +0 -0
- data/doc/images/conservative_spawning.svg +248 -0
- data/doc/images/smart-lv2.png +0 -0
- data/doc/images/smart-lv2.svg +320 -0
- data/doc/rdoc/classes/ConditionVariable.html +68 -34
- data/doc/rdoc/classes/Exception.html +16 -16
- data/doc/rdoc/classes/GC.html +9 -9
- data/doc/rdoc/classes/IO.html +36 -17
- data/doc/rdoc/classes/PhusionPassenger.html +183 -0
- data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +511 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer.html +285 -242
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerAlreadyStarted.html +3 -3
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerError.html +3 -3
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerNotStarted.html +3 -3
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/UnknownMessage.html +3 -3
- data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +598 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +140 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +247 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess/Instance.html +138 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AppInitError.html +36 -19
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/Application.html +81 -96
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/ConsoleTextTemplate.html +18 -18
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/FrameworkInitError.html +20 -18
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/HTMLTemplate.html +18 -18
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/InitializationError.html +9 -9
- data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +92 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/MessageChannel.html +93 -92
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/NativeSupport.html +55 -25
- data/doc/rdoc/classes/PhusionPassenger/Rack.html +91 -0
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +185 -0
- data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +182 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz.html +95 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +424 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner/Error.html +98 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +200 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +444 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner/Error.html +98 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +154 -0
- data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +408 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/UnknownError.html +13 -13
- data/doc/rdoc/classes/PhusionPassenger/Utils.html +687 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/VersionNotFound.html +8 -8
- data/doc/rdoc/classes/PhusionPassenger/WSGI.html +89 -0
- data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +188 -0
- data/doc/rdoc/classes/PlatformInfo.html +663 -159
- data/doc/rdoc/classes/RakeExtensions.html +4 -4
- data/doc/rdoc/classes/Signal.html +134 -0
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/DEVELOPERS_TXT.html +15 -10
- data/doc/rdoc/files/README.html +5 -7
- data/doc/rdoc/files/ext/{passenger → phusion_passenger}/native_support_c.html +2 -2
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_request_handler_rb.html +7 -9
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +120 -0
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_server_rb.html +7 -10
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +99 -0
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +92 -0
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/application_rb.html +6 -8
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/console_text_template_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/constants_rb.html +4 -5
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/dependencies_rb.html +6 -8
- data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +116 -0
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/exceptions_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/html_template_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/message_channel_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/platform_info_rb.html +6 -7
- data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +123 -0
- data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +117 -0
- data/doc/rdoc/files/lib/{passenger/utils_rb.html → phusion_passenger/railz/application_spawner_rb.html} +24 -17
- data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +139 -0
- data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +118 -0
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/simple_benchmarking_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/spawn_manager_rb.html +40 -24
- data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +169 -0
- data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +120 -0
- data/doc/rdoc/files/lib/rake/extensions_rb.html +3 -4
- data/doc/rdoc/fr_class_index.html +37 -19
- data/doc/rdoc/fr_file_index.html +25 -14
- data/doc/rdoc/fr_method_index.html +145 -74
- data/ext/apache2/Application.h +145 -44
- data/ext/apache2/ApplicationPool.h +27 -29
- data/ext/apache2/ApplicationPoolServer.h +183 -72
- data/ext/apache2/ApplicationPoolServerExecutable.cpp +249 -42
- data/ext/apache2/Bucket.cpp +61 -9
- data/ext/apache2/Bucket.h +15 -8
- data/ext/apache2/CachedFileStat.cpp +114 -0
- data/ext/apache2/CachedFileStat.h +169 -0
- data/ext/apache2/Configuration.cpp +213 -22
- data/ext/apache2/Configuration.h +176 -13
- data/ext/apache2/DirectoryMapper.h +287 -0
- data/ext/apache2/Exceptions.h +30 -12
- data/ext/apache2/FileChecker.h +108 -0
- data/ext/apache2/Hooks.cpp +709 -493
- data/ext/apache2/LICENSE-CNRI.TXT +15 -0
- data/ext/apache2/Logging.h +26 -22
- data/ext/apache2/MessageChannel.h +124 -15
- data/ext/apache2/PoolOptions.h +283 -0
- data/ext/apache2/SpawnManager.h +75 -99
- data/ext/apache2/StandardApplicationPool.h +296 -195
- data/ext/apache2/SystemTime.cpp +28 -0
- data/ext/apache2/SystemTime.h +82 -0
- data/ext/apache2/Utils.cpp +172 -18
- data/ext/apache2/Utils.h +124 -19
- data/ext/boost/cstdint.hpp +4 -2
- data/ext/boost/current_function.hpp +67 -0
- data/ext/boost/detail/sp_counted_base.hpp +4 -4
- data/ext/boost/thread/exceptions.hpp +2 -1
- data/ext/boost/thread/pthread/thread.hpp +11 -3
- data/ext/boost/thread/pthread/thread_data.hpp +2 -1
- data/ext/oxt/backtrace.cpp +172 -0
- data/ext/oxt/backtrace.hpp +135 -0
- data/ext/oxt/detail/backtrace_disabled.hpp +39 -0
- data/ext/oxt/detail/backtrace_enabled.hpp +155 -0
- data/ext/oxt/detail/spin_lock_gcc_x86.hpp +82 -0
- data/ext/oxt/detail/spin_lock_portable.hpp +38 -0
- data/ext/oxt/detail/spin_lock_pthreads.hpp +97 -0
- data/ext/oxt/detail/tracable_exception_disabled.hpp +46 -0
- data/ext/oxt/detail/tracable_exception_enabled.hpp +48 -0
- data/ext/oxt/macros.hpp +58 -0
- data/ext/oxt/spin_lock.hpp +55 -0
- data/ext/{apache2/System.cpp → oxt/system_calls.cpp} +87 -52
- data/ext/oxt/system_calls.hpp +234 -0
- data/ext/oxt/thread.cpp +32 -0
- data/ext/oxt/thread.hpp +223 -0
- data/ext/oxt/tracable_exception.cpp +87 -0
- data/ext/oxt/tracable_exception.hpp +35 -0
- data/{lib/passenger/constants.rb → ext/phusion_passenger/extconf.rb} +14 -9
- data/ext/{passenger → phusion_passenger}/native_support.c +33 -6
- data/lib/{passenger → phusion_passenger}/abstract_request_handler.rb +209 -93
- data/lib/{passenger → phusion_passenger}/abstract_server.rb +23 -8
- data/lib/phusion_passenger/abstract_server_collection.rb +301 -0
- data/lib/phusion_passenger/admin_tools.rb +25 -0
- data/lib/phusion_passenger/admin_tools/control_process.rb +107 -0
- data/lib/{passenger → phusion_passenger}/application.rb +13 -16
- data/lib/{passenger → phusion_passenger}/console_text_template.rb +2 -2
- data/{ext/passenger/extconf.rb → lib/phusion_passenger/constants.rb} +5 -5
- data/lib/{passenger → phusion_passenger}/dependencies.rb +38 -32
- data/lib/phusion_passenger/events.rb +45 -0
- data/lib/{passenger → phusion_passenger}/exceptions.rb +12 -5
- data/lib/{passenger → phusion_passenger}/html_template.rb +2 -2
- data/lib/{passenger → phusion_passenger}/message_channel.rb +3 -2
- data/lib/phusion_passenger/platform_info.rb +500 -0
- data/lib/{passenger → phusion_passenger}/rack/application_spawner.rb +29 -22
- data/lib/{passenger → phusion_passenger}/rack/request_handler.rb +14 -9
- data/lib/{passenger → phusion_passenger}/railz/application_spawner.rb +94 -74
- data/lib/{passenger → phusion_passenger}/railz/cgi_fixed.rb +2 -2
- data/lib/{passenger → phusion_passenger}/railz/framework_spawner.rb +86 -98
- data/lib/{passenger → phusion_passenger}/railz/request_handler.rb +6 -6
- data/lib/{passenger → phusion_passenger}/simple_benchmarking.rb +0 -0
- data/lib/{passenger → phusion_passenger}/spawn_manager.rb +136 -128
- data/lib/{passenger → phusion_passenger}/templates/apache2_config_snippets.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
- data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +38 -0
- data/lib/{passenger → phusion_passenger}/templates/app_init_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/database_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/deployment_example.txt.erb +1 -1
- data/lib/{passenger → phusion_passenger}/templates/error_layout.css +0 -0
- data/lib/{passenger → phusion_passenger}/templates/error_layout.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/framework_init_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/general_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/invalid_app_root.html.erb +1 -1
- data/lib/{passenger → phusion_passenger}/templates/load_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/no_write_permission_to_passenger_root.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/run_installer_as_root.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/version_not_found.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/welcome.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/utils.rb +210 -44
- data/lib/{passenger → phusion_passenger}/wsgi/application_spawner.rb +18 -15
- data/lib/{passenger → phusion_passenger}/wsgi/request_handler.py +7 -1
- data/man/passenger-memory-stats.8 +1 -1
- data/misc/render_error_pages.rb +1 -1
- data/test/ApplicationPoolServerTest.cpp +0 -28
- data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +4 -0
- data/test/ApplicationPoolTest.cpp +307 -69
- data/test/CachedFileStatTest.cpp +262 -0
- data/test/FileCheckerTest.cpp +79 -0
- data/test/MessageChannelTest.cpp +3 -3
- data/test/PoolOptionsTest.cpp +37 -0
- data/test/SpawnManagerTest.cpp +4 -4
- data/test/StandardApplicationPoolTest.cpp +4 -0
- data/test/SystemTimeTest.cpp +37 -0
- data/test/UtilsTest.cpp +137 -0
- data/test/integration_tests.rb +270 -23
- data/test/oxt/backtrace_test.cpp +128 -0
- data/test/oxt/oxt_test_main.cpp +25 -0
- data/test/oxt/syscall_interruption_test.cpp +50 -0
- data/test/ruby/abstract_request_handler_spec.rb +83 -0
- data/test/ruby/abstract_server_collection_spec.rb +246 -0
- data/test/ruby/application_spec.rb +3 -3
- data/test/ruby/message_channel_spec.rb +2 -2
- data/test/ruby/rack/application_spawner_spec.rb +3 -5
- data/test/ruby/rails/application_spawner_spec.rb +54 -15
- data/test/ruby/rails/framework_spawner_spec.rb +6 -8
- data/test/ruby/rails/minimal_spawner_spec.rb +29 -0
- data/test/ruby/rails/spawner_error_handling_spec.rb +1 -1
- data/test/ruby/rails/spawner_privilege_lowering_spec.rb +3 -3
- data/test/ruby/spawn_manager_spec.rb +23 -12
- data/test/ruby/utils_spec.rb +36 -2
- data/test/ruby/wsgi/application_spawner_spec.rb +47 -0
- data/test/stub/apache2/httpd.conf.erb +3 -5
- data/test/stub/message_channel.rb +2 -2
- data/test/stub/message_channel_2.rb +2 -2
- data/test/stub/message_channel_3.rb +3 -3
- data/test/stub/minimal-railsapp/README +0 -0
- data/test/stub/minimal-railsapp/config/application.rb +0 -0
- data/test/stub/minimal-railsapp/config/environment.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/actionmailer/lib/action_mailer.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_controller.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_pack.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_view.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/activerecord/lib/active_record.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/activeresource/lib/active_resource.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/railties/lib/dispatcher.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/railties/lib/initializer.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/railties/lib/ruby_version_check.rb +0 -0
- data/test/stub/rails_apps/foobar/app/controllers/foo_controller.rb +8 -0
- data/test/stub/rails_apps/foobar/config/environments/development.rb +1 -2
- data/test/stub/rails_apps/mycook/app/controllers/welcome_controller.rb +21 -1
- data/test/stub/rails_apps/mycook/sites/some.site/public/uploads.html +26 -0
- data/test/stub/rails_apps/mycook/sites/some.site/public/welcome/cached.html +26 -0
- data/test/stub/railsapp/app/controllers/application.rb +0 -0
- data/test/stub/railsapp/app/controllers/bar_controller_1.rb +0 -0
- data/test/stub/railsapp/app/controllers/bar_controller_2.rb +1 -1
- data/test/stub/railsapp/app/controllers/foo_controller.rb +4 -0
- data/test/stub/railsapp/app/helpers/application_helper.rb +0 -0
- data/test/stub/railsapp/config/boot.rb +0 -0
- data/test/stub/railsapp/config/database.yml +0 -0
- data/test/stub/railsapp/config/environment.rb +0 -0
- data/test/stub/railsapp/config/environments/development.rb +0 -0
- data/test/stub/railsapp/config/environments/production.rb +0 -0
- data/test/stub/railsapp/config/initializers/inflections.rb +0 -0
- data/test/stub/railsapp/config/initializers/mime_types.rb +0 -0
- data/test/stub/railsapp/config/routes.rb +0 -0
- data/test/stub/railsapp/public/useless.txt +0 -0
- data/test/stub/spawn_server.rb +3 -4
- data/test/stub/wsgi/passenger_wsgi.pyc +0 -0
- data/test/support/apache2_controller.rb +57 -7
- data/test/support/tut.h +15 -0
- data/vendor/README +12 -0
- data/vendor/README_FOR_PACKAGERS +1 -0
- data/vendor/rack-0.9.1/AUTHORS +8 -0
- data/vendor/rack-0.9.1/COPYING +18 -0
- data/vendor/rack-0.9.1/ChangeLog +1423 -0
- data/vendor/rack-0.9.1/KNOWN-ISSUES +18 -0
- data/vendor/rack-0.9.1/README +306 -0
- data/vendor/rack-0.9.1/Rakefile +188 -0
- data/vendor/rack-0.9.1/SPEC +129 -0
- data/vendor/rack-0.9.1/lib/rack.rb +86 -0
- data/vendor/rack-0.9.1/lib/rack/adapter/camping.rb +22 -0
- data/vendor/rack-0.9.1/lib/rack/auth/abstract/handler.rb +28 -0
- data/vendor/rack-0.9.1/lib/rack/auth/abstract/request.rb +37 -0
- data/vendor/rack-0.9.1/lib/rack/auth/basic.rb +58 -0
- data/vendor/rack-0.9.1/lib/rack/auth/digest/md5.rb +124 -0
- data/vendor/rack-0.9.1/lib/rack/auth/digest/nonce.rb +51 -0
- data/vendor/rack-0.9.1/lib/rack/auth/digest/params.rb +55 -0
- data/vendor/rack-0.9.1/lib/rack/auth/digest/request.rb +40 -0
- data/vendor/rack-0.9.1/lib/rack/auth/openid.rb +438 -0
- data/vendor/rack-0.9.1/lib/rack/builder.rb +67 -0
- data/vendor/rack-0.9.1/lib/rack/cascade.rb +36 -0
- data/vendor/rack-0.9.1/lib/rack/commonlogger.rb +61 -0
- data/vendor/rack-0.9.1/lib/rack/conditionalget.rb +43 -0
- data/vendor/rack-0.9.1/lib/rack/content_length.rb +25 -0
- data/vendor/rack-0.9.1/lib/rack/deflater.rb +87 -0
- data/vendor/rack-0.9.1/lib/rack/directory.rb +150 -0
- data/vendor/rack-0.9.1/lib/rack/file.rb +85 -0
- data/vendor/rack-0.9.1/lib/rack/handler.rb +48 -0
- data/vendor/rack-0.9.1/lib/rack/handler/cgi.rb +57 -0
- data/vendor/rack-0.9.1/lib/rack/handler/evented_mongrel.rb +8 -0
- data/vendor/rack-0.9.1/lib/rack/handler/fastcgi.rb +86 -0
- data/vendor/rack-0.9.1/lib/rack/handler/lsws.rb +52 -0
- data/vendor/rack-0.9.1/lib/rack/handler/mongrel.rb +82 -0
- data/vendor/rack-0.9.1/lib/rack/handler/scgi.rb +57 -0
- data/vendor/rack-0.9.1/lib/rack/handler/swiftiplied_mongrel.rb +8 -0
- data/vendor/rack-0.9.1/lib/rack/handler/thin.rb +15 -0
- data/vendor/rack-0.9.1/lib/rack/handler/webrick.rb +61 -0
- data/vendor/rack-0.9.1/lib/rack/head.rb +19 -0
- data/vendor/rack-0.9.1/lib/rack/lint.rb +465 -0
- data/vendor/rack-0.9.1/lib/rack/lobster.rb +65 -0
- data/vendor/rack-0.9.1/lib/rack/methodoverride.rb +27 -0
- data/vendor/rack-0.9.1/lib/rack/mime.rb +204 -0
- data/vendor/rack-0.9.1/lib/rack/mock.rb +160 -0
- data/vendor/rack-0.9.1/lib/rack/recursive.rb +57 -0
- data/vendor/rack-0.9.1/lib/rack/reloader.rb +64 -0
- data/vendor/rack-0.9.1/lib/rack/request.rb +218 -0
- data/vendor/rack-0.9.1/lib/rack/response.rb +171 -0
- data/vendor/rack-0.9.1/lib/rack/session/abstract/id.rb +153 -0
- data/vendor/rack-0.9.1/lib/rack/session/cookie.rb +89 -0
- data/vendor/rack-0.9.1/lib/rack/session/memcache.rb +97 -0
- data/vendor/rack-0.9.1/lib/rack/session/pool.rb +73 -0
- data/vendor/rack-0.9.1/lib/rack/showexceptions.rb +348 -0
- data/vendor/rack-0.9.1/lib/rack/showstatus.rb +106 -0
- data/vendor/rack-0.9.1/lib/rack/static.rb +38 -0
- data/vendor/rack-0.9.1/lib/rack/urlmap.rb +48 -0
- data/vendor/rack-0.9.1/lib/rack/utils.rb +347 -0
- metadata +1197 -1055
- data/doc/cxxapi/System_8h-source.html +0 -251
- data/doc/cxxapi/classDirectoryMapper-members.html +0 -38
- data/doc/cxxapi/classDirectoryMapper.html +0 -203
- data/doc/cxxapi/classPassenger_1_1Thread.html +0 -100
- data/doc/cxxapi/classboost_1_1this__thread_1_1disable__syscall__interruption.html +0 -46
- data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption-members.html +0 -33
- data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption.html +0 -44
- data/doc/cxxapi/namespacePassenger.html +0 -208
- data/doc/cxxapi/namespacePassenger_1_1InterruptableCalls.html +0 -43
- data/doc/cxxapi/namespacemembers.html +0 -70
- data/doc/cxxapi/namespacemembers_func.html +0 -66
- data/doc/cxxapi/namespacemembers_type.html +0 -46
- data/doc/cxxapi/namespaces.html +0 -35
- data/doc/rdoc/classes/Passenger.html +0 -136
- data/doc/rdoc/classes/Passenger/AbstractRequestHandler.html +0 -402
- data/doc/rdoc/classes/Passenger/SpawnManager.html +0 -379
- data/doc/rdoc/classes/Passenger/Utils.html +0 -578
- data/ext/apache2/System.h +0 -228
- data/lib/passenger/platform_info.rb +0 -302
- data/lib/passenger/templates/app_exited_during_initialization.html.erb +0 -19
- data/test/stub/apache2/httpd.conf +0 -75
- data/test/stub/rails_apps/foobar/config/environments/test.rb +0 -22
- data/test/stub/rails_apps/mycook/config/environments/test.rb +0 -22
- data/test/stub/railsapp/config/environments/test.rb +0 -22
- data/test/stub/railsapp2/config/environments/test.rb +0 -22
File without changes
|
File without changes
|
@@ -6,7 +6,7 @@ to your Apache configuration file, and set its DocumentRoot to
|
|
6
6
|
<b>
|
7
7
|
<VirtualHost *:80>
|
8
8
|
ServerName www.yourhost.com
|
9
|
-
DocumentRoot /somewhere/public
|
9
|
+
DocumentRoot /somewhere/public # <-- be sure to point to 'public'!
|
10
10
|
</VirtualHost>
|
11
11
|
</b>
|
12
12
|
And that's it! You may also want to check the Users Guide for security and
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<h1 class="error_title">Cannot start Ruby on Rails application</h1>
|
3
3
|
<div id="content">
|
4
4
|
|
5
|
-
The directory <tt class="filename"
|
5
|
+
The directory <tt class="filename">"<%=h @app_root %>"</tt>
|
6
6
|
does not appear to be a valid Ruby on Rails application root.
|
7
7
|
|
8
8
|
</div>
|
File without changes
|
data/lib/{passenger → phusion_passenger}/templates/no_write_permission_to_passenger_root.txt.erb
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -18,17 +18,19 @@
|
|
18
18
|
|
19
19
|
require 'rubygems'
|
20
20
|
require 'thread'
|
21
|
-
if
|
21
|
+
if (!defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby") && RUBY_VERSION < "1.8.7"
|
22
22
|
require 'fastthread'
|
23
23
|
end
|
24
24
|
require 'pathname'
|
25
25
|
require 'etc'
|
26
|
-
require '
|
27
|
-
|
28
|
-
|
26
|
+
require 'fcntl'
|
27
|
+
require 'tempfile'
|
28
|
+
require 'phusion_passenger/exceptions'
|
29
|
+
if !defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby"
|
30
|
+
require 'phusion_passenger/native_support'
|
29
31
|
end
|
30
32
|
|
31
|
-
module
|
33
|
+
module PhusionPassenger
|
32
34
|
|
33
35
|
# Utility functions.
|
34
36
|
module Utils
|
@@ -38,32 +40,33 @@ protected
|
|
38
40
|
# and it correctly respects symbolic links.
|
39
41
|
#
|
40
42
|
# Raises SystemCallError if something went wrong. Raises ArgumentError
|
41
|
-
# if +path+ is nil.
|
43
|
+
# if +path+ is nil. Raises InvalidPath if +path+ does not appear
|
44
|
+
# to be a valid path.
|
42
45
|
def normalize_path(path)
|
43
46
|
raise ArgumentError, "The 'path' argument may not be nil" if path.nil?
|
44
47
|
return Pathname.new(path).realpath.to_s
|
45
48
|
rescue Errno::ENOENT => e
|
46
|
-
raise
|
49
|
+
raise InvalidAPath, e.message
|
47
50
|
end
|
48
51
|
|
49
52
|
# Assert that +app_root+ is a valid Ruby on Rails application root.
|
50
|
-
# Raises
|
53
|
+
# Raises InvalidPath if that is not the case.
|
51
54
|
def assert_valid_app_root(app_root)
|
52
55
|
assert_valid_directory(app_root)
|
53
56
|
assert_valid_file("#{app_root}/config/environment.rb")
|
54
57
|
end
|
55
58
|
|
56
|
-
# Assert that +path+ is a directory. Raises +
|
59
|
+
# Assert that +path+ is a directory. Raises +InvalidPath+ if it isn't.
|
57
60
|
def assert_valid_directory(path)
|
58
61
|
if !File.directory?(path)
|
59
|
-
raise
|
62
|
+
raise InvalidPath, "'#{path}' is not a valid directory."
|
60
63
|
end
|
61
64
|
end
|
62
65
|
|
63
|
-
# Assert that +path+ is a file. Raises +
|
66
|
+
# Assert that +path+ is a file. Raises +InvalidPath+ if it isn't.
|
64
67
|
def assert_valid_file(path)
|
65
68
|
if !File.file?(path)
|
66
|
-
raise
|
69
|
+
raise InvalidPath, "'#{path}' is not a valid file."
|
67
70
|
end
|
68
71
|
end
|
69
72
|
|
@@ -156,16 +159,37 @@ protected
|
|
156
159
|
# Fork a new process and run the given block inside the child process, just like
|
157
160
|
# fork(). Unlike fork(), this method is safe, i.e. there's no way for the child
|
158
161
|
# process to escape the block. Any uncaught exceptions in the child process will
|
159
|
-
# be printed to standard output, citing
|
160
|
-
|
161
|
-
|
162
|
+
# be printed to standard output, citing +current_location+ as the source.
|
163
|
+
# Futhermore, the child process will exit by calling Kernel#exit!, thereby
|
164
|
+
# bypassing any at_exit or ensure blocks.
|
165
|
+
#
|
166
|
+
# If +double_fork+ is true, then the child process will fork and immediately exit.
|
167
|
+
# This technique can be used to avoid zombie processes, at the expense of not
|
168
|
+
# being able to waitpid() the second child.
|
169
|
+
def safe_fork(current_location = self.class, double_fork = false)
|
170
|
+
pid = fork
|
171
|
+
if pid.nil?
|
162
172
|
begin
|
163
|
-
|
173
|
+
if double_fork
|
174
|
+
pid2 = fork
|
175
|
+
if pid2.nil?
|
176
|
+
yield
|
177
|
+
end
|
178
|
+
else
|
179
|
+
yield
|
180
|
+
end
|
164
181
|
rescue Exception => e
|
165
|
-
print_exception(current_location, e)
|
182
|
+
print_exception(current_location.to_s, e)
|
166
183
|
ensure
|
167
184
|
exit!
|
168
185
|
end
|
186
|
+
else
|
187
|
+
if double_fork
|
188
|
+
Process.waitpid(pid) rescue nil
|
189
|
+
return pid
|
190
|
+
else
|
191
|
+
return pid
|
192
|
+
end
|
169
193
|
end
|
170
194
|
end
|
171
195
|
|
@@ -176,7 +200,25 @@ protected
|
|
176
200
|
# Exceptions are not propagated, except for SystemExit.
|
177
201
|
def report_app_init_status(channel)
|
178
202
|
begin
|
179
|
-
|
203
|
+
old_global_stderr = $stderr
|
204
|
+
old_stderr = STDERR
|
205
|
+
stderr_output = ""
|
206
|
+
tempfile = Tempfile.new('passenger-stderr')
|
207
|
+
tempfile.unlink
|
208
|
+
Object.send(:remove_const, 'STDERR') rescue nil
|
209
|
+
Object.const_set('STDERR', tempfile)
|
210
|
+
begin
|
211
|
+
yield
|
212
|
+
ensure
|
213
|
+
Object.send(:remove_const, 'STDERR') rescue nil
|
214
|
+
Object.const_set('STDERR', old_stderr)
|
215
|
+
$stderr = old_global_stderr
|
216
|
+
if tempfile
|
217
|
+
tempfile.rewind
|
218
|
+
stderr_output = tempfile.read
|
219
|
+
tempfile.close rescue nil
|
220
|
+
end
|
221
|
+
end
|
180
222
|
channel.write('success')
|
181
223
|
return true
|
182
224
|
rescue StandardError, ScriptError, NoMemoryError => e
|
@@ -185,9 +227,12 @@ protected
|
|
185
227
|
end
|
186
228
|
channel.write('exception')
|
187
229
|
channel.write_scalar(marshal_exception(e))
|
230
|
+
channel.write_scalar(stderr_output)
|
188
231
|
return false
|
189
|
-
rescue SystemExit
|
232
|
+
rescue SystemExit => e
|
190
233
|
channel.write('exit')
|
234
|
+
channel.write_scalar(marshal_exception(e))
|
235
|
+
channel.write_scalar(stderr_output)
|
191
236
|
raise
|
192
237
|
end
|
193
238
|
end
|
@@ -208,15 +253,19 @@ protected
|
|
208
253
|
status = args[0]
|
209
254
|
if status == 'exception'
|
210
255
|
child_exception = unmarshal_exception(channel.read_scalar)
|
256
|
+
stderr = channel.read_scalar
|
211
257
|
#print_exception(self.class.to_s, child_exception)
|
212
258
|
raise AppInitError.new(
|
213
259
|
"Application '#{@app_root}' raised an exception: " <<
|
214
260
|
"#{child_exception.class} (#{child_exception.message})",
|
215
261
|
child_exception,
|
216
|
-
app_type
|
262
|
+
app_type,
|
263
|
+
stderr.empty? ? nil : stderr)
|
217
264
|
elsif status == 'exit'
|
265
|
+
child_exception = unmarshal_exception(channel.read_scalar)
|
266
|
+
stderr = channel.read_scalar
|
218
267
|
raise AppInitError.new("Application '#{@app_root}' exited during startup",
|
219
|
-
|
268
|
+
child_exception, app_type, stderr.empty? ? nil : stderr)
|
220
269
|
end
|
221
270
|
end
|
222
271
|
|
@@ -265,9 +314,40 @@ protected
|
|
265
314
|
return true
|
266
315
|
end
|
267
316
|
end
|
317
|
+
|
318
|
+
def sanitize_spawn_options(options)
|
319
|
+
defaults = {
|
320
|
+
"lower_privilege" => true,
|
321
|
+
"lowest_user" => "nobody",
|
322
|
+
"environment" => "production",
|
323
|
+
"app_type" => "rails",
|
324
|
+
"spawn_method" => "smart-lv2",
|
325
|
+
"framework_spawner_timeout" => -1,
|
326
|
+
"app_spawner_timeout" => -1
|
327
|
+
}
|
328
|
+
options = defaults.merge(options)
|
329
|
+
options["lower_privilege"] = options["lower_privilege"].to_s == "true"
|
330
|
+
options["framework_spawner_timeout"] = options["framework_spawner_timeout"].to_i
|
331
|
+
options["app_spawner_timeout"] = options["app_spawner_timeout"].to_i
|
332
|
+
return options
|
333
|
+
end
|
334
|
+
|
335
|
+
# Returns the directory in which to store Phusion Passenger-specific
|
336
|
+
# temporary files. If +create+ is true, then this method creates the
|
337
|
+
# directory if it doesn't exist.
|
338
|
+
def passenger_tmpdir(create = true)
|
339
|
+
dir = ENV['PHUSION_PASSENGER_TMP']
|
340
|
+
if dir.nil? || dir.empty?
|
341
|
+
dir = Dir.tmpdir
|
342
|
+
end
|
343
|
+
if create && !File.exist?(dir)
|
344
|
+
system("mkdir", "-p", "-m", "u=rwxs,g=wx,o=wx", dir)
|
345
|
+
end
|
346
|
+
return dir
|
347
|
+
end
|
268
348
|
end
|
269
349
|
|
270
|
-
end # module
|
350
|
+
end # module PhusionPassenger
|
271
351
|
|
272
352
|
class Exception
|
273
353
|
def backtrace_string(current_location = nil)
|
@@ -287,15 +367,34 @@ class ConditionVariable
|
|
287
367
|
# amount of time. Returns true if this condition was signaled, false if a
|
288
368
|
# timeout occurred.
|
289
369
|
def timed_wait(mutex, secs)
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
370
|
+
if secs > 100000000
|
371
|
+
# NOTE: If one calls timeout() on FreeBSD 5 with an
|
372
|
+
# argument of more than 100000000, then MRI will become
|
373
|
+
# stuck in an infite loop, blocking all threads. It seems
|
374
|
+
# that MRI uses select() to implement sleeping.
|
375
|
+
# I think that a value of more than 100000000 overflows
|
376
|
+
# select()'s data structures, causing it to behave incorrectly.
|
377
|
+
# So we just make sure we can't sleep more than 100000000
|
378
|
+
# seconds.
|
379
|
+
secs = 100000000
|
380
|
+
end
|
381
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
|
382
|
+
if secs > 0
|
383
|
+
return wait(mutex, secs)
|
384
|
+
else
|
385
|
+
return wait(mutex)
|
294
386
|
end
|
295
387
|
else
|
296
|
-
|
388
|
+
require 'timeout' unless defined?(Timeout)
|
389
|
+
if secs > 0
|
390
|
+
Timeout.timeout(secs) do
|
391
|
+
wait(mutex)
|
392
|
+
end
|
393
|
+
else
|
394
|
+
wait(mutex)
|
395
|
+
end
|
396
|
+
return true
|
297
397
|
end
|
298
|
-
return true
|
299
398
|
rescue Timeout::Error
|
300
399
|
return false
|
301
400
|
end
|
@@ -304,31 +403,99 @@ class ConditionVariable
|
|
304
403
|
# amount of time. Raises Timeout::Error if the timeout has elapsed.
|
305
404
|
def timed_wait!(mutex, secs)
|
306
405
|
require 'timeout' unless defined?(Timeout)
|
307
|
-
if secs >
|
308
|
-
|
406
|
+
if secs > 100000000
|
407
|
+
# See the corresponding note for timed_wait().
|
408
|
+
secs = 100000000
|
409
|
+
end
|
410
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
|
411
|
+
if secs > 0
|
412
|
+
if !wait(mutex, secs)
|
413
|
+
raise Timeout::Error, "Timeout"
|
414
|
+
end
|
415
|
+
else
|
309
416
|
wait(mutex)
|
310
417
|
end
|
311
418
|
else
|
312
|
-
|
419
|
+
if secs > 0
|
420
|
+
Timeout.timeout(secs) do
|
421
|
+
wait(mutex)
|
422
|
+
end
|
423
|
+
else
|
424
|
+
wait(mutex)
|
425
|
+
end
|
313
426
|
end
|
427
|
+
return nil
|
314
428
|
end
|
315
429
|
end
|
316
430
|
|
317
431
|
class IO
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
432
|
+
if defined?(PhusionPassenger::NativeSupport)
|
433
|
+
# Send an IO object (i.e. a file descriptor) over this IO channel.
|
434
|
+
# This only works if this IO channel is a Unix socket.
|
435
|
+
#
|
436
|
+
# Raises SystemCallError if something went wrong.
|
437
|
+
def send_io(io)
|
438
|
+
PhusionPassenger::NativeSupport.send_fd(self.fileno, io.fileno)
|
439
|
+
end
|
440
|
+
|
441
|
+
# Receive an IO object (i.e. a file descriptor) from this IO channel.
|
442
|
+
# This only works if this IO channel is a Unix socket.
|
443
|
+
#
|
444
|
+
# Raises SystemCallError if something went wrong.
|
445
|
+
def recv_io
|
446
|
+
return IO.new(PhusionPassenger::NativeSupport.recv_fd(self.fileno))
|
447
|
+
end
|
324
448
|
end
|
325
449
|
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
450
|
+
def close_on_exec!
|
451
|
+
if defined?(Fcntl::F_SETFD)
|
452
|
+
fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
|
453
|
+
end
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
module Signal
|
458
|
+
# Like Signal.list, but only returns signals that we can actually trap.
|
459
|
+
def self.list_trappable
|
460
|
+
ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "mri"
|
461
|
+
case ruby_engine
|
462
|
+
when "mri"
|
463
|
+
if RUBY_VERSION >= '1.9.0'
|
464
|
+
return Signal.list
|
465
|
+
else
|
466
|
+
result = Signal.list
|
467
|
+
result.delete("ALRM")
|
468
|
+
return result
|
469
|
+
end
|
470
|
+
when "jruby"
|
471
|
+
result = Signal.list
|
472
|
+
result.delete("QUIT")
|
473
|
+
result.delete("ILL")
|
474
|
+
result.delete("FPE")
|
475
|
+
result.delete("KILL")
|
476
|
+
result.delete("SEGV")
|
477
|
+
result.delete("STOP")
|
478
|
+
result.delete("USR1")
|
479
|
+
return result
|
480
|
+
else
|
481
|
+
return Signal.list
|
482
|
+
end
|
483
|
+
end
|
484
|
+
end
|
485
|
+
|
486
|
+
# Ruby's implementation of UNIXSocket#recv_io and UNIXSocket#send_io
|
487
|
+
# are broken on 64-bit FreeBSD 7. So we override them with our own
|
488
|
+
# implementation.
|
489
|
+
if RUBY_PLATFORM =~ /freebsd/
|
490
|
+
require 'socket'
|
491
|
+
UNIXSocket.class_eval do
|
492
|
+
def recv_io
|
493
|
+
super
|
494
|
+
end
|
495
|
+
|
496
|
+
def send_io(io)
|
497
|
+
super
|
498
|
+
end
|
332
499
|
end
|
333
500
|
end
|
334
501
|
|
@@ -341,4 +508,3 @@ module GC
|
|
341
508
|
end
|
342
509
|
end
|
343
510
|
end
|
344
|
-
|
@@ -15,10 +15,10 @@
|
|
15
15
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
16
16
|
|
17
17
|
require 'socket'
|
18
|
-
require '
|
19
|
-
require '
|
20
|
-
require '
|
21
|
-
module
|
18
|
+
require 'phusion_passenger/application'
|
19
|
+
require 'phusion_passenger/message_channel'
|
20
|
+
require 'phusion_passenger/utils'
|
21
|
+
module PhusionPassenger
|
22
22
|
module WSGI
|
23
23
|
|
24
24
|
# Class for spawning WSGI applications.
|
@@ -41,24 +41,26 @@ class ApplicationSpawner
|
|
41
41
|
# - SystemCallError, IOError, SocketError: Something went wrong.
|
42
42
|
def spawn_application(app_root, lower_privilege = true, lowest_user = "nobody", environment = "production")
|
43
43
|
a, b = UNIXSocket.pair
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
44
|
+
pid = safe_fork(self.class.to_s, true) do
|
45
|
+
a.close
|
46
|
+
|
47
|
+
file_descriptors_to_leave_open = [0, 1, 2, b.fileno]
|
48
|
+
NativeSupport.close_all_file_descriptors(file_descriptors_to_leave_open)
|
49
|
+
close_all_io_objects_for_fds(file_descriptors_to_leave_open)
|
50
|
+
|
51
|
+
run(MessageChannel.new(b), app_root, lower_privilege, lowest_user, environment)
|
50
52
|
end
|
51
53
|
b.close
|
52
54
|
Process.waitpid(pid) rescue nil
|
53
55
|
|
54
56
|
channel = MessageChannel.new(a)
|
55
|
-
pid, socket_name,
|
57
|
+
pid, socket_name, socket_type = channel.read
|
56
58
|
if pid.nil?
|
57
59
|
raise IOError, "Connection closed"
|
58
60
|
end
|
59
61
|
owner_pipe = channel.recv_io
|
60
62
|
return Application.new(@app_root, pid, socket_name,
|
61
|
-
|
63
|
+
socket_type, owner_pipe)
|
62
64
|
end
|
63
65
|
|
64
66
|
private
|
@@ -70,11 +72,11 @@ private
|
|
70
72
|
lower_privilege('passenger_wsgi.py', lowest_user)
|
71
73
|
end
|
72
74
|
|
73
|
-
socket_file = "/
|
75
|
+
socket_file = "#{passenger_tmpdir}/passenger_wsgi.#{Process.pid}.#{rand 10000000}"
|
74
76
|
server = UNIXServer.new(socket_file)
|
75
77
|
begin
|
76
78
|
reader, writer = IO.pipe
|
77
|
-
channel.write(Process.pid, socket_file, "
|
79
|
+
channel.write(Process.pid, socket_file, "unix")
|
78
80
|
channel.send_io(writer)
|
79
81
|
writer.close
|
80
82
|
channel.close
|
@@ -84,6 +86,7 @@ private
|
|
84
86
|
exec(REQUEST_HANDLER, socket_file, server.fileno.to_s,
|
85
87
|
reader.fileno.to_s)
|
86
88
|
rescue
|
89
|
+
server.close
|
87
90
|
File.unlink(socket_file)
|
88
91
|
raise
|
89
92
|
end
|
@@ -91,4 +94,4 @@ private
|
|
91
94
|
end
|
92
95
|
|
93
96
|
end # module WSGI
|
94
|
-
end # module
|
97
|
+
end # module PhusionPassenger
|