Class: PhusionPassenger::WSGI::ApplicationSpawner

Inherits:
Object
  • Object
show all
Includes:
Utils
Defined in:
lib/phusion_passenger/wsgi/application_spawner.rb

Overview

Class for spawning WSGI applications.

Constant Summary collapse

REQUEST_HANDLER =
File.expand_path(File.dirname(__FILE__) + "/request_handler.py")

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.spawn_application(*args) ⇒ Object



36
37
38
39
# File 'lib/phusion_passenger/wsgi/application_spawner.rb', line 36

def self.spawn_application(*args)
	@@instance ||= ApplicationSpawner.new
	@@instance.spawn_application(*args)
end

Instance Method Details

#spawn_application(app_root, lower_privilege = true, lowest_user = "nobody", environment = "production") ⇒ Object

Spawn an instance of the given WSGI application. When successful, an Application object will be returned, which represents the spawned application.

Raises:

  • AppInitError: The WSGI application raised an exception or called exit() during startup.

  • SystemCallError, IOError, SocketError: Something went wrong.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/phusion_passenger/wsgi/application_spawner.rb', line 49

def spawn_application(app_root, lower_privilege = true, lowest_user = "nobody", environment = "production")
	a, b = UNIXSocket.pair
	pid = safe_fork(self.class.to_s, true) do
		a.close
		
		file_descriptors_to_leave_open = [0, 1, 2, b.fileno]
		NativeSupport.close_all_file_descriptors(file_descriptors_to_leave_open)
		close_all_io_objects_for_fds(file_descriptors_to_leave_open)
		
		run(MessageChannel.new(b), app_root, lower_privilege, lowest_user, environment)
	end
	b.close
	Process.waitpid(pid) rescue nil
	
	channel = MessageChannel.new(a)
	pid, socket_name, socket_type = channel.read
	if pid.nil?
		raise IOError, "Connection closed"
	end
	owner_pipe = channel.recv_io
	return Application.new(@app_root, pid, socket_name,
		socket_type, owner_pipe)
end