IncompleteRead mit httplib

Ich habe ein anhaltendes Problem damit, einen RSS-Feed von einer bestimmten Website zu erhalten. Ich habe eine ziemlich hässliche Prozedur geschrieben, um diese Funktion auszuführen, aber ich bin neugierig, warum dies passiert und ob Schnittstellen höherer Ebenen dieses Problem richtig behandeln. Dieses Problem ist nicht wirklich ein Show Stopper, da ich den Feed nicht sehr oft abrufen muss.

Ich habe eine Lösung gelesen, die die Ausnahme abfängt und den Teilinhalt zurückgibt. Da sich die unvollständigen Lesevorgänge jedoch in der Anzahl der tatsächlich abgerufenen Bytes unterscheiden, habe ich keine Gewissheit, dass eine solche Lösung tatsächlich funktioniert.

#!/usr/bin/env python
import os
import sys
import feedparser
from mechanize import Browser
import requests
import urllib2
from httplib import IncompleteRead

url = 'http://hattiesburg.legistar.com/Feed.ashx?M=Calendar&ID=543375&GUID=83d4a09c-6b40-4300-a04b-f88884048d49&Mode=2013&Title=City+of+Hattiesburg%2c+MS+-+Calendar+(2013)'

content = feedparser.parse(url)
if 'bozo_exception' in content:
    print content['bozo_exception']
else:
    print "Success!!"
    sys.exit(0)

print "If you see this, please tell me what happened."

# try using mechanize
b = Browser()
r = b.open(url)
try:
    r.read()
except IncompleteRead, e:
    print "IncompleteRead using mechanize", e

# try using urllib2
r = urllib2.urlopen(url)
try:
    r.read()
except IncompleteRead, e:
    print "IncompleteRead using urllib2", e


# try using requests
try:
    r = requests.request('GET', url)
except IncompleteRead, e:
    print "IncompleteRead using requests", e

# this function is old and I categorized it as ...
# "at least it works darnnit!", but I would really like to 
# learn what's happening.  Please help me put this function into
# eternal rest.
def get_rss_feed(url):
    response = urllib2.urlopen(url)
    read_it = True
    content = ''
    while read_it:
        try:
            content += response.read(1)
        except IncompleteRead:
            read_it = False
    return content, response.info()


content, info = get_rss_feed(url)

feed = feedparser.parse(content)

Wie bereits erwähnt, ist dies kein unternehmenskritisches Problem, aber dennoch eine Kuriosität. Auch wenn ich davon ausgehen kann, dass urllib2 dieses Problem hat, bin ich überrascht, dass dieser Fehler auch bei der Mechanisierung und bei Anfragen auftritt. Das Feedparser-Modul gibt nicht einmal einen Fehler aus. Die Überprüfung auf Fehler hängt daher vom Vorhandensein eines Schlüssels 'bozo_exception' ab.

Bearbeiten: Ich wollte nur erwähnen, dass sowohl Wget als auch Curl die Funktion fehlerfrei ausführen und jedes Mal die volle Nutzlast korrekt abrufen. Ich habe bis auf meinen hässlichen Hack noch keine reine Python-Methode gefunden und bin sehr gespannt, was auf dem Backend von httplib passiert. Aus Versehen habe ich mich dazu entschlossen, dies neulich auch mit Twill zu versuchen und habe den gleichen httplib-Fehler erhalten.

P.S. Es gibt eine Sache, die mir auch sehr merkwürdig vorkommt. Das IncompleteRead geschieht konsistent an einem von zwei Haltepunkten in der Nutzlast. Es scheint, dass Feedparser und Anforderungen nach dem Lesen von 926 Bytes fehlschlagen, Mechanize und urllib2 jedoch nach dem Lesen von 1854 Bytes fehlschlagen. Dieses Verhalten ist konsistent und ich habe keine Erklärung oder Verständnis dafür.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage