2012-03-12 18 views
5

Estoy usando rack-throttle como motor de limitación de velocidad en la aplicación my rails 3. Creé mi propia clase basada en el Rack::Throttle::Interval para definir la lógica de limitación de velocidad personalizada. Estoy comprobando si la solicitud se realiza para el controlador exacto y la acción exacta. Esto funciona bien si hago la solicitud GET. Sin embargo, si envío POST solicito, tengo algunos problemas.Disminución de las solicitudes POST en la aplicación de raíles

class CustomLimiter < Rack::Throttle::Interval 
    def allowed?(request) 
    path_info = Rails.application.routes.recognize_path request.url rescue path_info = {} 
    if path_info[:controller] == "some_controller" and path_info[:action] == "some_action" 
     super 
    else 
     true 
    end 
    end 
end 

Éstos son mis acciones del controlador

def question 
    #user is redirected here 
end 

def check_answer 
    #some logic to check answer 
    redirect_to question_path 
end 

Mis rutas

get "questions" => "application#question", :as => "question" 
post "check_answer" => "application#check_answer", :as => "check_answer" 

EDIT:

El problema es que POST solicitudes están llegando a la aplicación para que el método allowed? se llama . Pero cuando llamo al Rails.application.routes.recognize_path obtengo una excepción de Route set not finalized. ¿Cómo puedo evitar que un usuario envíe una gran cantidad de solicitudes de correos en la acción exacta del controlador exacto con la ayuda de rack-throttle

Se añade el middleware en application.rb

class Application < Rails::Application 
    #Set up rate limiting 
    config.require "ip_limiter" 
    config.require "ip_user_agent_limiter" 
    config.middleware.use IpLimiter, :min => 0.2 
    config.middleware.use IpUserAgentLimiter, :min => 2 
end 

Tanto IpLimiter y IpUserAgentLimiter se derivan de limitador personalizado

+0

¿Cómo has insertar su estante del acelerador :: :: intervalo en su aplicación? – shingara

+0

@shingara está incluido en 'application.rb' – RomanKapitonov

+0

¿Está permitido? método es llamada en el método POST o no? ¿Puedes pasar la parte donde agregas este middleware en tu aplicación? – shingara

Respuesta

2

Después de leer el código de Rails.application.routes.recognize_path (http://apidock.com/rails/ActionDispatch/Routing/RouteSet/recognize_path), este método obtiene un segundo argumento donde se puede pasar el MÉTODO.

intento con:

path_info = Rails.application.routes.recognize_path(request.url, {:method => request.request_method}) rescue path_info = {} 

Después de todo método puede trabajar, supongo.

+1

Todavía obtengo el siguiente 'RuntimeError: conjunto de ruta no finalizado desde /home/rkapitonov/.rvm/gems/ruby-1.9.2-p290/gems/rack-mount-0.8.3/lib/rack/mount/route_set .rb: 81: en 'recognice'' cuando se trata de hacer lo siguiente' Rails.application.routes.recognize_path (request.url, {: method => request.request_method}) ' – RomanKapitonov

0

Ésta funcionó para mí, para atrapar todas las peticiones POST, e ignorar todas las peticiones GET:

class CustomLimiter < Rack::Throttle::Interval 

    def allowed?(request) 
    return true unless request.request_method == "POST" 
    super request 
    end 

end 
Cuestiones relacionadas