diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2019-02-27 04:14:04 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-02-27 04:14:04 +0000 |
commit | 84b28b3f940ca7510765882cbbfeff5bbe64860c (patch) | |
tree | 8d036b85bcd46a445ab961acbea273539d570980 | |
parent | 362960bc76c00d38657221e89a8d9ed253223869 (diff) | |
parent | 2f4eea998dae784f2c66396a73d525ba3f53bfb0 (diff) | |
download | httplib2-android10-release.tar.gz |
Snap for 5339364 from 2f4eea998dae784f2c66396a73d525ba3f53bfb0 to qt-releaseandroid-vts-10.0_r9android-vts-10.0_r8android-vts-10.0_r7android-vts-10.0_r6android-vts-10.0_r5android-vts-10.0_r4android-vts-10.0_r3android-vts-10.0_r2android-vts-10.0_r16android-vts-10.0_r15android-vts-10.0_r14android-vts-10.0_r13android-vts-10.0_r12android-vts-10.0_r11android-vts-10.0_r10android-vts-10.0_r1android-security-10.0.0_r75android-security-10.0.0_r74android-security-10.0.0_r73android-security-10.0.0_r72android-security-10.0.0_r71android-security-10.0.0_r70android-security-10.0.0_r69android-security-10.0.0_r68android-security-10.0.0_r67android-security-10.0.0_r66android-security-10.0.0_r65android-security-10.0.0_r64android-security-10.0.0_r63android-security-10.0.0_r62android-security-10.0.0_r61android-security-10.0.0_r60android-security-10.0.0_r59android-security-10.0.0_r58android-security-10.0.0_r57android-security-10.0.0_r56android-security-10.0.0_r55android-security-10.0.0_r54android-security-10.0.0_r53android-security-10.0.0_r52android-security-10.0.0_r51android-security-10.0.0_r50android-security-10.0.0_r49android-security-10.0.0_r48android-mainline-10.0.0_r3android-mainline-10.0.0_r2android-mainline-10.0.0_r1android-cts-10.0_r9android-cts-10.0_r8android-cts-10.0_r7android-cts-10.0_r6android-cts-10.0_r5android-cts-10.0_r4android-cts-10.0_r3android-cts-10.0_r2android-cts-10.0_r16android-cts-10.0_r15android-cts-10.0_r14android-cts-10.0_r13android-cts-10.0_r12android-cts-10.0_r11android-cts-10.0_r10android-cts-10.0_r1android-10.0.0_r6android-10.0.0_r5android-10.0.0_r47android-10.0.0_r46android-10.0.0_r4android-10.0.0_r3android-10.0.0_r2android-10.0.0_r17android-10.0.0_r11android-10.0.0_r10android-10.0.0_r1android10-tests-releaseandroid10-security-releaseandroid10-s3-releaseandroid10-s2-releaseandroid10-s1-releaseandroid10-releaseandroid10-mainline-releaseandroid10-mainline-a-releaseandroid10-gsi
Change-Id: I44270cdff9aa8b1ff656307ea2c58ff373b51ebd
-rw-r--r-- | .travis.yml | 9 | ||||
-rw-r--r-- | CHANGELOG | 9 | ||||
-rw-r--r-- | METADATA | 6 | ||||
-rw-r--r-- | python2/httplib2/__init__.py | 12 | ||||
-rw-r--r-- | python3/httplib2/__init__.py | 10 | ||||
-rwxr-xr-x | setup.py | 7 | ||||
-rw-r--r-- | tests/test_other.py | 26 |
7 files changed, 68 insertions, 11 deletions
diff --git a/.travis.yml b/.travis.yml index 8e0a165..57991d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ -sudo: false language: python +dist: xenial cache: apt: true @@ -16,7 +16,7 @@ python: - 3.4 - 3.5 - 3.6 - - pypy + - 3.7 matrix: fast_finish: true install: pip install $pip_install_common 'codecov>=2.0.15' -r requirements-test.txt @@ -28,6 +28,11 @@ stages: jobs: include: - stage: test + python: pypy + dist: trusty + install: pip install $pip_install_common 'codecov>=2.0.15' -r requirements-test.txt + script: script/test -sv && codecov + - stage: test env: _=py2-pep8 python: 2.7 install: pip install -r requirements-test.txt @@ -1,3 +1,12 @@ +0.12.1 + + Catch socket timeouts and clear dead connection + https://github.com/httplib2/httplib2/issues/18 + https://github.com/httplib2/httplib2/pull/111 + + Officially support Python 3.7 (package metadata) + https://github.com/httplib2/httplib2/issues/123 + 0.12.0 Drop support for Python 3.3 @@ -7,12 +7,12 @@ third_party { } url { type: GIT - value: "https://github.com/httplib2/httplib2/" + value: "https://github.com/httplib2/httplib2.git" } - version: "v0.12.0" + version: "v0.12.1" last_upgrade_date { year: 2019 month: 2 - day: 1 + day: 21 } } diff --git a/python2/httplib2/__init__.py b/python2/httplib2/__init__.py index b89f2fe..fee091d 100644 --- a/python2/httplib2/__init__.py +++ b/python2/httplib2/__init__.py @@ -19,7 +19,7 @@ __contributors__ = [ "Alex Yu", ] __license__ = "MIT" -__version__ = '0.12.0' +__version__ = '0.12.1' import base64 import calendar @@ -1924,6 +1924,8 @@ class Http(object): being and instance of the 'Response' class, the second being a string that contains the response entity body. """ + conn_key = '' + try: if headers is None: headers = {} @@ -2133,13 +2135,19 @@ class Http(object): cachekey, ) except Exception as e: + is_timeout = isinstance(e, socket.timeout) + if is_timeout: + conn = self.connections.pop(conn_key, None) + if conn: + conn.close() + if self.force_exception_to_status_code: if isinstance(e, HttpLib2ErrorWithResponse): response = e.response content = e.content response.status = 500 response.reason = str(e) - elif isinstance(e, socket.timeout): + elif is_timeout: content = "Request Timeout" response = Response( { diff --git a/python3/httplib2/__init__.py b/python3/httplib2/__init__.py index b1b86f4..8b64c41 100644 --- a/python3/httplib2/__init__.py +++ b/python3/httplib2/__init__.py @@ -15,7 +15,7 @@ __contributors__ = [ "Alex Yu", ] __license__ = "MIT" -__version__ = '0.12.0' +__version__ = '0.12.1' import base64 import calendar @@ -1722,6 +1722,8 @@ The return value is a tuple of (response, content), the first being and instance of the 'Response' class, the second being a string that contains the response entity body. """ + conn_key = '' + try: if headers is None: headers = {} @@ -1924,6 +1926,12 @@ a string that contains the response entity body. cachekey, ) except Exception as e: + is_timeout = isinstance(e, socket.timeout) + if is_timeout: + conn = self.connections.pop(conn_key, None) + if conn: + conn.close() + if self.force_exception_to_status_code: if isinstance(e, HttpLib2ErrorWithResponse): response = e.response @@ -4,7 +4,7 @@ import setuptools.command.test import sys pkgdir = {"": "python%s" % sys.version_info[0]} -VERSION = '0.12.0' +VERSION = '0.12.1' # `python setup.py test` uses existing Python environment, no virtualenv, no pip. @@ -87,7 +87,7 @@ A comprehensive HTTP client library, ``httplib2`` supports many features left ou package_data={"httplib2": ["*.txt"]}, tests_require=read_requirements("requirements-test.txt"), cmdclass={"test": TestCommand}, - classifiers=( + classifiers=[ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", @@ -100,7 +100,8 @@ A comprehensive HTTP client library, ``httplib2`` supports many features left ou "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries", - ), + ], ) diff --git a/tests/test_other.py b/tests/test_other.py index f714c61..f87cfbd 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -108,6 +108,32 @@ def test_timeout_individual(): assert response.reason.startswith("Request Timeout") +def test_timeout_subsequent(): + class Handler(object): + number = 0 + + @classmethod + def handle(cls, request): + # request.number is always 1 because of + # the new socket connection each time + cls.number += 1 + if cls.number % 2 != 0: + time.sleep(0.6) + return tests.http_response_bytes(status=500) + return tests.http_response_bytes(status=200) + + http = httplib2.Http(timeout=0.5) + http.force_exception_to_status_code = True + + with tests.server_request(Handler.handle, request_count=2) as uri: + response, _ = http.request(uri) + assert response.status == 408 + assert response.reason.startswith("Request Timeout") + + response, _ = http.request(uri) + assert response.status == 200 + + def test_timeout_https(): c = httplib2.HTTPSConnectionWithTimeout("localhost", 80, timeout=47) assert 47 == c.timeout |