¿Cómo implementar un 'tiempo de espera' personalizado para la solicitud https?

Tengo un código de trabajo que obtiene datos a través de https (abajo). De hecho, ejecuta algunas pruebas a través de php. Usé el tiempo de espera estándar que funciona bien. Ahora, mientras "espera" la respuesta del servidor, necesito implementar el temporizador. Porque en algunos casos la prueba no terminará - el código php no terminará - el tiempo de espera de Ruby funciona bien. Entonces, necesito eliminar algún proceso para capturar el error en la sesión https existente.

¿Cómo puedo implementar mi propio tiempo de espera para la solicitud https además del tiempo de espera existente?

El tiempo de espera existente siempre será mayor que el tiempo de espera personalizado. por ejemplo, el tiempo de espera existente es de 10 minutos y el personalizado será de 5 minutos.

uri = URI.parse(url)
start = Time.new
http_read_timeout=60*10

connection = Net::HTTP.new(uri.host, 443)
connection.use_ssl = true
begin   
        response = connection.start() do |http|
            http.open_timeout =  50
            http.read_timeout = http_read_timeout
            http.request_get(uri.request_uri)
            # here I need to place a code that is triggered 
            # in case of custom timeout is reached
        end
rescue Timeout::Error
#  "Connection failed
    time_out_message ="security time out - after #{http_read_timeout} sec"
return time_out_message         

end

puts "finished"

preguntado el 22 de mayo de 12 a las 07:05

¿Por qué la prueba no finalizará si configuró los tiempos de espera para la conexión http open_timeout y read_timeout? -

El código php no terminará; el tiempo de espera de Ruby funciona bien. Necesito detectar que la 'prueba' no terminará y luego matará un proceso y eso hará que la prueba termine con un mensaje de error. Es por eso que necesito este 'tiempo de espera personalizado' para capturar el mensaje de error. Cuando se usa el tiempo de espera de Ruby, el mensaje de error no se captura porque la prueba no ha terminado. -

El código PHP es irrelevante para mi pregunta. Podría ser cualquier código. El código que ejecuta el texto está bien, pero el código que está probando la prueba tiene un error. Ese es todo el propósito de este ejercicio: encontrar un error. Y me facilitaría la vida si pudiera capturar el mensaje de error. La prueba se realiza durante la noche, por lo que a la mañana siguiente tengo que reproducir el escenario de prueba en la mano para obtener el error. -

Por otro lado, el código php podría escribirse de manera que forzara la salida del mensaje de error. Pedí a nuestros desarrolladores una modificación, pero no sucederá pronto. Entonces, o encuentro mi propia solución o ... en ese sentido, el código php es irrelevante. -

1 Respuestas

no lo entiendo ¿Qué hace su tiempo de espera personalizado? Está realizando una solicitud HTTP... regresa o se agota el tiempo de espera.

Ya está configurando el valor de tiempo de espera. Su código no puede llegar al futuro y decirle qué devolvería el código externo, si lo hiciera... Entonces, ¿qué quiere que haga exactamente?

Pero si realmente solo necesita un contenedor de tiempo de espera externo, puede usar Timeout::Timeout. Como esto:

require 'timeout'
Timeout::timeout(your_timeout_period) do
  run_some_code
rescue => err
  do_something_with err
  # and maybe the below?
  raise
end

contestado el 23 de mayo de 12 a las 02:05

Necesito averiguar si la solicitud HTTP está tardando demasiado. Más tiempo que mi 'tiempo de espera personalizado'. En caso afirmativo, necesito ejecutar algún código que 'libera' el proceso php y luego HTTP finaliza con éxito. - Radek

El tiempo de espera existente siempre será mayor que el tiempo de espera personalizado. por ejemplo, el tiempo de espera existente es de 10 minutos y el personalizado será de 5 minutos. - Radek

Simplemente pondrías tu código HTTP dentro de mi bloque. Si todo el código que tiene aquí se colocara dentro de un método llamado run_some_code, funcionaría bien :) ...excepto para hacer algo con el error, de todos modos. - David

Hmmm, necesito que la solicitud HTTP NO se cierre. Parece que necesito un temporizador, no un tiempo de espera.... Probablemente no tenía tan claro lo que necesitaba. ¿Su código detendría la solicitud HTTP? - Radek

Oh. Entonces podría generar un nuevo hilo para la solicitud http. O si algo allí se bloquea, bifurque un nuevo proceso. - David

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.