aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2019-02-27 04:14:04 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2019-02-27 04:14:04 +0000
commit84b28b3f940ca7510765882cbbfeff5bbe64860c (patch)
tree8d036b85bcd46a445ab961acbea273539d570980
parent362960bc76c00d38657221e89a8d9ed253223869 (diff)
parent2f4eea998dae784f2c66396a73d525ba3f53bfb0 (diff)
downloadhttplib2-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.yml9
-rw-r--r--CHANGELOG9
-rw-r--r--METADATA6
-rw-r--r--python2/httplib2/__init__.py12
-rw-r--r--python3/httplib2/__init__.py10
-rwxr-xr-xsetup.py7
-rw-r--r--tests/test_other.py26
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
diff --git a/CHANGELOG b/CHANGELOG
index fd29f9f..fc9ef77 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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
diff --git a/METADATA b/METADATA
index 367afc4..d8f0f8a 100644
--- a/METADATA
+++ b/METADATA
@@ -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
diff --git a/setup.py b/setup.py
index 3ac0729..7001022 100755
--- a/setup.py
+++ b/setup.py
@@ -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