Module: AfterResponse

Defined in:
lib/after_response.rb,
lib/after_response/callbacks.rb,
lib/after_response/adapters/unicorn_middleware.rb

Defined Under Namespace

Modules: Adapters, Callbacks

Constant Summary collapse

CONTAINER_ADAPTERS =
[
  OpenStruct.new(
    :name => :passenger3,
    :test => lambda{ defined?(PhusionPassenger) && PhusionPassenger::AbstractRequestHandler.private_instance_methods.include?("accept_and_process_next_request") },
    :lib  => 'after_response/adapters/passenger3'
  ),
  OpenStruct.new(
    :name => :passenger2,
    # This has only been tested on 2.2.14 and 2.2.15. Other 2.2.x might work if the main_loop method is unchanged.
    :test => lambda{ defined?(PhusionPassenger) && ['2.2.14', '2.2.15'].include?(PhusionPassenger::VERSION_STRING) },
    :lib  => 'after_response/adapters/passenger2_2'
  ),
  OpenStruct.new(
    :name => :unicorn_middleware,
    # TODO: Find a more general non-Rails-specific way of inspecting installed middleware
    :test => lambda{ 
                     defined?(Unicorn) &&
                     defined?(Rails)   &&
                     ActionController::Dispatcher.middleware.active.detect{|m| m == AfterResponse::Adapters::UnicornMiddleware }
             }
  ),
  OpenStruct.new(
    :name => :unicorn_monkeypatch,
    :test => lambda{ defined?(Unicorn) },
    :lib  => 'after_response/adapters/unicorn_monkeypatch'
  )
]

Class Method Summary collapse

Class Method Details

.append_after_response(&block) ⇒ Object



11
12
13
# File 'lib/after_response/callbacks.rb', line 11

def self.append_after_response(&block)
  Callbacks.append_after_response(&block)
end

.append_transient_after_response(&block) ⇒ Object



15
16
17
# File 'lib/after_response/callbacks.rb', line 15

def self.append_transient_after_response(&block)
  Callbacks.append_transient_after_response(&block)
end

.attach_to_current_container!Object



34
35
36
37
38
39
40
41
42
43
# File 'lib/after_response.rb', line 34

def self.attach_to_current_container!
  return if @after_response_attached
  if current_container
    require(current_container.lib) if current_container.lib
    @after_response_attached = true
    logger.info{ "[AfterResponse] => Callback hook installed for #{current_container.name}" }
  else
    logger.info{ "[AfterResponse] => No supported container found. AfterResponse will not buffer." }
  end
end

.buffer_and_flush_manually!Object

If a container adapter isn’t available, this method can be called to enable the buffering of events, and Starboard::EventQueue.flush! must be called manually



62
63
64
65
66
67
68
# File 'lib/after_response.rb', line 62

def self.buffer_and_flush_manually!
  @after_response_attached ||= begin
    raise "Callback hook already installed for #{current_container.name}" if current_container
    logger.info{ "[AfterResponse] => Will flush manually" }
    true
  end
end

.bufferable?Boolean

AfterResponse is in a bufferable state mode only if it is running under a supported container where an after_response callback hook was installed and if an after_response callback was installed that calls Starboard::EventQueue.flush!

Returns:

  • (Boolean)


56
57
58
# File 'lib/after_response.rb', line 56

def self.bufferable?
  @after_response_attached
end

.callbacksObject



3
4
5
# File 'lib/after_response/callbacks.rb', line 3

def self.callbacks
  Callbacks.callbacks
end

.current_containerObject



49
50
51
# File 'lib/after_response.rb', line 49

def self.current_container
  @current_container ||= CONTAINER_ADAPTERS.detect{|c| c.test.call }
end

.loggerObject



70
71
72
73
74
75
76
77
78
79
# File 'lib/after_response.rb', line 70

def self.logger
  @logger ||= begin
    if defined?(Rails)
      Rails.logger
    else
      require 'logger'
      Logger.new($stdout)
    end
  end
end

.reset!Object



45
46
47
# File 'lib/after_response.rb', line 45

def self.reset!
  @after_response_attached = @current_container = @logger = nil
end

.transient_callbacksObject



7
8
9
# File 'lib/after_response/callbacks.rb', line 7

def self.transient_callbacks
  Callbacks.transient_callbacks
end