requête http avec un délai d'expiration, la taille maximale de connexion et de mise en commun

Je suis à la recherche d'un moyen en Python (2.7) pour faire des requêtes HTTP avec 3 exigences:

  • délai d'attente (pour la fiabilité)
  • contenu taille maximale (pour la sécurité)
  • le regroupement de connexion (pour la performance)

J'ai vérifié tout à fait tous les python HTTP librairies, mais aucun d'entre eux répondre à mes exigences. Par exemple:

urllib2: bon, mais pas de mise en commun

import urllib2
import json

r = urllib2.urlopen('https://github.com/timeline.json', timeout=5)
content = r.read(100+1)
if len(content) > 100: 
    print 'too large'
    r.close()
else:
    print json.loads(content)

r = urllib2.urlopen('https://github.com/timeline.json', timeout=5)
content = r.read(100000+1)
if len(content) > 100000: 
    print 'too large'
    r.close()
else:
    print json.loads(content)

demandes: aucun taille max

import requests
r = requests.get('https://github.com/timeline.json', timeout=5, stream=True)
r.headers['content-length'] # does not exists for this request, and not safe
content = r.raw.read(100000+1)
print content # ARF this is gzipped, so not the real size
print json.loads(content) # content is gzipped so pretty useless
print r.json() # Does not work anymore since raw.read was used

urllib3: n'a jamais eu la "lecture" de la méthode de travail, même avec un fichier de 50Mo ...

httplib: httplib.HTTPConnection n'est pas une piscine (une seule connexion)

Je peux à peine croire que urllib2 est la meilleure HTTP bibliothèque je peux l'utiliser ! Donc si quelqu'un sait de quoi librairie peut faire ou comment faire pour utiliser l'une des précédentes librairie ...

EDIT:

La meilleure solution que j'ai trouvé grâce à Martijn Pieters (StringIO ne ralentit pas, même pour de gros fichiers, où str outre fait beaucoup).

r = requests.get('https://github.com/timeline.json', stream=True)
size = 0
ctt = StringIO()


for chunk in r.iter_content(2048):
    size += len(chunk)
    ctt.write(chunk)
    if size > maxsize:
        r.close()
        raise ValueError('Response too large')

content = ctt.getvalue()
Au ctt.write(chunk) ligne, je reçois un TypeError: string argument expected, got 'bytes'

OriginalL'auteur Aurélien Lambert | 2014-05-07