2015-03-19 6 views
11

Attualmente sto cercando di determinare la causa di un bug di reindirizzamento in un'app Rails. Le specifiche sono documentate here, anche se non sto cercando una soluzione specifica qui su StackOverflow. Piuttosto, mentre sto lavorando per risolvere questo problema, mi piacerebbe sviluppare un modo generico per catturare, registrare e indagare su infiniti loop di reindirizzamento in un'app Rails.Rileva e cattura i loop infiniti di reindirizzamento in Rails

Ho un'idea qui, ma mi piacerebbe ancora vedere se ci sono tecniche provate e vere.

mia idea:

Override Rails' redirect_to a 'log' reindirizza nella sessione:

def redirect_to(destination) 
    session[:redirects] << {destination: destination, timestamp: Time.now} 
    if is_inifinite_redirect?(session[:redirects]) 
    render "a_redirect_error_page" 
    else 
    super 
    end 
end 

Poi, hanno una sorta di analisi della matrice redirect per determinare se v'è un ciclo infinito :

def is_inifinite_redirect?(redirects) 
    recent = redirects.last(21) # 21 is the max redirects allowed by Chrome 
    return recent.odds.map(&:destination).uniq.length == 1 && \ 
    recent.evens.map(&:destination).uniq.length == 1 && \ 
    (recent.last.timestamp - recent.first.timestamp < 10.seconds) 
end 

risposta

3

La tecnica collaudata consiste nello scrivere test per garantire che l'app funzioni nel modo previsto. Questo particolare problema potrebbe essere facilmente rilevato da un test del controller guasto e/o da un test di integrazione non riuscito.

Non c'è niente di sbagliato nell'aggiungere il codice che hai sopra per aiutarti a eseguire il debug di questa particolare situazione (se lo fa), ma la vera soluzione qui per un'app di produzione è di fare dei test in modo da non ottieni questi loop di reindirizzamento.

+1

d'accordo assolutamente, ma la sfida è quando non si conoscono gli ingressi quello causa il re-diretto! – Ultrasaurus

+1

Grazie, @smathy. Ho postato questa domanda per arrivare a un codice funzionante o ad un algoritmo funzionante per il rilevamento ragionevole dei reindirizzamenti. I test sono un'altra cosa su cui sto lavorando per migliorare, ma non sono pertinente alla mia domanda specifica. – user94154

+0

Verissimo, e non mi aspettavo che tu accettassi la mia risposta. Ma se qualcuno succede in tutta la tua domanda in una fase successiva, forse la mia risposta avrà ancora il maggior numero di voti e fornirà il modo migliore per proteggere un'applicazione di produzione in natura da questi tipi di problemi. – smathy

6

Sono d'accordo sul fatto che le prove dovrebbero in teoria impedire l'esecuzione in infiniti cicli di reindirizzamento. Ma capisco che i test non sono la risposta alla tua domanda.

Penso che si possa considerare un ciclo di reindirizzamento infinito non appena si hanno due reindirizzamenti in una riga con gli stessi argomenti. Penso che non ci siano buone ragioni per aspettare ulteriori reindirizzamenti.

La mia idea è di memorizzare gli argomenti del reindirizzamento nello flash. Se gli argomenti nel flash sono ancora gli stessi quando avviene il successivo reindirizzamento, allora ci si trova in un ciclo. Se ci fosse un reindirizzamento in un'altra posizione o una normale pagina è stata pronunciata in mezzo allora quella posizione non corrisponde o flash sarebbe vuoto:

def redirect_to(*args) 
    if flash[:redirected_with_args] == args 
    raise "Infinited redirect loop detected: #{args.inspect}" 
    else 
    flash[:redirected_with_args] = args 
    super 
    end 
end 
Problemi correlati