2014-07-07 14 views
7

Abbiamo uno strano problema con un solo crawler. Di tanto in tanto sarà lanciare un errore Rails FATAL su qualche richiesta, ma la traccia è molto limitato e sembra qualcosa di simileerrore misterioso delle rotaie con quasi nessuna traccia

[2014-07-01 18:16:37] FATAL Rails : 
ArgumentError (invalid %-encoding (c^ FK+ 9u$_ t Kl 
ΥE! =k \ ̕* ߚ>c+<O یo ʘ> C  R! 2 D (5  x q#!` 4 p  |8 I E 
:+ H^9`^ # Vo{ > 

    =[z )): 
    lib/locale_middleware.rb:14:in `call' 

L'user-agent crawler è

Mozilla/5.0 (compatible; EasouSpider; +http://www.easou.com/search/spider.html)

Possiamo chiedere di fermarsi eseguendoci la scansione via robots.txt, ma sarebbe meglio affrontare la causa principale e non fallire con 500 su quelle richieste se possibile.

Non possiamo davvero riprodurre questo tipo di richiesta, quindi qualsiasi suggerimento su come generare una richiesta simile sarebbe di grande aiuto.

Stiamo usando Rails 3.2.19, Unicorn su Ubuntu 12.04. Ecco il nostro locale_middleware.rb

+0

Puoi riprodurre avendo '% 9g' nella richiesta URL? ? esempio: http://your.site/path/to/a/get?%9g – Benj

+0

Immagino che l'eccezione si verifichi nel prossimo livello del middleware. Cosa sta succedendo LocaleMiddleware? È possibile eseguire 'rake middleware' –

+0

@BenjaminSinclaire - l'aggiunta di'?% 9g' sembra produrre una risposta '400' dal nostro nginx, non colpisce nemmeno le rotaie. Dove hai preso questo '% 9g' comunque ?? (Mi sto incuriosendo) – gingerlime

risposta

4

Un ringraziamento speciale a Benjamin Sinclaire per indicare lo right issue on github.

La soluzione è stata descritta on this comment:

config.middleware.use ::Rack::Robustness do |g| 
    g.no_catch_all 
    g.on(ArgumentError) { |ex| 400 } 
    g.content_type 'text/plain' 
    g.body{ |ex| ex.message } 
    g.ensure(true) { |ex| env['rack.errors'].write(ex.message) } 
end 
+1

Questo cattura ogni 'ArgumentError', compresi quelli che non hanno nulla a che fare con gli errori di codifica? Penso che lo faccia e potrebbe essere problematico. Se non lo vuoi, [vedi questa soluzione] (http://stackoverflow.com/a/24727310/6962). –

+0

Per quanto ho capito, questo catturerà un 'ArgumentError' generato dall'esterno della nostra app. Prendiamo comunque "ArgumentErrors" all'interno del nostro codebase sul nostro controller dell'applicazione. Quindi l'esposizione è solo al di fuori della base di codice, ad es. middleware/Rails stesso. Inoltre, ho aggiunto un metodo logger allo snippet sopra riportato e non ho individuato nulla di diverso da questi problemi di codifica finora. – gingerlime

Problemi correlati