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