2011-01-19 27 views
5

que tiene la siguiente vuelta de delayed_job:URI no válido: cómo prevenir, URI :: InvalidURIError errors?

[Worker(XXXXXX pid:3720)] Class#XXXXXXX failed with URI::InvalidURIError: bad URI(is not URI?): https://s3.amazonaws.com/cline-local-dev/2/attachments/542/original/mac-os-x[1].jpeg?AWSAccessKeyId=xxxxxxxx&Expires=1295403309&Signature=xxxxxxx%3D - 3 failed attempts 

La forma en que esto viene de URI en mi aplicación es.

En mi user_mailer hago:

@comment.attachments.each do |a| 
    attachments[a.attachment_file_name] = open(a.authenticated_url()) {|f| f.read } 
    end 

Luego, en mi adjuntos modelo:

def authenticated_url(style = nil, expires_in = 90.minutes) 
    AWS::S3::S3Object.url_for(attachment.path(style || attachment.default_style), attachment.bucket_name, :expires_in => expires_in, :use_ssl => attachment.s3_protocol == 'https') 
    end 

Dicho esto, ¿hay algún tipo de URI.encode o análisis que pueda hacer para prevenir una URI válido (como comprobé que la URL funciona en mi navegador) para el error y matar a la tarea demorada en los carriles 3?

¡Gracias!

+0

Probé 'abierto (URI.parse (URI.encode (a.authenticated_url()))', sino que errord con OpenURI :: HTTPError: 403 Forbidden – AnApprentice

+0

Ese error no significa que la URL es mala, significa que la página no está disponible para usted. –

Respuesta

1

Ruby tiene (al menos) dos módulos para tratar con URI.

URI es parte de la biblioteca estándar.

Addressable::URI, es una gema separada, y más completa, y pretende ajustarse a la especificación.

Analice una URL con una de ellas, modifique los parámetros utilizando los métodos de la gema, luego conviértala usando to_s antes de pasarla, y debería estar listo para continuar.

I tried ' open(URI.parse(URI.encode(a.authenticated_url())) ' but that errord with OpenURI::HTTPError: 403 Forbidden

Si ha accedido a la página a través de un navegador y tuvo éxito, y más tarde no ir directamente a ella a través de código, lo más probable es que hay un estado de galletas o una sesión que falta. Es posible que necesite usar algo como Mechanize, que mantendrá ese estado mientras le permite navegar a través de un sitio.


EDIT:

require 'addressable/uri' 

url = 'http://www.example.com' 

uri = Addressable::URI.parse(url) 
uri.query_values = { 
    :foo => :bar, 
    :q => '"one two"' 
} 

uri.to_s # => "http://www.example.com?foo=bar&q=%22one%20two%22" 
+0

Gracias Hombre de hojalata ... Cuando 'modifique cualquier parámetro' puede explicarlo mejor, pero proporcione un ejemplo para la URL de arriba? thxs – AnApprentice

+0

I agregué un ejemplo simple de cómo usar Direccionable. Más allá de eso, creo que necesita revisar los documentos, decidir cómo se ajusta a su caso de uso y aprender la gema. Es muy bueno. RI tiene algunos dolores de crecimiento en este momento relacionados con la codificación de parámetros por lo que cualquier manipulación de esa parte de una URL que paso a Direccionable. –