2010-12-14 9 views
15

Estoy tratando de usar ruby ​​rest-client para subir una gran cantidad de imágenes a un sitio que estoy escribiendo. Mi código es el siguiente:ruby ​​rest-client: haz que nunca se agote el tiempo de espera?

RestClient.post url, :timeout => 90000000, :open_timeout => 90000000, :file_param => file_obj 

Sin embargo, estoy consiguiendo este error:

RestClient::RequestTimeout: Request Timeout 
    from /Library/Ruby/Gems/1.8/gems/rest-client-1.6.1/lib/restclient/request.rb:174:in `transmit' 
    from /Library/Ruby/ 

Pero cuando miro el registro del servidor

Completed in 61493ms (View: 2, DB: 1) | 201 Created 

Así que no parece haber cualquier razón por la cual esto es tiempo de espera. ¿Alguien tiene alguna idea de si hay un parámetro de tiempo de espera que no estoy configurando correctamente?

Gracias

Respuesta

2

Tengo problemas similares. Una inmersión rápida en la fuente revela este fragmento de hostilidad:

def self.post(url, payload, headers={}, &block) 
    Request.execute(:method => :post, :url => url, :payload => payload, :headers => headers, &block) 
end 

A menos que me falta algo, las opciones de tiempo de espera no se transmiten a la solicitud subyacente. Tiempo para un parche ...

+4

Una inmersión ligeramente más profundo muestra que mientras los GET', '' Post' métodos de conveniencia y de hecho relacionados No se permite pasa las opciones ': timeout' y': open_timout', son solo envoltorios delgados para 'Request.execute', que los aceptará.Es mejor reemplazar las llamadas a los contenedores con llamadas a 'ejecutar' que al parche mono, en mi humilde opinión. –

19

Esta sintaxis establece el tiempo de espera como encabezado de la solicitud (ver RestClient.post firma), si desea utilizar el parámetro de tiempo de espera debe utilizar:

RestClient::Request.execute(:method => :post, :url => @url, :timeout => 90000000) 

véase: https://github.com/rest-client/rest-client/blob/master/lib/restclient/request.rb#L12

+1

¿Qué es Solicitud? constante no inicializada –

+2

RestClient :: Request.execute (: method =>: post,: url => @url,: timeout => 90000000) –

+1

Y coloque los parámetros que se enviarán en el cuerpo POST (creo que ': file_param' en el OP) en ': payload':' Request.execute (: method =>: post,: url => @url,: timeout => 90000000,: payload => {: file_param => file_obj}) ' – WiseOldDuck

2

el RESTClient :: Resource.new() le permite configurar: tiempo de espera y: open_timeout valores que se van pasando al método Request.execute, cuando se utiliza get del recurso, pOST, PUT, métodos, etc.

4

He usado el siguiente código y funciona como un ch el brazo como ha señalado Richard

resource = RestClient::Resource.new "url", 
            :timeout => $TIMEOUT, 
            :open_timeout => $OPEN_TIMEOUT 

response = resource.get :params => { ..... } 
12

En cuanto a la documentación, que puede pasar a través de -1 RestClient.execute tiempo de espera param:

# * :timeout and :open_timeout passing in -1 will disable the timeout by setting the corresponding net timeout values to nil 

Puede ser utilizado de la siguiente manera:

resource = RestClient::Resource.new(
    "url", 
    :timeout => -1, 
    :open_timeout => -1 
response = resource.get :params => {<params>} 
+3

Esto aparece haber sido actualizado a 'nil' en lugar de -1. El uso de -1 registra una advertencia (pero parece funcionar). – WiseOldDuck

3

Ya uso RestClient.get y RestClient.post extensivamente, así que para mí, era más fácil que 'Monkey Patch' RestClient. Yo recomendaría usar RestClient::Resource.new o RestClient::Request.Execute si es posible.

Sin embargo, como soy flojo, y no quiero cambiar cada aparición de RestClient.get/RestClient.post en mi código, he decidido tomar un atajo.

$timeout = 30 
$open_timeout = 30 

module RestClient2 
    include RestClient 

    def self.get(url, headers={}, &block) 
    Request.execute(:method => :get, :url => url, :headers => headers, 
    :timeout => $timeout, :open_timeout => $open_timeout, &block) 
    end 

    def self.post(url, payload, headers={}, &block) 
    Request.execute(:method => :post, :url => url, :payload => payload, :headers => headers, 
    :timeout => $timeout, :open_timeout => $open_timeout, &block) 
    end 
end 

Y de lo que acaba justo rápida sustituye RestClient.get/post con RestClient2.get/post.

Sería bueno, si RestClient::Request tenían un tiempo de espera predeterminado especificado, como:

@timeout = args[:timeout] || 30 
    @open_timeout = args[:open_timeout] || 30 
Cuestiones relacionadas