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,287 @@
|
|
1
|
+
/*
|
2
|
+
* Phusion Passenger - http://www.modrails.com/
|
3
|
+
* Copyright (C) 2008 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_DIRECTORY_MAPPER_H_
|
21
|
+
#define _PASSENGER_DIRECTORY_MAPPER_H_
|
22
|
+
|
23
|
+
#include <string>
|
24
|
+
#include <set>
|
25
|
+
#include <cstring>
|
26
|
+
|
27
|
+
#include <oxt/backtrace.hpp>
|
28
|
+
|
29
|
+
#include "CachedFileStat.h"
|
30
|
+
#include "Configuration.h"
|
31
|
+
#include "Utils.h"
|
32
|
+
|
33
|
+
// The Apache/APR headers *must* come after the Boost headers, otherwise
|
34
|
+
// compilation will fail on OpenBSD.
|
35
|
+
#include <httpd.h>
|
36
|
+
#include <http_core.h>
|
37
|
+
|
38
|
+
namespace Passenger {
|
39
|
+
|
40
|
+
using namespace std;
|
41
|
+
using namespace oxt;
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Utility class for determining URI-to-application directory mappings.
|
45
|
+
* Given a URI, it will determine whether that URI belongs to a Phusion
|
46
|
+
* Passenger-handled application, what the base URI of that application is,
|
47
|
+
* and what the associated 'public' directory is.
|
48
|
+
*
|
49
|
+
* @note This class is not thread-safe, but is reentrant.
|
50
|
+
* @ingroup Core
|
51
|
+
*/
|
52
|
+
class DirectoryMapper {
|
53
|
+
public:
|
54
|
+
enum ApplicationType {
|
55
|
+
NONE,
|
56
|
+
RAILS,
|
57
|
+
RACK,
|
58
|
+
WSGI
|
59
|
+
};
|
60
|
+
|
61
|
+
private:
|
62
|
+
DirConfig *config;
|
63
|
+
request_rec *r;
|
64
|
+
CachedMultiFileStat *mstat;
|
65
|
+
unsigned int throttleRate;
|
66
|
+
bool baseURIKnown;
|
67
|
+
const char *baseURI;
|
68
|
+
ApplicationType appType;
|
69
|
+
|
70
|
+
inline bool shouldAutoDetectRails() {
|
71
|
+
return config->autoDetectRails == DirConfig::ENABLED ||
|
72
|
+
config->autoDetectRails == DirConfig::UNSET;
|
73
|
+
}
|
74
|
+
|
75
|
+
inline bool shouldAutoDetectRack() {
|
76
|
+
return config->autoDetectRack == DirConfig::ENABLED ||
|
77
|
+
config->autoDetectRack == DirConfig::UNSET;
|
78
|
+
}
|
79
|
+
|
80
|
+
inline bool shouldAutoDetectWSGI() {
|
81
|
+
return config->autoDetectWSGI == DirConfig::ENABLED ||
|
82
|
+
config->autoDetectWSGI == DirConfig::UNSET;
|
83
|
+
}
|
84
|
+
|
85
|
+
public:
|
86
|
+
/**
|
87
|
+
* Create a new DirectoryMapper object.
|
88
|
+
*
|
89
|
+
* @param mstat A CachedMultiFileStat object used for statting files.
|
90
|
+
* @param throttleRate A throttling rate for mstat.
|
91
|
+
* @warning Do not use this object after the destruction of <tt>r</tt>,
|
92
|
+
* <tt>config</tt> or <tt>mstat</tt>.
|
93
|
+
*/
|
94
|
+
DirectoryMapper(request_rec *r, DirConfig *config,
|
95
|
+
CachedMultiFileStat *mstat, unsigned int throttleRate) {
|
96
|
+
this->r = r;
|
97
|
+
this->config = config;
|
98
|
+
this->mstat = mstat;
|
99
|
+
this->throttleRate = throttleRate;
|
100
|
+
appType = NONE;
|
101
|
+
baseURIKnown = false;
|
102
|
+
baseURI = NULL;
|
103
|
+
}
|
104
|
+
|
105
|
+
/**
|
106
|
+
* Determine whether the given HTTP request falls under one of the specified
|
107
|
+
* RailsBaseURIs or RackBaseURIs. If yes, then the first matching base URI will
|
108
|
+
* be returned.
|
109
|
+
*
|
110
|
+
* If Rails/Rack autodetection was enabled in the configuration, and the document
|
111
|
+
* root seems to be a valid Rails/Rack 'public' folder, then this method will
|
112
|
+
* return "/".
|
113
|
+
*
|
114
|
+
* Otherwise, NULL will be returned.
|
115
|
+
*
|
116
|
+
* @throws FileSystemException This method might also examine the filesystem in
|
117
|
+
* order to detect the application's type. During that process, a
|
118
|
+
* FileSystemException might be thrown.
|
119
|
+
* @warning The return value may only be used as long as <tt>config</tt>
|
120
|
+
* hasn't been destroyed.
|
121
|
+
*/
|
122
|
+
const char *getBaseURI() {
|
123
|
+
TRACE_POINT();
|
124
|
+
if (baseURIKnown) {
|
125
|
+
return baseURI;
|
126
|
+
}
|
127
|
+
|
128
|
+
set<string>::const_iterator it;
|
129
|
+
const char *uri = r->uri;
|
130
|
+
size_t uri_len = strlen(uri);
|
131
|
+
|
132
|
+
if (uri_len == 0 || uri[0] != '/') {
|
133
|
+
baseURIKnown = true;
|
134
|
+
return NULL;
|
135
|
+
}
|
136
|
+
|
137
|
+
UPDATE_TRACE_POINT();
|
138
|
+
for (it = config->railsBaseURIs.begin(); it != config->railsBaseURIs.end(); it++) {
|
139
|
+
const string &base(*it);
|
140
|
+
if ( base == "/"
|
141
|
+
|| ( uri_len == base.size() && memcmp(uri, base.c_str(), uri_len) == 0 )
|
142
|
+
|| ( uri_len > base.size() && memcmp(uri, base.c_str(), base.size()) == 0
|
143
|
+
&& uri[base.size()] == '/' )
|
144
|
+
) {
|
145
|
+
baseURIKnown = true;
|
146
|
+
baseURI = base.c_str();
|
147
|
+
appType = RAILS;
|
148
|
+
return baseURI;
|
149
|
+
}
|
150
|
+
}
|
151
|
+
|
152
|
+
UPDATE_TRACE_POINT();
|
153
|
+
for (it = config->rackBaseURIs.begin(); it != config->rackBaseURIs.end(); it++) {
|
154
|
+
const string &base(*it);
|
155
|
+
if ( base == "/"
|
156
|
+
|| ( uri_len == base.size() && memcmp(uri, base.c_str(), uri_len) == 0 )
|
157
|
+
|| ( uri_len > base.size() && memcmp(uri, base.c_str(), base.size()) == 0
|
158
|
+
&& uri[base.size()] == '/' )
|
159
|
+
) {
|
160
|
+
baseURIKnown = true;
|
161
|
+
baseURI = base.c_str();
|
162
|
+
appType = RACK;
|
163
|
+
return baseURI;
|
164
|
+
}
|
165
|
+
}
|
166
|
+
|
167
|
+
UPDATE_TRACE_POINT();
|
168
|
+
if (shouldAutoDetectRails()
|
169
|
+
&& verifyRailsDir(config->getAppRoot(ap_document_root(r)), mstat, throttleRate)) {
|
170
|
+
baseURIKnown = true;
|
171
|
+
baseURI = "/";
|
172
|
+
appType = RAILS;
|
173
|
+
return baseURI;
|
174
|
+
}
|
175
|
+
|
176
|
+
UPDATE_TRACE_POINT();
|
177
|
+
if (shouldAutoDetectRack()
|
178
|
+
&& verifyRackDir(config->getAppRoot(ap_document_root(r)), mstat, throttleRate)) {
|
179
|
+
baseURIKnown = true;
|
180
|
+
baseURI = "/";
|
181
|
+
appType = RACK;
|
182
|
+
return baseURI;
|
183
|
+
}
|
184
|
+
|
185
|
+
UPDATE_TRACE_POINT();
|
186
|
+
if (shouldAutoDetectWSGI()
|
187
|
+
&& verifyWSGIDir(config->getAppRoot(ap_document_root(r)), mstat, throttleRate)) {
|
188
|
+
baseURIKnown = true;
|
189
|
+
baseURI = "/";
|
190
|
+
appType = WSGI;
|
191
|
+
return baseURI;
|
192
|
+
}
|
193
|
+
|
194
|
+
baseURIKnown = true;
|
195
|
+
return NULL;
|
196
|
+
}
|
197
|
+
|
198
|
+
/**
|
199
|
+
* Returns the filename of the 'public' directory of the Rails/Rack application
|
200
|
+
* that's associated with the HTTP request.
|
201
|
+
*
|
202
|
+
* Returns an empty string if the document root of the HTTP request
|
203
|
+
* cannot be determined, or if it isn't a valid folder.
|
204
|
+
*
|
205
|
+
* @throws FileSystemException An error occured while examening the filesystem.
|
206
|
+
*/
|
207
|
+
string getPublicDirectory() {
|
208
|
+
if (!baseURIKnown) {
|
209
|
+
getBaseURI();
|
210
|
+
}
|
211
|
+
if (baseURI == NULL) {
|
212
|
+
return "";
|
213
|
+
}
|
214
|
+
|
215
|
+
const char *docRoot = ap_document_root(r);
|
216
|
+
size_t len = strlen(docRoot);
|
217
|
+
if (len > 0) {
|
218
|
+
string path;
|
219
|
+
if (docRoot[len - 1] == '/') {
|
220
|
+
path.assign(docRoot, len - 1);
|
221
|
+
} else {
|
222
|
+
path.assign(docRoot, len);
|
223
|
+
}
|
224
|
+
if (strcmp(baseURI, "/") != 0) {
|
225
|
+
path.append(baseURI);
|
226
|
+
}
|
227
|
+
return path;
|
228
|
+
} else {
|
229
|
+
return "";
|
230
|
+
}
|
231
|
+
}
|
232
|
+
|
233
|
+
/**
|
234
|
+
* Returns the application type that's associated with the HTTP request.
|
235
|
+
*
|
236
|
+
* @throws FileSystemException An error occured while examening the filesystem.
|
237
|
+
*/
|
238
|
+
ApplicationType getApplicationType() {
|
239
|
+
if (!baseURIKnown) {
|
240
|
+
getBaseURI();
|
241
|
+
}
|
242
|
+
return appType;
|
243
|
+
}
|
244
|
+
|
245
|
+
/**
|
246
|
+
* Returns the application type (as a string) that's associated
|
247
|
+
* with the HTTP request.
|
248
|
+
*
|
249
|
+
* @throws FileSystemException An error occured while examening the filesystem.
|
250
|
+
*/
|
251
|
+
const char *getApplicationTypeString() {
|
252
|
+
if (!baseURIKnown) {
|
253
|
+
getBaseURI();
|
254
|
+
}
|
255
|
+
switch (appType) {
|
256
|
+
case RAILS:
|
257
|
+
return "rails";
|
258
|
+
case RACK:
|
259
|
+
return "rack";
|
260
|
+
case WSGI:
|
261
|
+
return "wsgi";
|
262
|
+
default:
|
263
|
+
return NULL;
|
264
|
+
};
|
265
|
+
}
|
266
|
+
|
267
|
+
/**
|
268
|
+
* Returns the environment under which the application should be spawned.
|
269
|
+
*
|
270
|
+
* @throws FileSystemException An error occured while examening the filesystem.
|
271
|
+
*/
|
272
|
+
const char *getEnvironment() {
|
273
|
+
switch (getApplicationType()) {
|
274
|
+
case RAILS:
|
275
|
+
return config->getRailsEnv();
|
276
|
+
case RACK:
|
277
|
+
return config->getRackEnv();
|
278
|
+
default:
|
279
|
+
return "production";
|
280
|
+
}
|
281
|
+
}
|
282
|
+
};
|
283
|
+
|
284
|
+
} // namespace Passenger
|
285
|
+
|
286
|
+
#endif /* _PASSENGER_DIRECTORY_MAPPER_H_ */
|
287
|
+
|
data/ext/apache2/Exceptions.h
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
#ifndef _PASSENGER_EXCEPTIONS_H_
|
21
21
|
#define _PASSENGER_EXCEPTIONS_H_
|
22
22
|
|
23
|
-
#include <
|
23
|
+
#include <oxt/tracable_exception.hpp>
|
24
24
|
#include <string>
|
25
25
|
#include <sstream>
|
26
26
|
#include <cstring>
|
@@ -41,7 +41,7 @@ using namespace std;
|
|
41
41
|
*
|
42
42
|
* @ingroup Exceptions
|
43
43
|
*/
|
44
|
-
class SystemException: public
|
44
|
+
class SystemException: public oxt::tracable_exception {
|
45
45
|
private:
|
46
46
|
string briefMessage;
|
47
47
|
string systemMessage;
|
@@ -51,23 +51,22 @@ public:
|
|
51
51
|
/**
|
52
52
|
* Create a new SystemException.
|
53
53
|
*
|
54
|
-
* @param
|
54
|
+
* @param briefMessage A brief message describing the error.
|
55
55
|
* @param errorCode The error code, i.e. the value of errno right after the error occured.
|
56
56
|
* @note A system description of the error will be appended to the given message.
|
57
|
-
* For example, if <tt>errorCode</tt> is <tt>EBADF</tt>, and <tt>
|
57
|
+
* For example, if <tt>errorCode</tt> is <tt>EBADF</tt>, and <tt>briefMessage</tt>
|
58
58
|
* is <em>"Something happened"</em>, then what() will return <em>"Something happened: Bad
|
59
59
|
* file descriptor (10)"</em> (if 10 is the number for EBADF).
|
60
60
|
* @post code() == errorCode
|
61
|
-
* @post brief() ==
|
61
|
+
* @post brief() == briefMessage
|
62
62
|
*/
|
63
|
-
SystemException(const string &
|
63
|
+
SystemException(const string &briefMessage, int errorCode) {
|
64
64
|
stringstream str;
|
65
65
|
|
66
|
-
briefMessage = message;
|
67
66
|
str << strerror(errorCode) << " (" << errorCode << ")";
|
68
67
|
systemMessage = str.str();
|
69
68
|
|
70
|
-
|
69
|
+
setBriefMessage(briefMessage);
|
71
70
|
m_code = errorCode;
|
72
71
|
}
|
73
72
|
|
@@ -77,6 +76,11 @@ public:
|
|
77
76
|
return fullMessage.c_str();
|
78
77
|
}
|
79
78
|
|
79
|
+
void setBriefMessage(const string &message) {
|
80
|
+
briefMessage = message;
|
81
|
+
fullMessage = briefMessage + ": " + systemMessage;
|
82
|
+
}
|
83
|
+
|
80
84
|
/**
|
81
85
|
* The value of <tt>errno</tt> at the time the error occured.
|
82
86
|
*/
|
@@ -132,7 +136,7 @@ public:
|
|
132
136
|
*
|
133
137
|
* @ingroup Exceptions
|
134
138
|
*/
|
135
|
-
class IOException: public
|
139
|
+
class IOException: public oxt::tracable_exception {
|
136
140
|
private:
|
137
141
|
string msg;
|
138
142
|
public:
|
@@ -153,7 +157,7 @@ public:
|
|
153
157
|
/**
|
154
158
|
* Thrown when an invalid configuration is given.
|
155
159
|
*/
|
156
|
-
class ConfigurationException: public
|
160
|
+
class ConfigurationException: public oxt::tracable_exception {
|
157
161
|
private:
|
158
162
|
string msg;
|
159
163
|
public:
|
@@ -167,7 +171,7 @@ public:
|
|
167
171
|
* instance. The exception may contain an error page, which is a user-friendly
|
168
172
|
* HTML page with details about the error.
|
169
173
|
*/
|
170
|
-
class SpawnException: public
|
174
|
+
class SpawnException: public oxt::tracable_exception {
|
171
175
|
private:
|
172
176
|
string msg;
|
173
177
|
bool m_hasErrorPage;
|
@@ -203,12 +207,26 @@ public:
|
|
203
207
|
}
|
204
208
|
};
|
205
209
|
|
210
|
+
/**
|
211
|
+
* A generic runtime exception.
|
212
|
+
*
|
213
|
+
* @ingroup Exceptions
|
214
|
+
*/
|
215
|
+
class RuntimeException: public oxt::tracable_exception {
|
216
|
+
private:
|
217
|
+
string msg;
|
218
|
+
public:
|
219
|
+
RuntimeException(const string &message): msg(message) {}
|
220
|
+
virtual ~RuntimeException() throw() {}
|
221
|
+
virtual const char *what() const throw() { return msg.c_str(); }
|
222
|
+
};
|
223
|
+
|
206
224
|
/**
|
207
225
|
* The application pool is too busy and cannot fulfill a get() request.
|
208
226
|
*
|
209
227
|
* @ingroup Exceptions
|
210
228
|
*/
|
211
|
-
class BusyException: public
|
229
|
+
class BusyException: public oxt::tracable_exception {
|
212
230
|
private:
|
213
231
|
string msg;
|
214
232
|
public:
|
@@ -0,0 +1,108 @@
|
|
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_FILE_CHECKER_H_
|
21
|
+
#define _PASSENGER_FILE_CHECKER_H_
|
22
|
+
|
23
|
+
#include <string>
|
24
|
+
|
25
|
+
#include <oxt/system_calls.hpp>
|
26
|
+
|
27
|
+
#include <sys/stat.h>
|
28
|
+
#include <errno.h>
|
29
|
+
|
30
|
+
#include "CachedFileStat.h"
|
31
|
+
#include "SystemTime.h"
|
32
|
+
|
33
|
+
namespace Passenger {
|
34
|
+
|
35
|
+
using namespace std;
|
36
|
+
using namespace oxt;
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Utility class for checking for file changes. Example:
|
40
|
+
*
|
41
|
+
* @code
|
42
|
+
* FileChecker checker("foo.txt");
|
43
|
+
* checker.changed(); // false
|
44
|
+
* writeToFile("foo.txt");
|
45
|
+
* checker.changed(); // true
|
46
|
+
* checker.changed(); // false
|
47
|
+
* @endcode
|
48
|
+
*
|
49
|
+
* FileChecker uses stat() to retrieve file information. FileChecker also
|
50
|
+
* supports throttling in order to limit the number of stat() calls. This
|
51
|
+
* can improve performance on systems where disk I/O is a problem.
|
52
|
+
*/
|
53
|
+
class FileChecker {
|
54
|
+
private:
|
55
|
+
CachedFileStat cstat;
|
56
|
+
time_t lastMtime;
|
57
|
+
time_t lastCtime;
|
58
|
+
|
59
|
+
public:
|
60
|
+
/**
|
61
|
+
* Create a FileChecker object.
|
62
|
+
*
|
63
|
+
* @param filename The filename to check for.
|
64
|
+
*/
|
65
|
+
FileChecker(const string &filename)
|
66
|
+
: cstat(filename)
|
67
|
+
{
|
68
|
+
lastMtime = 0;
|
69
|
+
lastCtime = 0;
|
70
|
+
changed();
|
71
|
+
}
|
72
|
+
|
73
|
+
/**
|
74
|
+
* Checks whether the file's timestamp has changed or has been created
|
75
|
+
* or removed since the last call to changed().
|
76
|
+
*
|
77
|
+
* @param throttleRate When set to a non-zero value, throttling will be
|
78
|
+
* enabled. stat() will be called at most once per
|
79
|
+
* throttleRate seconds.
|
80
|
+
* @throws SystemException Something went wrong.
|
81
|
+
* @throws boost::thread_interrupted
|
82
|
+
*/
|
83
|
+
bool changed(unsigned int throttleRate = 0) {
|
84
|
+
int ret;
|
85
|
+
time_t ctime, mtime;
|
86
|
+
bool result;
|
87
|
+
|
88
|
+
do {
|
89
|
+
ret = cstat.refresh(throttleRate);
|
90
|
+
} while (ret == -1 && errno == EINTR);
|
91
|
+
|
92
|
+
if (ret == -1) {
|
93
|
+
ctime = 0;
|
94
|
+
mtime = 0;
|
95
|
+
} else {
|
96
|
+
ctime = cstat.info.st_ctime;
|
97
|
+
mtime = cstat.info.st_mtime;
|
98
|
+
}
|
99
|
+
result = lastMtime != mtime || lastCtime != ctime;
|
100
|
+
lastMtime = mtime;
|
101
|
+
lastCtime = ctime;
|
102
|
+
return result;
|
103
|
+
}
|
104
|
+
};
|
105
|
+
|
106
|
+
} // namespace Passenger
|
107
|
+
|
108
|
+
#endif /* _PASSENGER_FILE_CHECKER_H_ */
|