2010-09-20 9 views
12

Al aplicar OAuth2 en mi aplicación, que necesita para manejar URIs como:Cómo evitar que el carácter de la tubería cause un error URI incorrecto en Rails 3/Ruby 1.9.2?

http://localhost:3000/sessions/create/?code=lorem|ipsum

No está seguro de si se trata de un problema de los carriles 3 o Ruby 1.9.2 (tal vez URI.parse), pero en cualquier caso, WEBrick patea Error bad URI.

¿Alguien sabe de una solución? Gracias.

+1

Es posible que desee fijar el error tipográfico en el título ... – hurikhan77

+0

tienen que poner '# codificación: UTF-8' en la parte superior de su archivos? 1.9+ es muy sensible acerca de los personajes, por desgracia. – oma

Respuesta

15

Me encontré con el mismo requisito (y problema) recientemente. En Rails 3 y Ruby 1.9.2.

No es un problema para nuestro entorno de producción/producción (nginx), pero estaba interesado en descubrir cuál era el problema con WEBrick. Resulta que el problema está bajo en el método URI :: Parser.split, específicamente cómo se empareja el patrón con las constantes URI :: REGEXP :: PATTERN.

Puedes "arreglarlo" agregando lo siguiente a config/environments/development.rb (suponiendo que solo estarías usando WEBrick en dev .. o podrías ponerlo en un archivo de configuración/inicializadores) ..

# this allows WEBrick to handle pipe symbols in query parameters 
URI::DEFAULT_PARSER = 
    URI::Parser.new(:UNRESERVED => URI::REGEXP::PATTERN::UNRESERVED + '|') 

NB: es el establecimiento: sin reservas => "! -_ ~ * '() a-zA-Z \ d |"

+1

'URI :: Parser' ==>' NameError: URI constante no inicializada :: Parser'. ¿Algunas ideas? Eso es Ruby 1.8.7 – Matthias

+1

sí, URI en 1.8 es muy diferente, y mucho más difícil de parchear sin esencialmente volver a escribir grandes fragmentos del módulo URI. Si tiene este problema, lo mejor es actualizar a 1.9 o usar algo que no sea WEBrick – tardate

+0

Esta es una gran solución. Un problema que tenía era que incluso si se escapaba de la URL, algunos sitios (como Yahoo) lo reenviarían a una URL con caracteres no guardados (!) Y OpenURI seguiría fallando. ¡Gracias! – idrinkpabst

1

Terminé simplemente intercambiando en Thin para WEBrick y no he tenido problemas.

7

El inicializador funcionó, pero terminé usando URI.escape, ya que parecía más limpio y parece que manejará más casos.

URI.join(origin_url, URI.escape(parsed_link)).to_s 

Además, este código sólo no parecía derecha

# I need this because URI.join in crawler.rb bombs with '|' symbols 
old_verbose = $VERBOSE 
$VERBOSE = nil 
URI::DEFAULT_PARSER = URI::Parser.new(:UNRESERVED => URI::REGEXP::PATTERN::UNRESERVED + '|') 
$VERBOSE = old_verbose 
Cuestiones relacionadas