passenger 2.2.7 → 2.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. data/NEWS +40 -0
  2. data/Rakefile +1 -1
  3. data/bin/passenger-install-apache2-module +1 -0
  4. data/bin/passenger-install-nginx-module +2 -0
  5. data/doc/Architectural overview.html +173 -138
  6. data/doc/Security of user switching support.html +147 -109
  7. data/doc/Users guide Apache.html +4 -43
  8. data/doc/Users guide Nginx.html +4 -43
  9. data/doc/cxxapi/Bucket_8h-source.html +1 -1
  10. data/doc/cxxapi/Configuration_8h-source.html +1 -1
  11. data/doc/cxxapi/DirectoryMapper_8h-source.html +1 -1
  12. data/doc/cxxapi/Hooks_8h-source.html +1 -1
  13. data/doc/cxxapi/annotated.html +1 -1
  14. data/doc/cxxapi/classHooks-members.html +1 -1
  15. data/doc/cxxapi/classHooks.html +1 -1
  16. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +1 -1
  17. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +1 -1
  18. data/doc/cxxapi/classes.html +1 -1
  19. data/doc/cxxapi/definitions_8h-source.html +1 -1
  20. data/doc/cxxapi/files.html +1 -1
  21. data/doc/cxxapi/functions.html +1 -1
  22. data/doc/cxxapi/functions_func.html +1 -1
  23. data/doc/cxxapi/graph_legend.html +1 -1
  24. data/doc/cxxapi/group__Configuration.html +1 -1
  25. data/doc/cxxapi/group__Core.html +1 -1
  26. data/doc/cxxapi/group__Hooks.html +1 -1
  27. data/doc/cxxapi/group__Support.html +1 -1
  28. data/doc/cxxapi/main.html +1 -1
  29. data/doc/cxxapi/modules.html +1 -1
  30. data/doc/rdoc/classes/GC.html +4 -4
  31. data/doc/rdoc/classes/PhusionPassenger.html +2 -1
  32. data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +8 -8
  33. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +26 -26
  34. data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +98 -98
  35. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +61 -61
  36. data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +4 -4
  37. data/doc/rdoc/classes/PhusionPassenger/Application.html +14 -14
  38. data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +12 -12
  39. data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +4 -4
  40. data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +12 -12
  41. data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +5 -5
  42. data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +42 -42
  43. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +33 -33
  44. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +59 -59
  45. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +3 -3
  46. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +7 -7
  47. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +23 -23
  48. data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +4 -4
  49. data/doc/rdoc/classes/PhusionPassenger/Utils.html +2 -0
  50. data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +16 -16
  51. data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +4 -4
  52. data/doc/rdoc/classes/PlatformInfo.html +1 -1
  53. data/doc/rdoc/classes/Signal.html +23 -15
  54. data/doc/rdoc/created.rid +1 -1
  55. data/doc/rdoc/files/DEVELOPERS_TXT.html +1 -1
  56. data/doc/rdoc/files/README.html +1 -1
  57. data/doc/rdoc/files/ext/phusion_passenger/native_support_c.html +1 -1
  58. data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +1 -1
  59. data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +1 -1
  60. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +1 -1
  61. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +1 -1
  62. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +1 -1
  63. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +1 -1
  64. data/doc/rdoc/files/lib/phusion_passenger/application_rb.html +1 -1
  65. data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +1 -1
  66. data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +1 -1
  67. data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +1 -1
  68. data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +1 -1
  69. data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +1 -1
  70. data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +1 -1
  71. data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +1 -1
  72. data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +1 -1
  73. data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +1 -1
  74. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +2 -2
  75. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +2 -2
  76. data/doc/rdoc/files/lib/phusion_passenger/railz/application_spawner_rb.html +1 -1
  77. data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +1 -1
  78. data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +1 -1
  79. data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +1 -1
  80. data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +1 -1
  81. data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +1 -1
  82. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +9 -9
  83. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +1 -1
  84. data/doc/rdoc/files/misc/rake/extensions_rb.html +1 -1
  85. data/doc/rdoc/fr_class_index.html +2 -0
  86. data/doc/rdoc/fr_file_index.html +1 -0
  87. data/doc/rdoc/fr_method_index.html +79 -72
  88. data/ext/apache2/Hooks.cpp +4 -2
  89. data/ext/common/StandardApplicationPool.h +4 -2
  90. data/ext/common/Version.h +1 -1
  91. data/ext/nginx/Configuration.c +1 -1
  92. data/ext/oxt/system_calls.cpp +11 -0
  93. data/ext/oxt/system_calls.hpp +2 -1
  94. data/ext/oxt/thread.hpp +97 -1
  95. data/lib/phusion_passenger/constants.rb +1 -1
  96. data/lib/phusion_passenger/dependencies.rb +32 -0
  97. data/lib/phusion_passenger/platform_info.rb +1 -1
  98. data/lib/phusion_passenger/rack/application_spawner.rb +4 -4
  99. data/lib/phusion_passenger/rack/request_handler.rb +2 -5
  100. data/lib/phusion_passenger/railz/application_spawner.rb +13 -2
  101. data/lib/phusion_passenger/utils.rb +12 -4
  102. data/{vendor/rack-1.0.0-git/lib/rack → lib/phusion_passenger/utils}/rewindable_input.rb +19 -3
  103. data/test/ApplicationPoolTest.cpp +1 -1
  104. metadata +13 -59
  105. data/vendor/README +0 -13
  106. data/vendor/README_FOR_PACKAGERS +0 -1
  107. data/vendor/rack-1.0.0-git/COPYING +0 -18
  108. data/vendor/rack-1.0.0-git/KNOWN-ISSUES +0 -18
  109. data/vendor/rack-1.0.0-git/README +0 -353
  110. data/vendor/rack-1.0.0-git/Rakefile +0 -164
  111. data/vendor/rack-1.0.0-git/lib/rack.rb +0 -90
  112. data/vendor/rack-1.0.0-git/lib/rack/adapter/camping.rb +0 -22
  113. data/vendor/rack-1.0.0-git/lib/rack/auth/abstract/handler.rb +0 -37
  114. data/vendor/rack-1.0.0-git/lib/rack/auth/abstract/request.rb +0 -37
  115. data/vendor/rack-1.0.0-git/lib/rack/auth/basic.rb +0 -58
  116. data/vendor/rack-1.0.0-git/lib/rack/auth/digest/md5.rb +0 -124
  117. data/vendor/rack-1.0.0-git/lib/rack/auth/digest/nonce.rb +0 -51
  118. data/vendor/rack-1.0.0-git/lib/rack/auth/digest/params.rb +0 -55
  119. data/vendor/rack-1.0.0-git/lib/rack/auth/digest/request.rb +0 -40
  120. data/vendor/rack-1.0.0-git/lib/rack/auth/openid.rb +0 -487
  121. data/vendor/rack-1.0.0-git/lib/rack/builder.rb +0 -63
  122. data/vendor/rack-1.0.0-git/lib/rack/cascade.rb +0 -41
  123. data/vendor/rack-1.0.0-git/lib/rack/chunked.rb +0 -49
  124. data/vendor/rack-1.0.0-git/lib/rack/commonlogger.rb +0 -52
  125. data/vendor/rack-1.0.0-git/lib/rack/conditionalget.rb +0 -47
  126. data/vendor/rack-1.0.0-git/lib/rack/content_length.rb +0 -29
  127. data/vendor/rack-1.0.0-git/lib/rack/content_type.rb +0 -23
  128. data/vendor/rack-1.0.0-git/lib/rack/deflater.rb +0 -96
  129. data/vendor/rack-1.0.0-git/lib/rack/directory.rb +0 -153
  130. data/vendor/rack-1.0.0-git/lib/rack/file.rb +0 -88
  131. data/vendor/rack-1.0.0-git/lib/rack/handler.rb +0 -69
  132. data/vendor/rack-1.0.0-git/lib/rack/handler/cgi.rb +0 -61
  133. data/vendor/rack-1.0.0-git/lib/rack/handler/evented_mongrel.rb +0 -8
  134. data/vendor/rack-1.0.0-git/lib/rack/handler/fastcgi.rb +0 -88
  135. data/vendor/rack-1.0.0-git/lib/rack/handler/lsws.rb +0 -55
  136. data/vendor/rack-1.0.0-git/lib/rack/handler/mongrel.rb +0 -84
  137. data/vendor/rack-1.0.0-git/lib/rack/handler/scgi.rb +0 -59
  138. data/vendor/rack-1.0.0-git/lib/rack/handler/swiftiplied_mongrel.rb +0 -8
  139. data/vendor/rack-1.0.0-git/lib/rack/handler/thin.rb +0 -18
  140. data/vendor/rack-1.0.0-git/lib/rack/handler/webrick.rb +0 -67
  141. data/vendor/rack-1.0.0-git/lib/rack/head.rb +0 -19
  142. data/vendor/rack-1.0.0-git/lib/rack/lint.rb +0 -537
  143. data/vendor/rack-1.0.0-git/lib/rack/lobster.rb +0 -65
  144. data/vendor/rack-1.0.0-git/lib/rack/lock.rb +0 -16
  145. data/vendor/rack-1.0.0-git/lib/rack/methodoverride.rb +0 -27
  146. data/vendor/rack-1.0.0-git/lib/rack/mime.rb +0 -204
  147. data/vendor/rack-1.0.0-git/lib/rack/mock.rb +0 -184
  148. data/vendor/rack-1.0.0-git/lib/rack/recursive.rb +0 -57
  149. data/vendor/rack-1.0.0-git/lib/rack/reloader.rb +0 -106
  150. data/vendor/rack-1.0.0-git/lib/rack/request.rb +0 -248
  151. data/vendor/rack-1.0.0-git/lib/rack/response.rb +0 -183
  152. data/vendor/rack-1.0.0-git/lib/rack/session/abstract/id.rb +0 -142
  153. data/vendor/rack-1.0.0-git/lib/rack/session/cookie.rb +0 -91
  154. data/vendor/rack-1.0.0-git/lib/rack/session/memcache.rb +0 -109
  155. data/vendor/rack-1.0.0-git/lib/rack/session/pool.rb +0 -100
  156. data/vendor/rack-1.0.0-git/lib/rack/showexceptions.rb +0 -349
  157. data/vendor/rack-1.0.0-git/lib/rack/showstatus.rb +0 -106
  158. data/vendor/rack-1.0.0-git/lib/rack/static.rb +0 -38
  159. data/vendor/rack-1.0.0-git/lib/rack/urlmap.rb +0 -55
  160. data/vendor/rack-1.0.0-git/lib/rack/utils.rb +0 -522
@@ -175,8 +175,10 @@ private:
175
175
  env_arr = apr_table_elts(r->subprocess_env);
176
176
  env_entries = (apr_table_entry_t *) env_arr->elts;
177
177
  for (int i = 0; i < env_arr->nelts; ++i) {
178
- result->push_back(env_entries[i].key);
179
- result->push_back(env_entries[i].val);
178
+ if (env_entries[i].key != NULL && env_entries[i].val != NULL) {
179
+ result->push_back(env_entries[i].key);
180
+ result->push_back(env_entries[i].val);
181
+ }
180
182
  }
181
183
  return result;
182
184
  }
@@ -34,6 +34,7 @@
34
34
 
35
35
  #include <oxt/system_calls.hpp>
36
36
  #include <oxt/backtrace.hpp>
37
+ #include <oxt/thread.hpp>
37
38
 
38
39
  #include <string>
39
40
  #include <sstream>
@@ -242,7 +243,7 @@ private:
242
243
  SpawnManager spawnManager;
243
244
  #endif
244
245
  SharedDataPtr data;
245
- boost::thread *cleanerThread;
246
+ oxt::thread *cleanerThread;
246
247
  bool detached;
247
248
  bool done;
248
249
  unsigned int maxIdleTime;
@@ -632,8 +633,9 @@ public:
632
633
  waitingOnGlobalQueue = 0;
633
634
  maxPerApp = DEFAULT_MAX_INSTANCES_PER_APP;
634
635
  maxIdleTime = DEFAULT_MAX_IDLE_TIME;
635
- cleanerThread = new boost::thread(
636
+ cleanerThread = new oxt::thread(
636
637
  bind(&StandardApplicationPool::cleanerThreadMainLoop, this),
638
+ "ApplicationPool cleaner",
637
639
  CLEANER_THREAD_STACK_SIZE
638
640
  );
639
641
  }
@@ -26,6 +26,6 @@
26
26
  #define _PASSENGER_VERSION_H_
27
27
 
28
28
  /* Don't forget to update lib/phusion_passenger/constants.rb too. */
29
- #define PASSENGER_VERSION "2.2.7"
29
+ #define PASSENGER_VERSION "2.2.8"
30
30
 
31
31
  #endif /* _PASSENGER_VERSION_H */
@@ -194,7 +194,7 @@ passenger_create_loc_conf(ngx_conf_t *cf)
194
194
  DEFINE_VAR_TO_PASS("SCGI", "1");
195
195
  DEFINE_VAR_TO_PASS("QUERY_STRING", "$query_string");
196
196
  DEFINE_VAR_TO_PASS("REQUEST_METHOD", "$request_method");
197
- DEFINE_VAR_TO_PASS("REQUEST_URI", "$request_uri");
197
+ DEFINE_VAR_TO_PASS("REQUEST_URI", "$uri$is_args$args");
198
198
  DEFINE_VAR_TO_PASS("SERVER_PROTOCOL", "$server_protocol");
199
199
  DEFINE_VAR_TO_PASS("SERVER_SOFTWARE", "nginx/$nginx_version");
200
200
  DEFINE_VAR_TO_PASS("REMOTE_ADDR", "$remote_addr");
@@ -42,8 +42,19 @@ interruption_signal_handler(int sig) {
42
42
  void
43
43
  oxt::setup_syscall_interruption_support() {
44
44
  struct sigaction action;
45
+ sigset_t signal_set;
45
46
  int ret;
46
47
 
48
+ /* Very important! The signal mask is inherited across fork()
49
+ * and exec() and we don't know what the parent process did to
50
+ * us. At least on OS X, having a signal mask blocking important
51
+ * signals can lead to stuff like waitpid() malfunction.
52
+ */
53
+ sigemptyset(&signal_set);
54
+ do {
55
+ ret = sigprocmask(SIG_SETMASK, &signal_set, NULL);
56
+ } while (ret == -1 && errno == EINTR);
57
+
47
58
  action.sa_handler = interruption_signal_handler;
48
59
  action.sa_flags = 0;
49
60
  sigemptyset(&action.sa_mask);
@@ -102,7 +102,8 @@ namespace oxt {
102
102
  * Setup system call interruption support.
103
103
  * This function may only be called once. It installs a signal handler
104
104
  * for INTERRUPTION_SIGNAL, so one should not install a different signal
105
- * handler for that signal after calling this function.
105
+ * handler for that signal after calling this function. It also resets
106
+ * the process signal mask.
106
107
  *
107
108
  * @warning
108
109
  * After oxt::setup_syscall_interruption_support() is called, sending a signal
@@ -34,6 +34,9 @@
34
34
  #ifdef OXT_BACKTRACE_IS_ENABLED
35
35
  #include <sstream>
36
36
  #endif
37
+ #include <string>
38
+ #include <list>
39
+ #include <unistd.h>
37
40
  #include <limits.h> // for PTHREAD_STACK_MIN
38
41
 
39
42
  namespace oxt {
@@ -132,17 +135,45 @@ public:
132
135
  set_thread_main_function(boost::bind(thread_main, func, data));
133
136
 
134
137
  unsigned long min_stack_size;
138
+ bool stack_min_size_defined;
139
+ bool round_stack_size;
140
+
135
141
  #ifdef PTHREAD_STACK_MIN
136
142
  // PTHREAD_STACK_MIN may not be a constant macro so we need
137
143
  // to evaluate it dynamically.
138
144
  min_stack_size = PTHREAD_STACK_MIN;
145
+ stack_min_size_defined = true;
139
146
  #else
140
147
  // Assume minimum stack size is 128 KB.
141
148
  min_stack_size = 128 * 1024;
149
+ stack_min_size_defined = false;
142
150
  #endif
143
- if (stack_size < min_stack_size) {
151
+ if (stack_size != 0 && stack_size < min_stack_size) {
144
152
  stack_size = min_stack_size;
153
+ round_stack_size = !stack_min_size_defined;
154
+ } else {
155
+ round_stack_size = true;
156
+ }
157
+
158
+ if (round_stack_size) {
159
+ // Round stack size up to page boundary.
160
+ long page_size;
161
+ #if defined(_SC_PAGESIZE)
162
+ page_size = sysconf(_SC_PAGESIZE);
163
+ #elif defined(_SC_PAGE_SIZE)
164
+ page_size = sysconf(_SC_PAGE_SIZE);
165
+ #elif defined(PAGESIZE)
166
+ page_size = sysconf(PAGESIZE);
167
+ #elif defined(PAGE_SIZE)
168
+ page_size = sysconf(PAGE_SIZE);
169
+ #else
170
+ page_size = getpagesize();
171
+ #endif
172
+ if (stack_size % page_size != 0) {
173
+ stack_size = stack_size - (stack_size % page_size) + page_size;
174
+ }
145
175
  }
176
+
146
177
  start_thread(stack_size);
147
178
  }
148
179
 
@@ -231,6 +262,71 @@ public:
231
262
  done = timed_join(boost::posix_time::millisec(10));
232
263
  }
233
264
  }
265
+
266
+ /**
267
+ * Keep interrupting the thread until it's done, then join it.
268
+ * This method will keep trying for at most <em>timeout</em> milliseconds.
269
+ *
270
+ * @param timeout The maximum number of milliseconds that this method
271
+ * should keep trying.
272
+ * @return True if the thread was successfully joined, false if the
273
+ * timeout has been reached.
274
+ * @throws boost::thread_interrupted The calling thread has been
275
+ * interrupted before we could join this thread.
276
+ */
277
+ bool interrupt_and_join(unsigned int timeout) {
278
+ bool joined = false, timed_out = false;
279
+ boost::posix_time::ptime deadline =
280
+ boost::posix_time::microsec_clock::local_time() +
281
+ boost::posix_time::millisec(timeout);
282
+ while (!joined && !timed_out) {
283
+ interrupt();
284
+ joined = timed_join(boost::posix_time::millisec(10));
285
+ timed_out = !joined && boost::posix_time::microsec_clock::local_time() > deadline;
286
+ }
287
+ return joined;
288
+ }
289
+
290
+ /**
291
+ * Interrupt and join multiple threads in a way that's more efficient than calling
292
+ * interrupt_and_join() on each thread individually. It iterates over all threads,
293
+ * interrupts each one without joining it, then waits until at least one thread
294
+ * is joinable. This is repeated until all threads are joined.
295
+ *
296
+ * @param threads An array of threads to join.
297
+ * @param size The number of elements in <em>threads</em>.
298
+ * @throws boost::thread_interrupted The calling thread has been
299
+ * interrupted before all threads have been joined. Some threads
300
+ * may have been successfully joined while others haven't.
301
+ */
302
+ static void interrupt_and_join_multiple(oxt::thread **threads, unsigned int size) {
303
+ std::list<oxt::thread *> remaining_threads;
304
+ std::list<oxt::thread *>::iterator it, current;
305
+ oxt::thread *thread;
306
+ unsigned int i;
307
+
308
+ for (i = 0; i < size; i++) {
309
+ remaining_threads.push_back(threads[i]);
310
+ }
311
+
312
+ while (!remaining_threads.empty()) {
313
+ for (it = remaining_threads.begin(); it != remaining_threads.end(); it++) {
314
+ thread = *it;
315
+ thread->interrupt();
316
+ }
317
+ for (it = remaining_threads.begin(); it != remaining_threads.end(); it++) {
318
+ thread = *it;
319
+ if (thread->timed_join(boost::posix_time::millisec(0))) {
320
+ current = it;
321
+ it--;
322
+ remaining_threads.erase(current);
323
+ }
324
+ }
325
+ if (!remaining_threads.empty()) {
326
+ syscalls::usleep(10000);
327
+ }
328
+ }
329
+ }
234
330
  };
235
331
 
236
332
  } // namespace oxt
@@ -24,7 +24,7 @@
24
24
  module PhusionPassenger
25
25
  # Phusion Passenger version number.
26
26
  # Don't forget to edit ext/common/Version.h too.
27
- VERSION_STRING = '2.2.7'
27
+ VERSION_STRING = '2.2.8'
28
28
 
29
29
  DEFAULT_FRAMEWORK_SPAWNER_MAX_IDLE_TIME = 30 * 60
30
30
  DEFAULT_APP_SPAWNER_MAX_IDLE_TIME = 10 * 60
@@ -357,6 +357,38 @@ module Dependencies # :nodoc: all
357
357
  dep.install_instructions = "Please install RubyGems first, then run <b>#{PlatformInfo::GEM || "gem"} install rack</b>"
358
358
  end
359
359
 
360
+ OpenSSL_Dev = Dependency.new do |dep|
361
+ dep.name = "OpenSSL development headers"
362
+ dep.define_checker do |result|
363
+ source_file = '/tmp/passenger-openssl-check.c'
364
+ object_file = '/tmp/passenger-openssl-check.o'
365
+ begin
366
+ File.open(source_file, 'w') do |f|
367
+ f.write("#include <openssl/ssl.h>")
368
+ end
369
+ Dir.chdir(File.dirname(source_file)) do
370
+ if system("(gcc #{ENV['CFLAGS']} -c '#{source_file}') >/dev/null 2>/dev/null")
371
+ result.found
372
+ else
373
+ result.not_found
374
+ end
375
+ end
376
+ ensure
377
+ File.unlink(source_file) rescue nil
378
+ File.unlink(object_file) rescue nil
379
+ end
380
+ end
381
+ if RUBY_PLATFORM =~ /linux/
382
+ tags = PlatformInfo.linux_distro_tags
383
+ if tags.include?(:debian)
384
+ dep.install_command = "apt-get install libssl-dev"
385
+ elsif tags.include?(:redhat)
386
+ dep.install_command = "yum install openssl-devel"
387
+ end
388
+ end
389
+ dep.website = "http://www.openssl.org/"
390
+ end
391
+
360
392
  Zlib_Dev = Dependency.new do |dep|
361
393
  dep.name = "Zlib development headers"
362
394
  dep.define_checker do |result|
@@ -346,7 +346,7 @@ public
346
346
  flags << '-DBOOST_HAS_STDINT_H -D_GLIBCPP__PTHREADS'
347
347
  elsif RUBY_PLATFORM =~ /aix/
348
348
  flags << '-DOXT_DISABLE_BACKTRACES'
349
- elsif RUBY_PLATFORM =~ /(sparc-linux|arm-linux)/
349
+ elsif RUBY_PLATFORM =~ /(sparc-linux|arm-linux|sh4-linux)/
350
350
  # http://code.google.com/p/phusion-passenger/issues/detail?id=200
351
351
  # http://groups.google.com/group/phusion-passenger/t/6b904a962ee28e5c
352
352
  flags << '-DBOOST_SP_USE_PTHREADS'
@@ -21,10 +21,6 @@
21
21
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
22
  # THE SOFTWARE.
23
23
 
24
- rack_dir = File.expand_path(File.dirname(__FILE__) + "/../../../vendor/rack-1.0.0-git/lib")
25
- $LOAD_PATH.unshift(rack_dir) if !$LOAD_PATH.include?(rack_dir)
26
- require 'rack'
27
-
28
24
  require 'socket'
29
25
  require 'phusion_passenger/application'
30
26
  require 'phusion_passenger/events'
@@ -137,6 +133,10 @@ private
137
133
  end
138
134
 
139
135
  def load_rack_app
136
+ # Load Rack inside the spawned child process so that the spawn manager
137
+ # itself doesn't preload Rack. This is necessary because some broken
138
+ # Rails apps explicitly specify a Rack version as dependency.
139
+ require 'rack'
140
140
  rackup_code = ::File.read("config.ru")
141
141
  eval("Rack::Builder.new {( #{rackup_code}\n )}.to_app", TOPLEVEL_BINDING, "config.ru")
142
142
  end
@@ -22,11 +22,8 @@
22
22
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
23
  # THE SOFTWARE.
24
24
 
25
- rack_dir = File.expand_path(File.dirname(__FILE__) + "/../../../vendor/rack-1.0.0-git/lib")
26
- $LOAD_PATH.unshift(rack_dir) if !$LOAD_PATH.include?(rack_dir)
27
- require 'rack/rewindable_input'
28
-
29
25
  require 'phusion_passenger/abstract_request_handler'
26
+ require 'phusion_passenger/utils/rewindable_input'
30
27
 
31
28
  module PhusionPassenger
32
29
  module Rack
@@ -64,7 +61,7 @@ class RequestHandler < AbstractRequestHandler
64
61
  protected
65
62
  # Overrided method.
66
63
  def process_request(env, input, output)
67
- rewindable_input = ::Rack::RewindableInput.new(input)
64
+ rewindable_input = Utils::RewindableInput.new(input)
68
65
  begin
69
66
  env[RACK_VERSION] = RACK_VERSION_VALUE
70
67
  env[RACK_INPUT] = rewindable_input
@@ -307,10 +307,21 @@ private
307
307
  if !defined?(Dispatcher)
308
308
  require 'dispatcher'
309
309
  end
310
+ # Rails 2.2+ uses application_controller.rb while older versions use application.rb.
310
311
  begin
311
312
  require_dependency 'application_controller'
312
- rescue LoadError
313
- require_dependency 'application'
313
+ rescue LoadError => e
314
+ begin
315
+ require_dependency 'application'
316
+ rescue LoadError
317
+ # Considering that most apps these das are written in Rails
318
+ # 2.2+, if application.rb cannot be loaded either then it
319
+ # probably just means that application_controller.rb threw
320
+ # a LoadError. So we raise the original error here; if the
321
+ # app is based on Rails < 2.2 then the error will make less
322
+ # sense but we can only choose one or the other.
323
+ raise e
324
+ end
314
325
  end
315
326
 
316
327
  # - No point in preloading the application sources if the garbage collector
@@ -559,7 +559,6 @@ module Signal
559
559
  result = Signal.list
560
560
  result.delete("ALRM")
561
561
  result.delete("VTALRM")
562
- return result
563
562
  when "jruby"
564
563
  result = Signal.list
565
564
  result.delete("QUIT")
@@ -567,12 +566,21 @@ module Signal
567
566
  result.delete("FPE")
568
567
  result.delete("KILL")
569
568
  result.delete("SEGV")
570
- result.delete("STOP")
571
569
  result.delete("USR1")
572
- return result
573
570
  else
574
- return Signal.list
571
+ result = Signal.list
575
572
  end
573
+
574
+ # Don't touch SIGCHLD no matter what! On OS X waitpid() will
575
+ # malfunction if SIGCHLD doesn't have a correct handler.
576
+ result.delete("CLD")
577
+ result.delete("CHLD")
578
+
579
+ # Other stuff that we don't want to trap no matter which
580
+ # Ruby engine.
581
+ result.delete("STOP")
582
+
583
+ return result
576
584
  end
577
585
  end
578
586
 
@@ -1,6 +1,10 @@
1
+ # Modified version of Rack::RewindableInput with Ruby 1.9 fix.
2
+
1
3
  require 'tempfile'
2
4
 
3
- module Rack
5
+ module PhusionPassenger
6
+ module Utils
7
+
4
8
  # Class which can make any IO object rewindable, including non-rewindable ones. It does
5
9
  # this by buffering the data into a tempfile, which is rewindable.
6
10
  #
@@ -74,7 +78,7 @@ module Rack
74
78
  @rewindable_io.chmod(0000)
75
79
  @rewindable_io.set_encoding(Encoding::BINARY) if @rewindable_io.respond_to?(:set_encoding)
76
80
  @rewindable_io.binmode
77
- if filesystem_has_posix_semantics?
81
+ if filesystem_has_posix_semantics? && !tempfile_unlink_contains_bug?
78
82
  @rewindable_io.unlink
79
83
  @unlinked = true
80
84
  end
@@ -96,5 +100,17 @@ module Rack
96
100
  def filesystem_has_posix_semantics?
97
101
  RUBY_PLATFORM !~ /(mswin|mingw|cygwin|java)/
98
102
  end
103
+
104
+ def tempfile_unlink_contains_bug?
105
+ # The tempfile library as included in Ruby 1.9.1-p152 and later
106
+ # contains a bug: unlinking an open Tempfile object also closes
107
+ # it, which breaks our expected POSIX semantics. This problem
108
+ # has been fixed in Ruby 1.9.2, but the Ruby team chose not to
109
+ # include the bug fix in later versions of the 1.9.1 series.
110
+ ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
111
+ ruby_engine == "ruby" && RUBY_VERSION == "1.9.1" && RUBY_PATCHLEVEL >= 152
112
+ end
99
113
  end
100
- end
114
+
115
+ end # module Utils
116
+ end # module PhusionPassenger
@@ -182,7 +182,7 @@
182
182
  Application::SessionPtr session3;
183
183
  bool done;
184
184
 
185
- shared_ptr<thread> thr = ptr(new thread(PoolWaitTestThread(pool2, session3, done)));
185
+ shared_ptr<boost::thread> thr = ptr(new boost::thread(PoolWaitTestThread(pool2, session3, done)));
186
186
  usleep(500000);
187
187
  ensure("ApplicationPool is still waiting", !done);
188
188
  ensure_equals(pool->getActive(), 2u);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: passenger
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.7
4
+ version: 2.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phusion - http://www.phusion.nl/
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-18 00:00:00 +01:00
12
+ date: 2009-12-15 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -32,6 +32,16 @@ dependencies:
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.0.1
34
34
  version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: rack
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
35
45
  description: Passenger is an Apache module for Ruby on Rails support.
36
46
  email: info@phusion.nl
37
47
  executables:
@@ -78,6 +88,7 @@ files:
78
88
  - lib/phusion_passenger/railz/request_handler.rb
79
89
  - lib/phusion_passenger/simple_benchmarking.rb
80
90
  - lib/phusion_passenger/spawn_manager.rb
91
+ - lib/phusion_passenger/utils/rewindable_input.rb
81
92
  - lib/phusion_passenger/utils.rb
82
93
  - lib/phusion_passenger/wsgi/application_spawner.rb
83
94
  - lib/phusion_passenger/wsgi/request_handler.py
@@ -1092,63 +1103,6 @@ files:
1092
1103
  - misc/rake/gempackagetask.rb
1093
1104
  - misc/rake/packagetask.rb
1094
1105
  - misc/rake/rdoctask.rb
1095
- - vendor/rack-1.0.0-git/COPYING
1096
- - vendor/rack-1.0.0-git/KNOWN-ISSUES
1097
- - vendor/rack-1.0.0-git/lib/rack/adapter/camping.rb
1098
- - vendor/rack-1.0.0-git/lib/rack/auth/abstract/handler.rb
1099
- - vendor/rack-1.0.0-git/lib/rack/auth/abstract/request.rb
1100
- - vendor/rack-1.0.0-git/lib/rack/auth/basic.rb
1101
- - vendor/rack-1.0.0-git/lib/rack/auth/digest/md5.rb
1102
- - vendor/rack-1.0.0-git/lib/rack/auth/digest/nonce.rb
1103
- - vendor/rack-1.0.0-git/lib/rack/auth/digest/params.rb
1104
- - vendor/rack-1.0.0-git/lib/rack/auth/digest/request.rb
1105
- - vendor/rack-1.0.0-git/lib/rack/auth/openid.rb
1106
- - vendor/rack-1.0.0-git/lib/rack/builder.rb
1107
- - vendor/rack-1.0.0-git/lib/rack/cascade.rb
1108
- - vendor/rack-1.0.0-git/lib/rack/chunked.rb
1109
- - vendor/rack-1.0.0-git/lib/rack/commonlogger.rb
1110
- - vendor/rack-1.0.0-git/lib/rack/conditionalget.rb
1111
- - vendor/rack-1.0.0-git/lib/rack/content_length.rb
1112
- - vendor/rack-1.0.0-git/lib/rack/content_type.rb
1113
- - vendor/rack-1.0.0-git/lib/rack/deflater.rb
1114
- - vendor/rack-1.0.0-git/lib/rack/directory.rb
1115
- - vendor/rack-1.0.0-git/lib/rack/file.rb
1116
- - vendor/rack-1.0.0-git/lib/rack/handler/cgi.rb
1117
- - vendor/rack-1.0.0-git/lib/rack/handler/evented_mongrel.rb
1118
- - vendor/rack-1.0.0-git/lib/rack/handler/fastcgi.rb
1119
- - vendor/rack-1.0.0-git/lib/rack/handler/lsws.rb
1120
- - vendor/rack-1.0.0-git/lib/rack/handler/mongrel.rb
1121
- - vendor/rack-1.0.0-git/lib/rack/handler/scgi.rb
1122
- - vendor/rack-1.0.0-git/lib/rack/handler/swiftiplied_mongrel.rb
1123
- - vendor/rack-1.0.0-git/lib/rack/handler/thin.rb
1124
- - vendor/rack-1.0.0-git/lib/rack/handler/webrick.rb
1125
- - vendor/rack-1.0.0-git/lib/rack/handler.rb
1126
- - vendor/rack-1.0.0-git/lib/rack/head.rb
1127
- - vendor/rack-1.0.0-git/lib/rack/lint.rb
1128
- - vendor/rack-1.0.0-git/lib/rack/lobster.rb
1129
- - vendor/rack-1.0.0-git/lib/rack/lock.rb
1130
- - vendor/rack-1.0.0-git/lib/rack/methodoverride.rb
1131
- - vendor/rack-1.0.0-git/lib/rack/mime.rb
1132
- - vendor/rack-1.0.0-git/lib/rack/mock.rb
1133
- - vendor/rack-1.0.0-git/lib/rack/recursive.rb
1134
- - vendor/rack-1.0.0-git/lib/rack/reloader.rb
1135
- - vendor/rack-1.0.0-git/lib/rack/request.rb
1136
- - vendor/rack-1.0.0-git/lib/rack/response.rb
1137
- - vendor/rack-1.0.0-git/lib/rack/rewindable_input.rb
1138
- - vendor/rack-1.0.0-git/lib/rack/session/abstract/id.rb
1139
- - vendor/rack-1.0.0-git/lib/rack/session/cookie.rb
1140
- - vendor/rack-1.0.0-git/lib/rack/session/memcache.rb
1141
- - vendor/rack-1.0.0-git/lib/rack/session/pool.rb
1142
- - vendor/rack-1.0.0-git/lib/rack/showexceptions.rb
1143
- - vendor/rack-1.0.0-git/lib/rack/showstatus.rb
1144
- - vendor/rack-1.0.0-git/lib/rack/static.rb
1145
- - vendor/rack-1.0.0-git/lib/rack/urlmap.rb
1146
- - vendor/rack-1.0.0-git/lib/rack/utils.rb
1147
- - vendor/rack-1.0.0-git/lib/rack.rb
1148
- - vendor/rack-1.0.0-git/Rakefile
1149
- - vendor/rack-1.0.0-git/README
1150
- - vendor/README
1151
- - vendor/README_FOR_PACKAGERS
1152
1106
  - test/ApplicationPoolServer_ApplicationPoolTest.cpp
1153
1107
  - test/ApplicationPoolServerTest.cpp
1154
1108
  - test/ApplicationPoolTest.cpp