Class: FaradayMiddleware::MethodOverride

Inherits:
Faraday::Middleware
  • Object
show all
Defined in:
lib/faraday_middleware/request/method_override.rb

Overview

Public: Writes the original HTTP method to “X-Http-Method-Override” header and sends the request as POST.

This can be used to work around technical issues with making non-POST requests, e.g. faulty HTTP client or server router.

This header is recognized in Rack apps by default, courtesy of the Rack::MethodOverride module. See rack.rubyforge.org/doc/classes/Rack/MethodOverride.html

Constant Summary collapse

HEADER =
"X-Http-Method-Override".freeze

Instance Method Summary collapse

Constructor Details

#initialize(app, options = nil) ⇒ MethodOverride

Public: Initialize the middleware.

app - the Faraday app to wrap options - (optional)

:rewrite - Array of HTTP methods to rewrite
           (default: all but GET and POST)


23
24
25
26
27
28
29
# File 'lib/faraday_middleware/request/method_override.rb', line 23

def initialize(app, options = nil)
  super(app)
  @methods = options && options.fetch(:rewrite).map { |method|
    method = method.downcase if method.respond_to? :downcase
    method.to_sym
  }
end

Instance Method Details

#call(env) ⇒ Object



31
32
33
34
35
# File 'lib/faraday_middleware/request/method_override.rb', line 31

def call(env)
  method = env[:method]
  rewrite_request(env, method) if rewrite_request?(method)
  @app.call(env)
end

#rewrite_request(env, original_method) ⇒ Object

Internal: Write the original HTTP method to header, change method to POST.



46
47
48
49
# File 'lib/faraday_middleware/request/method_override.rb', line 46

def rewrite_request(env, original_method)
  env[:request_headers][HEADER] = original_method.to_s.upcase
  env[:method] = :post
end

#rewrite_request?(method) ⇒ Boolean

Returns:

  • (Boolean)


37
38
39
40
41
42
43
# File 'lib/faraday_middleware/request/method_override.rb', line 37

def rewrite_request?(method)
  if @methods.nil? or @methods.empty?
    method != :get and method != :post
  else
    @methods.include? method
  end
end