From a2aef721d81eeb76b5272b544f96e81d164ad7ee Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 18 Dec 2018 21:48:55 +0100 Subject: [PATCH] add timeout to net.http_get() and index.download_repo_index() The requests docs recommend this: http://docs.python-requests.org/en/master/user/quickstart/#timeouts And mirror-monitor was hanging forever on a bad mirror. --- fdroidserver/index.py | 4 ++-- fdroidserver/net.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 1ce940b3..7585563f 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -686,7 +686,7 @@ def get_mirror_service_urls(url): return urls -def download_repo_index(url_str, etag=None, verify_fingerprint=True): +def download_repo_index(url_str, etag=None, verify_fingerprint=True, timeout=600): """Downloads and verifies index file, then returns its data. Downloads the repository index from the given :param url_str and @@ -710,7 +710,7 @@ def download_repo_index(url_str, etag=None, verify_fingerprint=True): fingerprint = query['fingerprint'][0] url = urllib.parse.SplitResult(url.scheme, url.netloc, url.path + '/index-v1.jar', '', '') - download, new_etag = net.http_get(url.geturl(), etag) + download, new_etag = net.http_get(url.geturl(), etag, timeout) if download is None: return None, new_etag diff --git a/fdroidserver/net.py b/fdroidserver/net.py index 7e8821ea..b9ddf72b 100644 --- a/fdroidserver/net.py +++ b/fdroidserver/net.py @@ -36,7 +36,7 @@ def download_file(url, local_filename=None, dldir='tmp'): return local_filename -def http_get(url, etag=None): +def http_get(url, etag=None, timeout=600): """ Downloads the content from the given URL by making a GET request. @@ -52,12 +52,12 @@ def http_get(url, etag=None): # TODO disable TLS Session IDs and TLS Session Tickets # (plain text cookie visible to anyone who can see the network traffic) if etag: - r = requests.head(url, headers=headers) + r = requests.head(url, headers=headers, timeout=timeout) r.raise_for_status() if 'ETag' in r.headers and etag == r.headers['ETag']: return None, etag - r = requests.get(url, headers=headers) + r = requests.get(url, headers=headers, timeout=timeout) r.raise_for_status() new_etag = None