IncompleteRead za pomocą httplib

Mam ciągły problem z uzyskaniem kanału RSS z określonej strony internetowej. Napisałem dość brzydką procedurę, aby wykonać tę funkcję, ale jestem ciekaw, dlaczego tak się dzieje i czy jakikolwiek interfejs wyższego poziomu radzi sobie z tym problemem poprawnie. Ten problem nie jest tak naprawdę ogranicznikiem, ponieważ nie muszę bardzo często pobierać kanału.

Przeczytałem rozwiązanie, które wychwytuje wyjątek i zwraca częściową zawartość, ale ponieważ niekompletne odczyty różnią się ilością bajtów, które są faktycznie pobierane, nie mam pewności, że takie rozwiązanie rzeczywiście zadziała.

#!/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)

Jak już powiedziano, nie jest to problem o znaczeniu krytycznym, ale ciekawostka, ponieważ chociaż mogę się spodziewać, że urllib2 będzie miał ten problem, jestem zaskoczony, że ten błąd występuje również w mechanizowaniu i żądaniach. Moduł feedparser nawet nie zgłasza błędu, więc sprawdzenie błędów zależy od obecności klucza „bozo_exception”.

Edytuj: Chciałem tylko wspomnieć, że zarówno wget, jak i curl wykonują tę funkcję bezbłędnie, pobierając pełny ładunek za każdym razem. Muszę jeszcze znaleźć czystą metodę Pythona, z wyjątkiem mojego brzydkiego hacka, i jestem bardzo ciekawy, co dzieje się na zapleczu httplib. Na skowronku postanowiłem też spróbować tego dnia ze skrętem i uzyskać ten sam błąd httplib.

P.S. Jest też jedna rzecz, która również wydaje mi się bardzo dziwna. IncompleteRead odbywa się konsekwentnie na jednym z dwóch punktów przerwania w ładunku. Wydaje się, że feedparser i żądania nie działają po odczytaniu 926 bajtów, jednak mechanize i urllib2 zawodzą po odczytaniu 1854 bajtów. To zachowanie jest zgodne i pozostaję bez wyjaśnienia lub zrozumienia.

questionAnswers(3)

yourAnswerToTheQuestion