2011-01-19 343 views
5

ho ottenuto le seguenti indietro da delayed_job:URI non valido - Come prevenire, URI :: ErralidURIError errori?

[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 

Il modo in cui questo viene da URI nella mia app è.

Nel mio user_mailer faccio:

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

Poi nel mio allegati modello:

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 

Detto questo, c'è un certo tipo di URI.encode o analisi che posso fare per evitare un URI valido (come ho verificato l'URL funziona nel mio browser) per errore e uccisione delayed_job in rails 3?

Grazie!

+0

ho provato 'open (URI.parse (URI.encode (a.authenticated_url()))', ma che errord con OpenURI :: HTTPError: 403 Forbidden – AnApprentice

+0

Tale errore non significa che l'URL è cattivo, significa che la pagina non è disponibile per te. –

risposta

1

Ruby ha (almeno) due moduli per gestire gli URI.

URI fa parte della libreria standard.

Addressable::URI, è una gemma separata e più completa e dichiara di essere conforme alle specifiche.

Analizza un URL con uno dei due, modifica qualsiasi parametro utilizzando i metodi della gemma, quindi convertilo usando to_s prima di passarlo e dovresti essere pronto.

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

Se navigato a quella pagina tramite un browser ed è riuscito, poi non è riuscito ad andare direttamente tramite codice, è probabile che ci sia un biscotto o una sessione di stato che manca. Potrebbe essere necessario utilizzare qualcosa come Mechanize, che manterrà tale stato pur consentendo di navigare attraverso un sito.


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

Grazie Tin Man .. Quando modifichi qualche parametro puoi spiegarlo meglio ma fornire un esempio per l'URL sopra? thxs – AnApprentice

+0

I aggiunto un semplice esempio di come usare Addressable. Oltre a ciò penso che sia necessario passare attraverso i documenti, decidere come si adatta al caso d'uso, e imparare la gemma.E 'molto buona. Ruby's U RI ha alcuni dolori crescenti in questo momento relativi alla codifica dei parametri, quindi qualsiasi manipolazione di quella parte di un URL che passo a indirizzabile. –