lib/restfulness/dispatchers/rack.rb in restfulness-0.2.2 vs lib/restfulness/dispatchers/rack.rb in restfulness-0.2.3
- old
+ new
@@ -17,31 +17,37 @@
protected
def prepare_request(env)
rack_req = ::Rack::Request.new(env)
+
request = Request.new(app)
request.uri = rack_req.url
- request.action = parse_action(rack_req.request_method)
- request.query = rack_req.GET
+ request.action = parse_action(env, rack_req.request_method)
request.body = rack_req.body
request.headers = prepare_headers(env)
+ # Just in case something else got to body first
+ request.body.rewind if request.body.is_a?(StringIO)
+
# Useful info
request.remote_ip = rack_req.ip
request.user_agent = rack_req.user_agent
# Sometimes rack removes content type from headers
request.headers[:content_type] ||= rack_req.content_type
request
end
- def parse_action(action)
+ # Given that we need to deal with the action early on, we handle the
+ # HTTP method override header here.
+ def parse_action(env, action)
+ action = (env['HTTP_X_HTTP_METHOD_OVERRIDE'] || action).strip.downcase
case action
- when 'DELETE', 'GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'OPTIONS'
- action.downcase.to_sym
+ when 'delete', 'get', 'head', 'post', 'put', 'patch', 'options'
+ action.to_sym
else
raise HTTPException.new(501)
end
end