Skip to content

Commit e98ad53

Browse files
committed
Replaced urllib with httpx. Supports HTTP/2, more convenient and secure.
Fixes exception raising.
1 parent 11f7632 commit e98ad53

13 files changed

+102
-186
lines changed

ipwhois/asn.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ def parse_fields_dns(self, response):
165165
except Exception as e:
166166

167167
raise ASNParseError('Parsing failed for "{0}" with exception: {1}.'
168-
''.format(response, e)[:100])
168+
''.format(response, e)[:100]) from e
169169

170170
return ret
171171

@@ -222,7 +222,7 @@ def parse_fields_verbose_dns(self, response):
222222
except Exception as e:
223223

224224
raise ASNParseError('Parsing failed for "{0}" with exception: {1}.'
225-
''.format(response, e)[:100])
225+
''.format(response, e)[:100]) from e
226226

227227
return ret
228228

@@ -279,7 +279,7 @@ def parse_fields_whois(self, response):
279279
except Exception as e:
280280

281281
raise ASNParseError('Parsing failed for "{0}" with exception: {1}.'
282-
''.format(response, e)[:100])
282+
''.format(response, e)[:100]) from e
283283

284284
return ret
285285

@@ -379,7 +379,7 @@ def parse_fields_http(self, response, extra_org_map=None):
379379
except Exception as e: # pragma: no cover
380380

381381
raise ASNParseError('Parsing failed for "{0}" with exception: {1}.'
382-
''.format(response, e)[:100])
382+
''.format(response, e)[:100]) from e
383383

384384
return asn_data
385385

ipwhois/experimental.py

+14-14
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,16 @@ def get_bulk_asn_whois(addresses=None, retry_count=3, timeout=120):
103103

104104
else:
105105

106-
raise ASNLookupError('ASN bulk lookup failed.')
106+
raise ASNLookupError('ASN bulk lookup failed.') from e
107107

108-
except: # pragma: no cover
108+
except BaseException as e: # pragma: no cover
109109

110-
raise ASNLookupError('ASN bulk lookup failed.')
110+
raise ASNLookupError('ASN bulk lookup failed.') from e
111111

112112

113113
def bulk_lookup_rdap(addresses=None, inc_raw=False, retry_count=3, depth=0,
114114
excluded_entities=None, rate_limit_timeout=60,
115-
socket_timeout=10, asn_timeout=240, proxy_openers=None):
115+
socket_timeout=10, asn_timeout=240, http_clients=None):
116116
"""
117117
The function for bulk retrieving and parsing whois information for a list
118118
of IP addresses via HTTP (RDAP). This bulk lookup method uses bulk
@@ -138,8 +138,8 @@ def bulk_lookup_rdap(addresses=None, inc_raw=False, retry_count=3, depth=0,
138138
connections in seconds. Defaults to 10.
139139
asn_timeout (:obj:`int`): The default timeout for bulk ASN lookups in
140140
seconds. Defaults to 240.
141-
proxy_openers (:obj:`list` of :obj:`OpenerDirector`): Proxy openers
142-
for single/rotating proxy support. Defaults to None.
141+
http_clients (:obj:`list` of :obj:`httpx.Client`): httpx clients
142+
for single/rotating proxy and fingerprint support. Defaults to None.
143143
144144
Returns:
145145
namedtuple:
@@ -209,11 +209,11 @@ def bulk_lookup_rdap(addresses=None, inc_raw=False, retry_count=3, depth=0,
209209
}
210210
asn_parsed_results = {}
211211

212-
if proxy_openers is None:
212+
if http_clients is None:
213213

214-
proxy_openers = [None]
214+
http_clients = [None]
215215

216-
proxy_openers_copy = iter(proxy_openers)
216+
http_clients_copy = iter(http_clients)
217217

218218
# Make sure addresses is unique
219219
unique_ip_list = list(unique_everseen(addresses))
@@ -347,19 +347,19 @@ def bulk_lookup_rdap(addresses=None, inc_raw=False, retry_count=3, depth=0,
347347

348348
rate_tracker[rir]['count'] += 1
349349

350-
# Get the next proxy opener to use, or None
350+
# Get the next HTTP client object to use, or None
351351
try:
352352

353-
opener = next(proxy_openers_copy)
353+
client = next(http_clients_copy)
354354

355355
# Start at the beginning if all have been used
356356
except StopIteration:
357357

358-
proxy_openers_copy = iter(proxy_openers)
359-
opener = next(proxy_openers_copy)
358+
http_clients_copy = iter(http_clients)
359+
client = next(http_clients_copy)
360360

361361
# Instantiate the objects needed for the RDAP lookup
362-
net = Net(ip, timeout=socket_timeout, proxy_opener=opener)
362+
net = Net(ip, timeout=socket_timeout, http_client=client)
363363
rdap = RDAP(net)
364364

365365
try:

ipwhois/ipwhois.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@ class IPWhois:
4040
An IPv4 or IPv6 address
4141
timeout (:obj:`int`): The default timeout for socket connections in
4242
seconds. Defaults to 5.
43-
proxy_opener (:obj:`urllib.request.OpenerDirector`): The request for
44-
proxy support. Defaults to None.
43+
http_client (:obj:`httpx.Client`): HTTP client object. Proxies are here.
44+
Defaults to None.
4545
"""
4646

47-
def __init__(self, address, timeout=5, proxy_opener=None):
47+
def __init__(self, address, timeout=5, http_client=None):
4848

4949
self.net = Net(
50-
address=address, timeout=timeout, proxy_opener=proxy_opener
50+
address=address, timeout=timeout, http_client=http_client
5151
)
5252
self.ipasn = IPASN(self.net)
5353

@@ -61,7 +61,7 @@ def __init__(self, address, timeout=5, proxy_opener=None):
6161
def __repr__(self):
6262

6363
return 'IPWhois({0}, {1}, {2})'.format(
64-
self.address_str, str(self.timeout), repr(self.net.opener)
64+
self.address_str, str(self.timeout), repr(self.net.http_client)
6565
)
6666

6767
def lookup_whois(self, inc_raw=False, retry_count=3, get_referral=False,

0 commit comments

Comments
 (0)