2011-05-16 13 views
7

La documentación del módulo HTTP LuaSocket dice que un tiempo de espera se puede ajustar en una conexión HTTP:lua toma http tiempo de espera

Las siguientes constantes se pueden configurar para controlar el comportamiento predeterminado del módulo HTTP:

PUERTO : puerto predeterminado utilizado para las conexiones; PROXY: proxy predeterminado utilizado para las conexiones; TIEMPO DE ESPERA: establece el tiempo de espera para todas las operaciones de E/S; USERAGENT: agente de usuario predeterminado informado al servidor. http://w3.impa.br/~diego/software/luasocket/http.htm

¿Cómo configuro estas constantes en un script lua?

+1

Agregue su solución como respuesta y acéptela, por lo que esta pregunta estaría completa. –

+0

Lo intenté, pero tengo que esperar 8 horas después de la primera publicación para poder responder a mi propia pregunta. Lo haré esta tarde (CET). – ripat

+0

Esa restricción debería desaparecer ahora que tiene más de 10 puntos de repetición. – BMitch

Respuesta

6

Para ello, puede establecer un tiempo de espera para una solicitud en lugar de todo el módulo HTTP:

local socket = require "socket" 
local http = require "socket.http" 
response = http.request{url=URL, create=function() 
    local req_sock = socket.tcp() 
    req_sock:settimeout(5) 
    return req_sock 
end} 

Tenga en cuenta que el comportamiento predeterminado de :settimeout, así como la configuración global como http.TIMEOUT, establece una límite de tiempo para cualquier operación individual dentro de la solicitud - en otras palabras, es cuánto tiempo la operación puede ir sin ninguna actividad antes de que se agote el tiempo de espera. Si desea establecer un límite superior general en una operación - una vez que la solicitud global no puede exceder, independientemente de la actividad - debe pasar un argumento de modo de 't' como el segundo parámetro a :settimeout, como sigue:

local socket = require "socket" 
local http = require "socket.http" 
response = http.request{url=URL, create=function() 
    local req_sock = socket.tcp() 
    -- note the second parameter here 
    req_sock:settimeout(5, 't') 
    return req_sock 
end} 

Como ejemplo para ilustrar la distinción entre los dos modos, imaginemos que, después de hacer su solicitud, el servidor responde con un trozo de la respuesta de una vez por segundo, teniendo siete segundos para completar global. Con req_sock:settimeout(5, 'b') (o simplemente req_sock:settimeout(5)) el establecimiento de un 5 segundos bloque tiempo de espera, esta solicitud se procedería muy bien, ya que ninguno de los operaciones subyacentes de E/S tomó más tiempo de cinco segundos: Sin embargo, la req_sock:settimeout(5, 't') establecimiento de cinco segundos total tiempo de espera, la solicitud sería error después de cinco segundos.

Por supuesto, puede tener sentido para establecer restricciones para tanto de estas duraciones, que tiene tanto un corto tiempo de espera inactividad, así como una larga general tiempo de espera. Como tal, per the documentation, puede hacer dos llamadas separadas para especificar tanto :

local socket = require "socket" 
local http = require "socket.http" 
response = http.request{url=URL, create=function() 
    local req_sock = socket.tcp() 
    req_sock:settimeout(5, 'b') 
    req_sock:settimeout(30, 't') 
    return req_sock 
end} 
+0

No estoy seguro de entender esto. Con la solución que encontré (publicada a continuación ahora), ¿realmente cambio el tiempo de espera para todos los nuevos sockets HTTP? Si ese es el caso, podría restablecer su valor a los 60 segundos predeterminados después de que la conexión haya tenido éxito. ¿Puedes explicar en tu fragmento, especialmente la parte 'create = function()'? – ripat

+0

Acabo de hacer algunas pruebas y, de hecho, cuando cambio el tiempo de espera con 'mysocket.TIMEOUT' mantiene ese valor para todos los nuevos HTTP creados después, a menos que lo cambie nuevamente. Con tu sugerencia, ¿no creas dos enchufes? ¿Un http y un tcp? – ripat

+1

@ripat El parámetro 'create' de la solicitud especifica la función para * crear * el socket TCP que utiliza para * ejecutar * la solicitud HTTP ([la capa de aplicación HTTP pasa por la capa de transporte TCP] (http: // en. wikipedia.org/wiki/TCP/IP_model)). Si no especifica una función de creación, http.request usará una llamada simple a 'tcp()' de forma predeterminada (consulte [el manual] (http://w3.impa.br/~diego/software/luasocket/ http.html)). –

12

Fue más fácil de lo que pensaba. simplemente

local mysocket = require("socket.http") 
mysocket.TIMEOUT = 5 
+2

Esta es la respuesta correcta – javsmo

+2

¿Esto tiene 'efectos secundarios', cambiando configuraciones de socket http fuera del archivo que lo requiere? (es decir, código en el mismo programa, pero en otro archivo que lo requiera, para http.socket) – josinalvo

+1

@josinalvo: Sí, todos los archivos dentro de un programa comparten las mismas instancias de sus módulos comunes bajo 'package.loaded'. Ver [mi respuesta] (http://stackoverflow.com/a/6021774/34799) para una forma de hacer esto sin efectos secundarios. –

Cuestiones relacionadas