http-Anforderung mit timeout, maximale Größe und connection pooling

Ich bin auf der Suche nach einer Möglichkeit in Python (2.7), um HTTP-Anforderungen 3 Anforderungen:

  • timeout (für Zuverlässigkeit)
  • Inhalte maximale Größe (für die Sicherheit)
  • Verbindungs-pooling (für die Leistung)

Ich habe ziemlich jedes python-HTTP-Bibliothek, aber keiner von Ihnen erfüllen meine Anforderungen. Zum Beispiel:

urllib2: gut, aber kein pooling

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)

Anforderungen: keine max Größe

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: nie bekam Sie die "read" - Methode zu arbeiten, auch mit einer 50MB-Datei ...

httplib: httplib.HTTPConnection ist kein pool (nur eine Verbindung)

Kann ich kaum glauben, dass die urllib2 ist der beste HTTP-Bibliothek, die ich nutzen kann ! Also, wenn jemand weiß, was librairy können dies tun, oder wie eine der früheren librairy ...

EDIT:

Die beste Lösung, die ich gefunden Dank Martijn Pieters (StringIO nicht langsam nach unten, auch für große Dateien, wo str Ergänzung nicht viele).

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()
  • Am ctt.write(chunk) Zeile bekomme ich einen TypeError: string argument expected, got 'bytes'
Schreibe einen Kommentar