From aaa3facd7113f68e621eb41560a8b092f02f4efa Mon Sep 17 00:00:00 2001 From: Piper Merriam Date: Tue, 30 Aug 2016 11:19:58 -0600 Subject: [PATCH] switch away from monkeypatching --- conftest.py | 15 +++++---------- setup.py | 2 +- web3/providers/rpc.py | 33 +++++++++++++++++++-------------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/conftest.py b/conftest.py index 21aa6fe..bac2eab 100644 --- a/conftest.py +++ b/conftest.py @@ -6,15 +6,8 @@ import random import pytest import gevent -from gevent import monkey from gevent import socket -# needed to use the requests library -monkey.patch_socket() -monkey.patch_select() - -import requests # noqa: E402 - from geth import ( # noqa: E402 LoggingMixin, DevGethProcess, @@ -37,10 +30,12 @@ def get_open_port(): def wait_for_http_connection(port, timeout=60): with gevent.Timeout(timeout): while True: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.timeout = 1 try: - requests.post("http://127.0.0.1:{0}".format(port)) - except requests.ConnectionError: - gevent.sleep(0.1) + s.connect(('127.0.0.1', port)) + except (socket.timeout, ConnectionRefusedError): + gevent.sleep(random.random()) continue else: break diff --git a/setup.py b/setup.py index c2298d6..58ccaeb 100644 --- a/setup.py +++ b/setup.py @@ -26,9 +26,9 @@ setup( include_package_data=True, install_requires=[ "pysha3>=0.3", - "requests>=2.10.0", "rlp>=0.4.6", "gevent>=1.1.1", + "geventhttpclient>=1.3.1", "ethereum-abi-utils>=0.2.1", "pysha3>=0.3", ], diff --git a/web3/providers/rpc.py b/web3/providers/rpc.py index 628c179..60df18f 100644 --- a/web3/providers/rpc.py +++ b/web3/providers/rpc.py @@ -1,18 +1,12 @@ +import contextlib import gevent -from gevent import monkey - - -monkey.patch_socket() -monkey.patch_select() +from geventhttpclient import HTTPClient from .base import BaseProvider # noqa: E402 -import requests # noqa: E402 - class RPCProvider(BaseProvider): - def __init__(self, host="127.0.0.1", port="8545", *args, **kwargs): self.host = host self.port = port @@ -20,14 +14,25 @@ class RPCProvider(BaseProvider): super(RPCProvider, self).__init__(*args, **kwargs) def make_request(self, method, params): - request = self.encode_rpc_request(method, params) - response = requests.post( - "http://{host}:{port}/".format(host=self.host, port=self.port), - headers={'content-type': 'application/json'}, - data=request + from web3 import __version__ as web3_version + request_data = self.encode_rpc_request(method, params) + request_user_agent = 'Web3.py/{version}/{class_name}'.format( + version=web3_version, + class_name=type(self), ) + client = HTTPClient( + host=self.host, + port=self.port, + headers={ + 'Content-Type': 'application/json', + 'User-Agent': request_user_agent, + }, + ) + with contextlib.closing(client): + response = client.post('/', body=request_data) + response_body = response.read() - return response.text + return response_body def is_testrpc_available():