Adding necessary exception handling to text view.

This commit is contained in:
Samuel Clay 2013-07-15 11:06:50 -07:00
parent fe1d7177ec
commit 679195aadd
4 changed files with 42 additions and 13 deletions

View file

@ -1848,9 +1848,10 @@ class MStory(mongo.Document):
def fetch_original_text(self, force=False, request=None): def fetch_original_text(self, force=False, request=None):
original_text_z = self.original_text_z original_text_z = self.original_text_z
feed = Feed.get_by_id(self.story_feed_id)
if not original_text_z or force: if not original_text_z or force:
ti = TextImporter(self, request=request) ti = TextImporter(self, feed=feed, request=request)
original_text = ti.fetch() original_text = ti.fetch()
else: else:
logging.user(request, "~FYFetching ~FGoriginal~FY story text, ~SBfound.") logging.user(request, "~FYFetching ~FGoriginal~FY story text, ~SBfound.")
@ -1958,9 +1959,10 @@ class MStarredStory(mongo.Document):
def fetch_original_text(self, force=False, request=None): def fetch_original_text(self, force=False, request=None):
original_text_z = self.original_text_z original_text_z = self.original_text_z
feed = Feed.get_by_id(self.story_feed_id)
if not original_text_z or force: if not original_text_z or force:
ti = TextImporter(self, request=request) ti = TextImporter(self, feed, request=request)
original_text = ti.fetch() original_text = ti.fetch()
else: else:
logging.user(request, "~FYFetching ~FGoriginal~FY story text, ~SBfound.") logging.user(request, "~FYFetching ~FGoriginal~FY story text, ~SBfound.")

View file

@ -1,33 +1,50 @@
import requests import requests
import zlib import zlib
from django.conf import settings from django.conf import settings
from socket import error as SocketError
from vendor.readability import readability from vendor.readability import readability
from utils import log as logging from utils import log as logging
from utils.feed_functions import timelimit, TimeoutError
class TextImporter: class TextImporter:
def __init__(self, story, request=None): def __init__(self, story, feed, request=None):
self.story = story self.story = story
self.feed = feed
self.request = request self.request = request
@property @property
def headers(self): def headers(self):
return { return {
'User-Agent': 'NewsBlur Content Fetcher - %s ' 'User-Agent': 'NewsBlur Content Fetcher - %s subscriber%s - %s '
'(Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_1) ' '(Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_1) '
'AppleWebKit/534.48.3 (KHTML, like Gecko) Version/5.1 ' 'AppleWebKit/534.48.3 (KHTML, like Gecko) Version/5.1 '
'Safari/534.48.3)' % ( 'Safari/534.48.3)' % (
settings.NEWSBLUR_URL self.feed.num_subscribers,
's' if self.feed.num_subscribers != 1 else '',
self.feed.permalink,
), ),
'Connection': 'close', 'Connection': 'close',
} }
def fetch(self, skip_save=False): def fetch(self, skip_save=False):
html = requests.get(self.story.story_permalink, headers=self.headers, verify=False) try:
text = html.text resp = self.fetch_request()
if html.encoding and html.encoding != 'utf-8': except TimeoutError:
text = text.encode(html.encoding) logging.user(self.request, "~SN~FRFailed~FY to fetch ~FGoriginal text~FY: timed out")
original_text_doc = readability.Document(text, url=html.url, debug=settings.DEBUG) resp = None
if not resp:
return
try:
text = resp.text
except (LookupError, TypeError):
text = resp.content
if resp.encoding and resp.encoding != 'utf-8':
text = text.encode(resp.encoding)
original_text_doc = readability.Document(text, url=resp.url, debug=settings.DEBUG)
content = original_text_doc.summary(html_partial=True) content = original_text_doc.summary(html_partial=True)
if content: if content:
@ -44,3 +61,12 @@ class TextImporter:
)), warn_color=False) )), warn_color=False)
return content return content
@timelimit(10)
def fetch_request(self):
try:
r = requests.get(self.story.story_permalink, headers=self.headers, verify=False)
except (AttributeError, SocketError, requests.ConnectionError), e:
logging.user(self.request, "~SN~FRFailed~FY to fetch ~FGoriginal text~FY: %s" % e)
return
return r

View file

@ -1984,9 +1984,10 @@ class MSharedStory(mongo.Document):
def fetch_original_text(self, force=False, request=None): def fetch_original_text(self, force=False, request=None):
original_text_z = self.original_text_z original_text_z = self.original_text_z
feed = Feed.get_by_id(self.story_feed_id)
if not original_text_z or force: if not original_text_z or force:
ti = TextImporter(self, request=request) ti = TextImporter(self, feed, request=request)
original_text = ti.fetch() original_text = ti.fetch()
else: else:
logging.user(request, "~FYFetching ~FGoriginal~FY story text, ~SBfound.") logging.user(request, "~FYFetching ~FGoriginal~FY story text, ~SBfound.")