diff --git a/dev-python/urllib3/Manifest b/dev-python/urllib3/Manifest
new file mode 100644
index 00000000..3ca389bf
--- /dev/null
+++ b/dev-python/urllib3/Manifest
@@ -0,0 +1 @@
+DIST urllib3-1.25.8.tar.gz 261077 BLAKE2B 9625c8bce484e3a0ae8b49a776377d5420a496652d75220438f8f9cfbfa96c22a6fbea29380f45f18d8620d14568056dcb3e8b6a08fe711085298d2f6b2ea870 SHA512 6e380d98d9a8b06534abfab4eb67b685a8311a091e31adcefe2b0ffc61d2b728229df067790b20358f2646e9054a546450c3351e4aa618f31d85573ea50ceaa2
diff --git a/dev-python/urllib3/files/urllib3-1.26.4-test-ssltransport.patch b/dev-python/urllib3/files/urllib3-1.26.4-test-ssltransport.patch
new file mode 100644
index 00000000..346574fe
--- /dev/null
+++ b/dev-python/urllib3/files/urllib3-1.26.4-test-ssltransport.patch
@@ -0,0 +1,31 @@
+diff --git a/test/test_ssltransport.py b/test/test_ssltransport.py
+index 72b06b006..98682bd43 100644
+--- a/test/test_ssltransport.py
++++ b/test/test_ssltransport.py
+@@ -246,6 +246,7 @@ def proxy_handler(listener):
+ )
+ self._read_write_loop(client_sock, upstream_sock)
+ upstream_sock.close()
++ client_sock.close()
+
+ self._start_server(proxy_handler)
+
+@@ -274,6 +275,10 @@ def _read_write_loop(self, client_sock, server_sock, chunks=65536):
+ if write_socket in writable:
+ try:
+ b = read_socket.recv(chunks)
++ if len(b) == 0:
++ # One of the sockets has EOFed, we return to close
++ # both.
++ return
+ write_socket.send(b)
+ except ssl.SSLEOFError:
+ # It's possible, depending on shutdown order, that we'll
+@@ -322,6 +327,7 @@ def socket_handler(listener):
+ request = consume_socket(ssock)
+ validate_request(request)
+ ssock.send(sample_response())
++ sock.close()
+
+ cls._start_server(socket_handler)
+
diff --git a/dev-python/urllib3/metadata.xml b/dev-python/urllib3/metadata.xml
new file mode 100644
index 00000000..7e9d137e
--- /dev/null
+++ b/dev-python/urllib3/metadata.xml
@@ -0,0 +1,17 @@
+
+
+
+
+ python@gentoo.org
+ Python
+
+
+
+
+ urllib3
+ cpe:/a:urllib3:urllib3
+ urllib3/urllib3
+
+
diff --git a/dev-python/urllib3/urllib3-1.25.8.ebuild b/dev-python/urllib3/urllib3-1.25.8.ebuild
new file mode 100644
index 00000000..0b09d4ad
--- /dev/null
+++ b/dev-python/urllib3/urllib3-1.25.8.ebuild
@@ -0,0 +1,97 @@
+# Copyright 1999-2021 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6..10} pypy3 )
+PYTHON_REQ_USE="ssl(+)"
+
+inherit distutils-r1
+
+DESCRIPTION="HTTP library with thread-safe connection pooling, file post, and more"
+HOMEPAGE="https://github.com/urllib3/urllib3"
+SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~mips ppc ppc64 ~riscv ~s390 sparc x86 ~x64-cygwin ~amd64-linux ~ppc-macos ~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+IUSE="brotli test"
+RESTRICT="!test? ( test )"
+
+# dev-python/{pyopenssl,cryptography,idna,certifi} are optional runtime
+# dependencies. Do not add them to RDEPEND. They should be unnecessary with
+# modern versions of python (>= 3.2).
+RDEPEND="
+ >=dev-python/PySocks-1.5.8[${PYTHON_USEDEP}]
+ =dev-python/trustme-0.5.3[\${PYTHON_USEDEP}]
+ >=www-servers/tornado-4.2.1[\${PYTHON_USEDEP}]
+ " python3_{6,7,8,9})
+ )
+"
+
+PATCHES=(
+ "${FILESDIR}/${P}-test-ssltransport.patch"
+)
+
+python_prepare_all() {
+ # tests failing if 'localhost.' cannot be resolved
+ sed -e 's:test_dotted_fqdn:_&:' \
+ -i test/with_dummyserver/test_https.py || die
+ sed -e 's:test_request_host_header_ignores_fqdn_dot:_&:' \
+ -i test/with_dummyserver/test_socketlevel.py || die
+
+ distutils-r1_python_prepare_all
+}
+
+python_test() {
+ local -x CI=1
+ # FIXME: get tornado ported
+ [[ ${EPYTHON} == python3* ]] || continue
+ # tests skipped for now
+ [[ ${EPYTHON} == python3.10 ]] && continue
+
+ local deselect=(
+ # TODO?
+ test/with_dummyserver/test_socketlevel.py::TestSocketClosing::test_timeout_errors_cause_retries
+ )
+ [[ "${EPYTHON}" == python3.10 ]] && deselect+=(
+ # Fail because they rely on warnings and there are new deprecation warnings in 3.10
+ test/with_dummyserver/test_https.py::TestHTTPS::test_verified
+ test/with_dummyserver/test_https.py::TestHTTPS::test_verified_with_context
+ test/with_dummyserver/test_https.py::TestHTTPS::test_context_combines_with_ca_certs
+ test/with_dummyserver/test_https.py::TestHTTPS::test_ca_dir_verified
+ test/with_dummyserver/test_https.py::TestHTTPS::test_ssl_correct_system_time
+ test/with_dummyserver/test_https.py::TestHTTPS::test_ssl_wrong_system_time
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_2::test_verified
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_2::test_verified_with_context
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_2::test_context_combines_with_ca_certs
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_2::test_ca_dir_verified
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_2::test_ssl_correct_system_time
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_2::test_ssl_wrong_system_time
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_2::test_default_tls_version_deprecations
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_2::test_no_tls_version_deprecation_with_ssl_version
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_2::test_no_tls_version_deprecation_with_ssl_context
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_3::test_verified
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_3::test_verified_with_context
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_3::test_context_combines_with_ca_certs
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_3::test_ca_dir_verified
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_3::test_ssl_correct_system_time
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_3::test_ssl_wrong_system_time
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_3::test_default_tls_version_deprecations
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_3::test_no_tls_version_deprecation_with_ssl_version
+ test/with_dummyserver/test_https.py::TestHTTPS_TLSv1_3::test_no_tls_version_deprecation_with_ssl_context
+ )
+
+ epytest ${deselect[@]/#/--deselect }
+}