utils.request: decorate functions with general try... except...

refs #134
This commit is contained in:
Noam Meltzer 2015-12-26 00:36:06 +02:00
parent 79f29c4b9e
commit 21fdaa4ff7

View file

@ -19,6 +19,7 @@
"""This module contains methods to make POST and GET requests"""
import functools
import json
import socket
from ssl import SSLError
@ -49,7 +50,7 @@ def _parse(json_data):
try:
data = json.loads(decoded_s)
except ValueError:
raise TelegramError('Invalid server response; probably bad token')
raise TelegramError('Invalid server response')
if not data.get('ok') and data.get('description'):
return data['description']
@ -57,6 +58,34 @@ def _parse(json_data):
return data['result']
def _try_except_req(func):
"""Decorator for requests to handle known exceptions"""
@functools.wraps(func)
def decorator(*args, **kwargs):
try:
return func(*args, **kwargs)
except HTTPError as error:
if error.getcode() == 403:
raise TelegramError('Unauthorized')
if error.getcode() == 502:
raise TelegramError('Bad Gateway')
try:
message = _parse(error.read())
except ValueError:
message = 'Unknown HTTPError'
raise TelegramError(message)
except (SSLError, socket.timeout) as error:
if "operation timed out" in str(error):
raise TelegramError("Timed out")
raise TelegramError(str(error))
return decorator
@_try_except_req
def get(url):
"""Request an URL.
Args:
@ -71,6 +100,7 @@ def get(url):
return _parse(result)
@_try_except_req
def post(url,
data,
network_delay=2.):
@ -95,39 +125,22 @@ def post(url,
else:
timeout = None
try:
if InputFile.is_inputfile(data):
data = InputFile(data)
request = Request(url,
data=data.to_form(),
headers=data.headers)
else:
data = json.dumps(data)
request = Request(url,
data=data.encode(),
headers={'Content-Type': 'application/json'})
if InputFile.is_inputfile(data):
data = InputFile(data)
request = Request(url,
data=data.to_form(),
headers=data.headers)
else:
data = json.dumps(data)
request = Request(url,
data=data.encode(),
headers={'Content-Type': 'application/json'})
result = urlopen(request, timeout=timeout).read()
except HTTPError as error:
if error.getcode() == 403:
raise TelegramError('Unauthorized')
if error.getcode() == 502:
raise TelegramError('Bad Gateway')
try:
message = _parse(error.read())
except ValueError:
message = 'Unknown HTTPError'
raise TelegramError(message)
except (SSLError, socket.timeout) as error:
if "operation timed out" in str(error):
raise TelegramError("Timed out")
raise TelegramError(str(error))
result = urlopen(request, timeout=timeout).read()
return _parse(result)
@_try_except_req
def download(url,
filename):
"""Download a file by its URL.