Class: Puma::Events

Inherits:
Object
  • Object
show all
Includes:
Const
Defined in:
lib/puma/events.rb

Overview

The default implement of an event sink object used by Server for when certain kinds of events occur in the life of the server.

The methods available are the events that the Server fires.

Defined Under Namespace

Classes: DefaultFormatter, PidFormatter

Constant Summary collapse

DEFAULT =
new(STDOUT, STDERR)

Constants included from Const

Const::CGI_VER, Const::CHUNK_SIZE, Const::CLOSE, Const::CLOSE_CHUNKED, Const::CODE_NAME, Const::COLON, Const::CONNECTION_CLOSE, Const::CONNECTION_KEEP_ALIVE, Const::CONTENT_LENGTH, Const::CONTENT_LENGTH2, Const::CONTENT_LENGTH_S, Const::CONTENT_TYPE, Const::DATE, Const::ERROR_400_RESPONSE, Const::ERROR_404_RESPONSE, Const::ERROR_408_RESPONSE, Const::ERROR_500_RESPONSE, Const::ERROR_503_RESPONSE, Const::ETAG, Const::ETAG_FORMAT, Const::FAST_TRACK_KA_TIMEOUT, Const::FIRST_DATA_TIMEOUT, Const::GATEWAY_INTERFACE, Const::GET, Const::HALT_COMMAND, Const::HEAD, Const::HIJACK, Const::HIJACK_IO, Const::HIJACK_P, Const::HOST, Const::HTTP, Const::HTTPS, Const::HTTPS_KEY, Const::HTTP_10, Const::HTTP_10_200, Const::HTTP_11, Const::HTTP_11_200, Const::HTTP_CONNECTION, Const::HTTP_HOST, Const::HTTP_IF_MODIFIED_SINCE, Const::HTTP_IF_NONE_MATCH, Const::HTTP_VERSION, Const::HTTP_X_FORWARDED_FOR, Const::KEEP_ALIVE, Const::LAST_MODIFIED, Const::LINE_END, Const::LOCALHOST, Const::LOCALHOST_ADDR, Const::LOCALHOST_IP, Const::MAX_BODY, Const::MAX_HEADER, Const::NEWLINE, Const::PATH_INFO, Const::PERSISTENT_TIMEOUT, Const::PORT_443, Const::PORT_80, Const::PUMA_CONFIG, Const::PUMA_PEERCERT, Const::PUMA_SERVER_STRING, Const::PUMA_SOCKET, Const::PUMA_TMP_BASE, Const::PUMA_VERSION, Const::QUERY_STRING, Const::RACK_AFTER_REPLY, Const::RACK_INPUT, Const::RACK_URL_SCHEME, Const::REDIRECT, Const::REMOTE_ADDR, Const::REQUEST_METHOD, Const::REQUEST_PATH, Const::REQUEST_URI, Const::RESTART_COMMAND, Const::SCRIPT_NAME, Const::SERVER_NAME, Const::SERVER_PORT, Const::SERVER_PROTOCOL, Const::SERVER_SOFTWARE, Const::SHUTDOWN_GRACE_TIME, Const::SLASH, Const::STATUS_FORMAT, Const::STOP_COMMAND, Const::TRANSFER_ENCODING, Const::TRANSFER_ENCODING_CHUNKED, Const::WRITE_TIMEOUT

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(stdout, stderr) ⇒ Events

Create an Events object that prints to stdout and stderr.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/puma/events.rb', line 27

def initialize(stdout, stderr)
  @formatter = DefaultFormatter.new
  @stdout = stdout
  @stderr = stderr

  @stdout.sync = true
  @stderr.sync = true

  @debug = ENV.key? 'PUMA_DEBUG'

  @on_booted = []

  @hooks = Hash.new { |h,k| h[k] = [] }
end

Instance Attribute Details

#formatterObject

Returns the value of attribute formatter.



43
44
45
# File 'lib/puma/events.rb', line 43

def formatter
  @formatter
end

#stderrObject (readonly)

Returns the value of attribute stderr.



42
43
44
# File 'lib/puma/events.rb', line 42

def stderr
  @stderr
end

#stdoutObject (readonly)

Returns the value of attribute stdout.



42
43
44
# File 'lib/puma/events.rb', line 42

def stdout
  @stdout
end

Class Method Details

.nullObject



142
143
144
145
# File 'lib/puma/events.rb', line 142

def self.null
  n = NullIO.new
  Events.new n, n
end

.stdioObject



138
139
140
# File 'lib/puma/events.rb', line 138

def self.stdio
  Events.new $stdout, $stderr
end

.stringsObject

Returns an Events object which writes its status to 2 StringIO objects.



134
135
136
# File 'lib/puma/events.rb', line 134

def self.strings
  Events.new StringIO.new, StringIO.new
end

Instance Method Details

#debug(str) ⇒ Object



75
76
77
# File 'lib/puma/events.rb', line 75

def debug(str)
  log("% #{str}") if @debug
end

#error(str) ⇒ Object

Write str to @stderr



81
82
83
84
# File 'lib/puma/events.rb', line 81

def error(str)
  @stderr.puts format("ERROR: #{str}")
  exit 1
end

#fire(hook, *args) ⇒ Object

Fire callbacks for the named hook



47
48
49
# File 'lib/puma/events.rb', line 47

def fire(hook, *args)
  @hooks[hook].each { |t| t.call(*args) }
end

#fire_on_booted!Object



125
126
127
# File 'lib/puma/events.rb', line 125

def fire_on_booted!
  @on_booted.each { |b| b.call }
end

#format(str) ⇒ Object



86
87
88
# File 'lib/puma/events.rb', line 86

def format(str)
  formatter.call(str)
end

#log(str) ⇒ Object

Write str to @stdout



67
68
69
# File 'lib/puma/events.rb', line 67

def log(str)
  @stdout.puts format(str)
end

#on_booted(&b) ⇒ Object



121
122
123
# File 'lib/puma/events.rb', line 121

def on_booted(&b)
  @on_booted << b
end

#parse_error(server, env, error) ⇒ Object

An HTTP parse error has occurred. server is the Server object, env the request, and error a parsing exception.



94
95
96
97
# File 'lib/puma/events.rb', line 94

def parse_error(server, env, error)
  @stderr.puts "#{Time.now}: HTTP parse error, malformed request (#{env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR]}): #{error.inspect}"
  @stderr.puts "#{Time.now}: ENV: #{env.inspect}\n---\n"
end

#register(hook, obj = nil, &blk) ⇒ Object

Register a callbock for a given hook



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/puma/events.rb', line 53

def register(hook, obj=nil, &blk)
  if obj and blk
    raise "Specify either an object or a block, not both"
  end

  h = obj || blk

  @hooks[hook] << h

  h
end

#ssl_error(server, peeraddr, peercert, error) ⇒ Object

An SSL error has occurred. server is the Server object, peeraddr peer address, peercert any peer certificate (if present), and error an exception object.



103
104
105
106
# File 'lib/puma/events.rb', line 103

def ssl_error(server, peeraddr, peercert, error)
  subject = peercert ? peercert.subject : nil
  @stderr.puts "#{Time.now}: SSL error, peer: #{peeraddr}, peer cert: #{subject}, #{error.inspect}"
end

#unknown_error(server, error, kind = "Unknown") ⇒ Object

An unknown error has occurred. server is the Server object, env the request, error an exception object, and kind some additional info.



112
113
114
115
116
117
118
119
# File 'lib/puma/events.rb', line 112

def unknown_error(server, error, kind="Unknown")
  if error.respond_to? :render
    error.render "#{Time.now}: #{kind} error", @stderr
  else
    @stderr.puts "#{Time.now}: #{kind} error: #{error.inspect}"
    @stderr.puts error.backtrace.join("\n")
  end
end

#write(str) ⇒ Object



71
72
73
# File 'lib/puma/events.rb', line 71

def write(str)
  @stdout.write format(str)
end