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
@@ -0,0 +1,28 @@
|
|
1
|
+
/*
|
2
|
+
* Phusion Passenger - http://www.modrails.com/
|
3
|
+
* Copyright (C) 2009 Phusion
|
4
|
+
*
|
5
|
+
* Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.
|
6
|
+
*
|
7
|
+
* This program is free software; you can redistribute it and/or modify
|
8
|
+
* it under the terms of the GNU General Public License as published by
|
9
|
+
* the Free Software Foundation; version 2 of the License.
|
10
|
+
*
|
11
|
+
* This program is distributed in the hope that it will be useful,
|
12
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
* GNU General Public License for more details.
|
15
|
+
*
|
16
|
+
* You should have received a copy of the GNU General Public License along
|
17
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
18
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
19
|
+
*/
|
20
|
+
|
21
|
+
#include <time.h>
|
22
|
+
|
23
|
+
namespace Passenger {
|
24
|
+
namespace SystemTimeData {
|
25
|
+
bool hasForcedValue = false;
|
26
|
+
time_t forcedValue = 0;
|
27
|
+
}
|
28
|
+
}
|
@@ -0,0 +1,82 @@
|
|
1
|
+
/*
|
2
|
+
* Phusion Passenger - http://www.modrails.com/
|
3
|
+
* Copyright (C) 2009 Phusion
|
4
|
+
*
|
5
|
+
* Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.
|
6
|
+
*
|
7
|
+
* This program is free software; you can redistribute it and/or modify
|
8
|
+
* it under the terms of the GNU General Public License as published by
|
9
|
+
* the Free Software Foundation; version 2 of the License.
|
10
|
+
*
|
11
|
+
* This program is distributed in the hope that it will be useful,
|
12
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
* GNU General Public License for more details.
|
15
|
+
*
|
16
|
+
* You should have received a copy of the GNU General Public License along
|
17
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
18
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
19
|
+
*/
|
20
|
+
#ifndef _PASSENGER_SYSTEM_TIME_H_
|
21
|
+
#define _PASSENGER_SYSTEM_TIME_H_
|
22
|
+
|
23
|
+
#include <boost/thread.hpp>
|
24
|
+
#include <oxt/system_calls.hpp>
|
25
|
+
#include "Exceptions.h"
|
26
|
+
|
27
|
+
namespace Passenger {
|
28
|
+
|
29
|
+
using namespace oxt;
|
30
|
+
|
31
|
+
namespace SystemTimeData {
|
32
|
+
extern bool hasForcedValue;
|
33
|
+
extern time_t forcedValue;
|
34
|
+
}
|
35
|
+
|
36
|
+
/**
|
37
|
+
* This class allows one to obtain the system time, similar to time(). Unlike
|
38
|
+
* time(), it is possible to force a certain time to be returned, which is
|
39
|
+
* useful for testing code that depends on the system time.
|
40
|
+
*/
|
41
|
+
class SystemTime {
|
42
|
+
public:
|
43
|
+
/**
|
44
|
+
* Returns the time since the Epoch, measured in seconds. Or, if a time
|
45
|
+
* was forced, then the forced time is returned instead.
|
46
|
+
*
|
47
|
+
* @throws SystemException Something went wrong while retrieving the time.
|
48
|
+
* @throws boost::thread_interrupted
|
49
|
+
*/
|
50
|
+
static time_t get() {
|
51
|
+
if (SystemTimeData::hasForcedValue) {
|
52
|
+
return SystemTimeData::forcedValue;
|
53
|
+
} else {
|
54
|
+
time_t ret = syscalls::time(NULL);
|
55
|
+
if (ret == -1) {
|
56
|
+
throw SystemException("Unable to retrieve the system time",
|
57
|
+
errno);
|
58
|
+
}
|
59
|
+
return ret;
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
/**
|
64
|
+
* Force get() to return the given value.
|
65
|
+
*/
|
66
|
+
static void force(time_t value) {
|
67
|
+
SystemTimeData::hasForcedValue = true;
|
68
|
+
SystemTimeData::forcedValue = value;
|
69
|
+
}
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Release the previously forced value, so that get()
|
73
|
+
* returns the system time once again.
|
74
|
+
*/
|
75
|
+
static void release() {
|
76
|
+
SystemTimeData::hasForcedValue = false;
|
77
|
+
}
|
78
|
+
};
|
79
|
+
|
80
|
+
} // namespace Passenger
|
81
|
+
|
82
|
+
#endif /* _PASSENGER_SYSTEM_TIME_H_ */
|
data/ext/apache2/Utils.cpp
CHANGED
@@ -19,7 +19,7 @@
|
|
19
19
|
*/
|
20
20
|
|
21
21
|
#include <cassert>
|
22
|
-
#include
|
22
|
+
#include "CachedFileStat.h"
|
23
23
|
#include "Utils.h"
|
24
24
|
|
25
25
|
#define SPAWN_SERVER_SCRIPT_NAME "passenger-spawn-server"
|
@@ -31,6 +31,11 @@ atoi(const string &s) {
|
|
31
31
|
return ::atoi(s.c_str());
|
32
32
|
}
|
33
33
|
|
34
|
+
long
|
35
|
+
atol(const string &s) {
|
36
|
+
return ::atol(s.c_str());
|
37
|
+
}
|
38
|
+
|
34
39
|
void
|
35
40
|
split(const string &str, char sep, vector<string> &output) {
|
36
41
|
string::size_type start, pos;
|
@@ -44,14 +49,31 @@ split(const string &str, char sep, vector<string> &output) {
|
|
44
49
|
}
|
45
50
|
|
46
51
|
bool
|
47
|
-
fileExists(const char *filename) {
|
52
|
+
fileExists(const char *filename, CachedMultiFileStat *mstat, unsigned int throttleRate) {
|
53
|
+
return getFileType(filename, mstat, throttleRate) == FT_REGULAR;
|
54
|
+
}
|
55
|
+
|
56
|
+
FileType
|
57
|
+
getFileType(const char *filename, CachedMultiFileStat *mstat, unsigned int throttleRate) {
|
48
58
|
struct stat buf;
|
59
|
+
int ret;
|
49
60
|
|
50
|
-
if (
|
51
|
-
|
61
|
+
if (mstat != NULL) {
|
62
|
+
ret = cached_multi_file_stat_perform(mstat, filename, &buf, throttleRate);
|
63
|
+
} else {
|
64
|
+
ret = stat(filename, &buf);
|
65
|
+
}
|
66
|
+
if (ret == 0) {
|
67
|
+
if (S_ISREG(buf.st_mode)) {
|
68
|
+
return FT_REGULAR;
|
69
|
+
} else if (S_ISDIR(buf.st_mode)) {
|
70
|
+
return FT_DIRECTORY;
|
71
|
+
} else {
|
72
|
+
return FT_OTHER;
|
73
|
+
}
|
52
74
|
} else {
|
53
75
|
if (errno == ENOENT) {
|
54
|
-
return
|
76
|
+
return FT_NONEXISTANT;
|
55
77
|
} else {
|
56
78
|
int e = errno;
|
57
79
|
string message("Cannot stat '");
|
@@ -76,7 +98,7 @@ findSpawnServer(const char *passengerRoot) {
|
|
76
98
|
return path;
|
77
99
|
} else {
|
78
100
|
path.assign(root);
|
79
|
-
path.append("lib/
|
101
|
+
path.append("lib/phusion_passenger/passenger-spawn-server");
|
80
102
|
return path;
|
81
103
|
}
|
82
104
|
return path;
|
@@ -115,7 +137,7 @@ findApplicationPoolServer(const char *passengerRoot) {
|
|
115
137
|
return path;
|
116
138
|
} else {
|
117
139
|
path.assign(root);
|
118
|
-
path.append("lib/
|
140
|
+
path.append("lib/phusion_passenger/ApplicationPoolServerExecutable");
|
119
141
|
return path;
|
120
142
|
}
|
121
143
|
}
|
@@ -128,7 +150,13 @@ canonicalizePath(const string &path) {
|
|
128
150
|
// rationale.
|
129
151
|
char *tmp = realpath(path.c_str(), NULL);
|
130
152
|
if (tmp == NULL) {
|
131
|
-
|
153
|
+
int e = errno;
|
154
|
+
string message;
|
155
|
+
|
156
|
+
message = "Cannot resolve the path '";
|
157
|
+
message.append(path);
|
158
|
+
message.append("'");
|
159
|
+
throw FileSystemException(message, e, path);
|
132
160
|
} else {
|
133
161
|
string result(tmp);
|
134
162
|
free(tmp);
|
@@ -137,32 +165,158 @@ canonicalizePath(const string &path) {
|
|
137
165
|
#else
|
138
166
|
char tmp[PATH_MAX];
|
139
167
|
if (realpath(path.c_str(), tmp) == NULL) {
|
140
|
-
|
168
|
+
int e = errno;
|
169
|
+
string message;
|
170
|
+
|
171
|
+
message = "Cannot resolve the path '";
|
172
|
+
message.append(path);
|
173
|
+
message.append("'");
|
174
|
+
throw FileSystemException(message, e, path);
|
141
175
|
} else {
|
142
176
|
return tmp;
|
143
177
|
}
|
144
178
|
#endif
|
145
179
|
}
|
146
180
|
|
181
|
+
string
|
182
|
+
escapeForXml(const string &input) {
|
183
|
+
string result(input);
|
184
|
+
string::size_type input_pos = 0;
|
185
|
+
string::size_type input_end_pos = input.size();
|
186
|
+
string::size_type result_pos = 0;
|
187
|
+
|
188
|
+
while (input_pos < input_end_pos) {
|
189
|
+
const unsigned char ch = input[input_pos];
|
190
|
+
|
191
|
+
if ((ch >= 'A' && ch <= 'z')
|
192
|
+
|| (ch >= '0' && ch <= '9')
|
193
|
+
|| ch == '/' || ch == ' ' || ch == '_' || ch == '.') {
|
194
|
+
// This is an ASCII character. Ignore it and
|
195
|
+
// go to next character.
|
196
|
+
result_pos++;
|
197
|
+
} else {
|
198
|
+
// Not an ASCII character; escape it.
|
199
|
+
char escapedCharacter[sizeof("ÿ") + 1];
|
200
|
+
int size;
|
201
|
+
|
202
|
+
size = snprintf(escapedCharacter,
|
203
|
+
sizeof(escapedCharacter) - 1,
|
204
|
+
"&#%d;",
|
205
|
+
(int) ch);
|
206
|
+
if (size < 0) {
|
207
|
+
throw std::bad_alloc();
|
208
|
+
}
|
209
|
+
escapedCharacter[sizeof(escapedCharacter) - 1] = '\0';
|
210
|
+
|
211
|
+
result.replace(result_pos, 1, escapedCharacter, size);
|
212
|
+
result_pos += size;
|
213
|
+
}
|
214
|
+
input_pos++;
|
215
|
+
}
|
216
|
+
|
217
|
+
return result;
|
218
|
+
}
|
219
|
+
|
220
|
+
const char *
|
221
|
+
getTempDir() {
|
222
|
+
const char *temp_dir = getenv("TMPDIR");
|
223
|
+
if (temp_dir == NULL || *temp_dir == '\0') {
|
224
|
+
temp_dir = "/tmp";
|
225
|
+
}
|
226
|
+
return temp_dir;
|
227
|
+
}
|
228
|
+
|
229
|
+
string
|
230
|
+
getPassengerTempDir(bool bypassCache) {
|
231
|
+
if (bypassCache) {
|
232
|
+
goto calculateResult;
|
233
|
+
} else {
|
234
|
+
const char *tmp = getenv("PHUSION_PASSENGER_TMP");
|
235
|
+
if (tmp != NULL && *tmp != '\0') {
|
236
|
+
return tmp;
|
237
|
+
} else {
|
238
|
+
goto calculateResult;
|
239
|
+
}
|
240
|
+
}
|
241
|
+
|
242
|
+
calculateResult:
|
243
|
+
const char *temp_dir = getTempDir();
|
244
|
+
char buffer[PATH_MAX];
|
245
|
+
|
246
|
+
snprintf(buffer, sizeof(buffer), "%s/passenger.%lu",
|
247
|
+
temp_dir, (unsigned long) getpid());
|
248
|
+
buffer[sizeof(buffer) - 1] = '\0';
|
249
|
+
setenv("PHUSION_PASSENGER_TMP", buffer, 1);
|
250
|
+
return buffer;
|
251
|
+
}
|
252
|
+
|
253
|
+
void
|
254
|
+
createPassengerTempDir() {
|
255
|
+
makeDirTree(getPassengerTempDir().c_str(), "u=rwxs,g=wx,o=wx");
|
256
|
+
}
|
257
|
+
|
258
|
+
void
|
259
|
+
makeDirTree(const char *path, const char *mode) {
|
260
|
+
char command[PATH_MAX + 10];
|
261
|
+
snprintf(command, sizeof(command), "mkdir -p -m \"%s\" \"%s\"", mode, path);
|
262
|
+
command[sizeof(command) - 1] = '\0';
|
263
|
+
|
264
|
+
int result;
|
265
|
+
do {
|
266
|
+
result = system(command);
|
267
|
+
} while (result == -1 && errno == EINTR);
|
268
|
+
if (result != 0) {
|
269
|
+
char message[1024];
|
270
|
+
int e = errno;
|
271
|
+
|
272
|
+
snprintf(message, sizeof(message) - 1, "Cannot create directory '%s'", path);
|
273
|
+
message[sizeof(message) - 1] = '\0';
|
274
|
+
if (result == -1) {
|
275
|
+
throw SystemException(message, e);
|
276
|
+
} else {
|
277
|
+
throw IOException(message);
|
278
|
+
}
|
279
|
+
}
|
280
|
+
}
|
281
|
+
|
282
|
+
void
|
283
|
+
removeDirTree(const char *path) {
|
284
|
+
char command[PATH_MAX + 10];
|
285
|
+
snprintf(command, sizeof(command), "rm -rf \"%s\"", path);
|
286
|
+
command[sizeof(command) - 1] = '\0';
|
287
|
+
|
288
|
+
int result;
|
289
|
+
do {
|
290
|
+
result = system(command);
|
291
|
+
} while (result == -1 && errno == EINTR);
|
292
|
+
if (result == -1) {
|
293
|
+
char message[1024];
|
294
|
+
|
295
|
+
snprintf(message, sizeof(message) - 1, "Cannot create directory '%s'", path);
|
296
|
+
message[sizeof(message) - 1] = '\0';
|
297
|
+
throw IOException(message);
|
298
|
+
}
|
299
|
+
}
|
300
|
+
|
147
301
|
bool
|
148
|
-
verifyRailsDir(const string &dir) {
|
302
|
+
verifyRailsDir(const string &dir, CachedMultiFileStat *mstat, unsigned int throttleRate) {
|
149
303
|
string temp(dir);
|
150
|
-
temp.append("
|
151
|
-
return fileExists(temp.c_str());
|
304
|
+
temp.append("/config/environment.rb");
|
305
|
+
return fileExists(temp.c_str(), mstat, throttleRate);
|
152
306
|
}
|
153
307
|
|
154
308
|
bool
|
155
|
-
verifyRackDir(const string &dir) {
|
309
|
+
verifyRackDir(const string &dir, CachedMultiFileStat *mstat, unsigned int throttleRate) {
|
156
310
|
string temp(dir);
|
157
|
-
temp.append("
|
158
|
-
return fileExists(temp.c_str());
|
311
|
+
temp.append("/config.ru");
|
312
|
+
return fileExists(temp.c_str(), mstat, throttleRate);
|
159
313
|
}
|
160
314
|
|
161
315
|
bool
|
162
|
-
verifyWSGIDir(const string &dir) {
|
316
|
+
verifyWSGIDir(const string &dir, CachedMultiFileStat *mstat, unsigned int throttleRate) {
|
163
317
|
string temp(dir);
|
164
|
-
temp.append("
|
165
|
-
return fileExists(temp.c_str());
|
318
|
+
temp.append("/passenger_wsgi.py");
|
319
|
+
return fileExists(temp.c_str(), mstat, throttleRate);
|
166
320
|
}
|
167
321
|
|
168
322
|
} // namespace Passenger
|
data/ext/apache2/Utils.h
CHANGED
@@ -32,13 +32,28 @@
|
|
32
32
|
#include <cstdlib>
|
33
33
|
#include <cstring>
|
34
34
|
#include <errno.h>
|
35
|
+
#include <unistd.h>
|
35
36
|
#include "Exceptions.h"
|
36
37
|
|
38
|
+
typedef struct CachedMultiFileStat CachedMultiFileStat;
|
39
|
+
|
37
40
|
namespace Passenger {
|
38
41
|
|
39
42
|
using namespace std;
|
40
43
|
using namespace boost;
|
41
44
|
|
45
|
+
/** Enumeration which indicates what kind of file a file is. */
|
46
|
+
typedef enum {
|
47
|
+
/** The file doesn't exist. */
|
48
|
+
FT_NONEXISTANT,
|
49
|
+
/** A regular file or a symlink to a regular file. */
|
50
|
+
FT_REGULAR,
|
51
|
+
/** A directory. */
|
52
|
+
FT_DIRECTORY,
|
53
|
+
/** Something else, e.g. a pipe or a socket. */
|
54
|
+
FT_OTHER
|
55
|
+
} FileType;
|
56
|
+
|
42
57
|
/**
|
43
58
|
* Convenience shortcut for creating a <tt>shared_ptr</tt>.
|
44
59
|
* Instead of:
|
@@ -118,6 +133,12 @@ toString(T something) {
|
|
118
133
|
*/
|
119
134
|
int atoi(const string &s);
|
120
135
|
|
136
|
+
/**
|
137
|
+
* Converts the given string to a long integer.
|
138
|
+
* @ingroup Support
|
139
|
+
*/
|
140
|
+
long atol(const string &s);
|
141
|
+
|
121
142
|
/**
|
122
143
|
* Split the given string using the given separator.
|
123
144
|
*
|
@@ -132,11 +153,27 @@ void split(const string &str, char sep, vector<string> &output);
|
|
132
153
|
* Check whether the specified file exists.
|
133
154
|
*
|
134
155
|
* @param filename The filename to check.
|
156
|
+
* @param mstat A CachedMultiFileStat object, if you want to use cached statting.
|
157
|
+
* @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.
|
135
158
|
* @return Whether the file exists.
|
136
159
|
* @throws FileSystemException Unable to check because of a filesystem error.
|
137
160
|
* @ingroup Support
|
138
161
|
*/
|
139
|
-
bool fileExists(const char *filename
|
162
|
+
bool fileExists(const char *filename, CachedMultiFileStat *mstat = 0,
|
163
|
+
unsigned int throttleRate = 0);
|
164
|
+
|
165
|
+
/**
|
166
|
+
* Check whether 'filename' exists and what kind of file it is.
|
167
|
+
*
|
168
|
+
* @param filename The filename to check.
|
169
|
+
* @param mstat A CachedMultiFileStat object, if you want to use cached statting.
|
170
|
+
* @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.
|
171
|
+
* @return The file type.
|
172
|
+
* @throws FileSystemException Unable to check because of a filesystem error.
|
173
|
+
* @ingroup Support
|
174
|
+
*/
|
175
|
+
FileType getFileType(const char *filename, CachedMultiFileStat *mstat = 0,
|
176
|
+
unsigned int throttleRate = 0);
|
140
177
|
|
141
178
|
/**
|
142
179
|
* Find the location of the Passenger spawn server script.
|
@@ -167,38 +204,109 @@ string findApplicationPoolServer(const char *passengerRoot);
|
|
167
204
|
/**
|
168
205
|
* Returns a canonical version of the specified path. All symbolic links
|
169
206
|
* and relative path elements are resolved.
|
170
|
-
* Returns an empty string if something went wrong.
|
171
207
|
*
|
208
|
+
* @throws FileSystemException Something went wrong.
|
172
209
|
* @ingroup Support
|
173
210
|
*/
|
174
211
|
string canonicalizePath(const string &path);
|
175
212
|
|
213
|
+
/**
|
214
|
+
* Escape the given raw string into an XML value.
|
215
|
+
*
|
216
|
+
* @throws std::bad_alloc Something went wrong.
|
217
|
+
* @ingroup Support
|
218
|
+
*/
|
219
|
+
string escapeForXml(const string &input);
|
220
|
+
|
221
|
+
/**
|
222
|
+
* Return the path name for the directory in which temporary files are
|
223
|
+
* to be stored.
|
224
|
+
*
|
225
|
+
* @ensure result != NULL
|
226
|
+
* @ingroup Support
|
227
|
+
*/
|
228
|
+
const char *getTempDir();
|
229
|
+
|
230
|
+
/**
|
231
|
+
* Return the path name for the directory in which Phusion Passenger-specific
|
232
|
+
* temporary files are to be stored. This directory is unique for this instance
|
233
|
+
* of the web server in which Phusion Passenger is running.
|
234
|
+
*
|
235
|
+
* The result will be cached into the PHUSION_PASSENGER_TMP environment variable,
|
236
|
+
* which will be used for future calls to this function. To bypass this cache,
|
237
|
+
* set 'bypassCache' to true.
|
238
|
+
*
|
239
|
+
* @ensure !result.empty()
|
240
|
+
* @ingroup Support
|
241
|
+
*/
|
242
|
+
string getPassengerTempDir(bool bypassCache = false);
|
243
|
+
|
244
|
+
/* Create a temp folder for storing Phusion Passenger-specific temp files,
|
245
|
+
* such as temporarily buffered uploads, sockets for backend processes, etc.
|
246
|
+
* This call also sets the PHUSION_PASSENGER_TMP environment variable, which
|
247
|
+
* allows backend processes to find this temp folder.
|
248
|
+
*
|
249
|
+
* Does nothing if this folder already exists.
|
250
|
+
*
|
251
|
+
* @throws IOException Something went wrong.
|
252
|
+
* @throws SystemException Something went wrong.
|
253
|
+
*/
|
254
|
+
void createPassengerTempDir();
|
255
|
+
|
256
|
+
/**
|
257
|
+
* Create the directory at the given path, creating intermediate directories
|
258
|
+
* if necessary. The created directories' permissions are as specified by the
|
259
|
+
* 'mode' parameter.
|
260
|
+
*
|
261
|
+
* If 'path' already exists, then nothing will happen.
|
262
|
+
*
|
263
|
+
* @throws IOException Something went wrong.
|
264
|
+
* @throws SystemException Something went wrong.
|
265
|
+
*/
|
266
|
+
void makeDirTree(const char *path, const char *mode = "u=rwx,g=,o=");
|
267
|
+
|
268
|
+
/**
|
269
|
+
* Remove an entire directory tree recursively.
|
270
|
+
*
|
271
|
+
* @throws SystemException Something went wrong.
|
272
|
+
*/
|
273
|
+
void removeDirTree(const char *path);
|
274
|
+
|
176
275
|
/**
|
177
276
|
* Check whether the specified directory is a valid Ruby on Rails
|
178
|
-
*
|
277
|
+
* application root directory.
|
179
278
|
*
|
279
|
+
* @param mstat A CachedMultiFileStat object, if you want to use cached statting.
|
280
|
+
* @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.
|
180
281
|
* @throws FileSystemException Unable to check because of a system error.
|
181
282
|
* @ingroup Support
|
182
283
|
*/
|
183
|
-
bool verifyRailsDir(const string &dir
|
284
|
+
bool verifyRailsDir(const string &dir, CachedMultiFileStat *mstat = 0,
|
285
|
+
unsigned int throttleRate = 0);
|
184
286
|
|
185
287
|
/**
|
186
|
-
* Check whether the specified directory is a valid Rack
|
187
|
-
* directory.
|
288
|
+
* Check whether the specified directory is a valid Rack application
|
289
|
+
* root directory.
|
188
290
|
*
|
291
|
+
* @param mstat A CachedMultiFileStat object, if you want to use cached statting.
|
292
|
+
* @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.
|
189
293
|
* @throws FileSystemException Unable to check because of a filesystem error.
|
190
294
|
* @ingroup Support
|
191
295
|
*/
|
192
|
-
bool verifyRackDir(const string &dir
|
296
|
+
bool verifyRackDir(const string &dir, CachedMultiFileStat *mstat = 0,
|
297
|
+
unsigned int throttleRate = 0);
|
193
298
|
|
194
299
|
/**
|
195
|
-
* Check whether the specified directory is a valid WSGI
|
196
|
-
* directory.
|
300
|
+
* Check whether the specified directory is a valid WSGI application
|
301
|
+
* root directory.
|
197
302
|
*
|
303
|
+
* @param mstat A CachedMultiFileStat object, if you want to use cached statting.
|
304
|
+
* @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.
|
198
305
|
* @throws FileSystemException Unable to check because of a filesystem error.
|
199
306
|
* @ingroup Support
|
200
307
|
*/
|
201
|
-
bool verifyWSGIDir(const string &dir
|
308
|
+
bool verifyWSGIDir(const string &dir, CachedMultiFileStat *mstat = 0,
|
309
|
+
unsigned int throttleRate = 0);
|
202
310
|
|
203
311
|
/**
|
204
312
|
* Represents a temporary file. The associated file is automatically
|
@@ -221,21 +329,18 @@ public:
|
|
221
329
|
* a big not-in-memory buffer to work with.
|
222
330
|
* @throws SystemException Something went wrong.
|
223
331
|
*/
|
224
|
-
TempFile(bool anonymous = true) {
|
225
|
-
const char *temp_dir;
|
332
|
+
TempFile(const char *identifier = "temp", bool anonymous = true) {
|
226
333
|
char templ[PATH_MAX];
|
227
334
|
int fd;
|
228
335
|
|
229
|
-
|
230
|
-
if (temp_dir == NULL || *temp_dir == '\0') {
|
231
|
-
temp_dir = "/tmp";
|
232
|
-
}
|
233
|
-
|
234
|
-
snprintf(templ, sizeof(templ), "%s/passenger.XXXXXX", temp_dir);
|
336
|
+
snprintf(templ, sizeof(templ), "%s/%s.XXXXXX", getPassengerTempDir().c_str(), identifier);
|
235
337
|
templ[sizeof(templ) - 1] = '\0';
|
236
338
|
fd = mkstemp(templ);
|
237
339
|
if (fd == -1) {
|
238
|
-
|
340
|
+
char message[1024];
|
341
|
+
snprintf(message, sizeof(message), "Cannot create a temporary file '%s'", templ);
|
342
|
+
message[sizeof(message) - 1] = '\0';
|
343
|
+
throw SystemException(message, errno);
|
239
344
|
}
|
240
345
|
if (anonymous) {
|
241
346
|
fchmod(fd, 0000);
|