2015-02-23 7 views
1

Я пытаюсь использовать HTTPConnection (2.7.8), чтобы сделать запрос, и я установил таймаут в 10 с помощью HTTPConnection(host, timeout=10). Однако, HTTPConnection.request() не кажется таймаутом через 10 секунд. На самом деле, HTTPConnection.timeout не кажется, даже для чтения HTTPConnection.request() (это только читать HTTPConnection.connect(). Это мое понимание правильно? Является ли timeout применимо только к connect() и не request()? Есть ли способ тайм-аут request()?HTTPConnection.request не соблюдает тайм-аут?

Update :

Я думаю, что я сузил проблему дальше: если я не предоставил схему, она не будет соблюдать тайм-аут сокета. Если схема была предоставлена, то есть полный URL-адрес равен http://google.com:22222, тогда это Я задаюсь вопросом, почему наличие схемы должно иметь значение. То есть следующее не уважает таймаут

socket.setdefaulttimeout(3) 
    conn = HTTPConnection('google.com:22222') 
    conn.timeout = 3 
    conn.request('GET', '') 

тогда, это делает:

socket.setdefaulttimeout(3) 
    conn = HTTPConnection('http://google.com:22222') 
    conn.timeout = 3 
    conn.request('GET', '') 

Однако, это не происходит во всех областях.

Благодаря

+0

Пожалуйста, проверьте http://stackoverflow.com/questions/265720/http-request-timeout. Надеюсь, это поможет :) – itzMEonTV

+0

Нет, этот ответ не работает для меня. Он все еще застревает в 'request()'. Пример url - google.com:2222 – Kar

+1

Вы пытались предоставить IP-адрес напрямую (вместо имени хоста)? Вызовите 'socket.getaddrinfo()', чтобы получить ip-адрес. Похоже, что такая же проблема, как [ftplib.FTP timeout имеет непоследовательное поведение] (http://stackoverflow.com/q/28429501/4279): 'request()' выполняет несколько операций сокета. Каждая операция ограничена таймаутом. Но несколько объединенных операций могут занять больше времени. – jfs

ответ

3

Она занимает около ~ 30 секунд для следующего кода на провал:

#!/usr/bin/env python2 
from httplib import HTTPConnection 

conn = HTTPConnection('google.com', 22222, timeout=2) 
conn.request('GET', '') 

Если ф передается HTTPConnection вместо имени хоста, то поднимается ошибка тайм-аут в течение 2 секунд, как ожидается, :

#!/usr/bin/env python2 
import socket 
from httplib import HTTPConnection 

host, port = 'google.com', 22222 
ip, port = socket.getaddrinfo(host, port)[0][-1] 
conn = HTTPConnection(ip, port, timeout=2) 
conn.request('GET', '') 

объяснение такое же, как в ftplib.FTP timeout has inconsistent behaviour: тайм-аут может ограничить отдельные операции сокета, но ничего не говорит Abou t длительность вызова HTTPConnection(), который может попробовать несколько IP-адресов, возвращенных getaddrinfo(), и тайм-аут ограничивает только отдельные операции сокета. Несколько объединенных операций могут занять больше времени.

Ваш HTTPConnection('http://google.com:22222') не работает раньше, потому что URL-адрес является неправильным аргументом: он должен быть либо host, либо host:port. Абсолют url принимается методом request() - хотя даже там он имеет особое значение - как правило, вы просто указываете путь вдоль, например, '/'.