Class: Rackful::MethodOverride
- Inherits:
 - 
      Object
      
        
- Object
 - Rackful::MethodOverride
 
 - Defined in:
 - lib/rackful/middleware/methodoverride.rb
 
Overview
Middleware that provides method spoofing, like Rack::MethodOverride.
If you use this middleware, then clients are allowed to spoof an HTTP
method by specifying a _method=... request parameter, for
example http://example.com/some_resource?_method=DELETE.
This can be useful if you want to perform PUT and
DELETE requests from within a browser, of when you want to
perform a GET requests with (too) many parameters, exceeding
the maximum URI length in your client or server. In that case, you can put
the parameters in a POST body, like this:
POST /some_resource HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 123456789
param_1=hello¶m_2=world¶m_3=...
Caveats:
- 
this middleware won’t work well together with Digest Authentication.
 - 
When a
POSTrequest is converted to aGETrequest, the entire request body is loaded into memory, which creates an attack surface for DoS-attacks. Hence, the maximum request body size is limited (see POST_TO_GET_REQUEST_BODY_MAX_SIZE and #initialize). You should choose this limit carefully, and/or include this middleware after your security middlewares. 
Improvements over Rack::MethodOverride (v1.5.2):
- 
Rack::MethodOverride requires the original method to be
POST. We allow the following overrides (ORIGINAL_METHOD→OVERRIDE_WITH):- 
GET→DELETE,HEADandOPTIONS - 
POST→GET,PATCHandPUT 
 - 
 - 
Rack::MethodOverride doesn’t touch
env['QUERY_STRING']. We remove parameter_methodif it was handled (but still leave it there if it wasn’t handled for some reason). - 
Rackful::MethodOverride is documented ;-)
 
Constant Summary
- METHOD_OVERRIDE_PARAM_KEY =
 '_method'.freeze
- POST_TO_GET_REQUEST_BODY_MAX_SIZE =
 1024 * 1024
- ALLOWED_OVERRIDES =
 { 'GET'.freeze => [ 'DELETE', 'HEAD', 'OPTIONS' ].to_set.freeze, 'POST'.freeze => [ 'PATCH', 'PUT' ].to_set.freeze }.freeze
Instance Method Summary (collapse)
- - (void) call(env)
 - 
  
    
      - (MethodOverride) initialize(app, options = {}) 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    
Constructor.
 
Constructor Details
- (MethodOverride) initialize(app, options = {})
Constructor.
      67 68 69 70  | 
    
      # File 'lib/rackful/middleware/methodoverride.rb', line 67 def initialize( app, = {} ) @app = app @max_size = [:max_size] end  | 
  
Instance Method Details
- (void) call(env)
      73 74 75 76  | 
    
      # File 'lib/rackful/middleware/methodoverride.rb', line 73 def call env before_call env @app.call env end  |