Skip to content

Commit ccbf62d

Browse files
authored
Merge pull request #114 from DomainTools/dev
Dev
2 parents b912f65 + e8013f6 commit ccbf62d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+32809
-32742
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,6 @@ venv/
7272

7373
# Cython
7474
*.c
75+
76+
# Testing folders
77+
proxyTest/

CHANGELOG.md

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,87 @@
1-
Changelog
2-
=========
1+
# Changelog
2+
3+
### 1.0.1
4+
5+
- Adds support for the hourly query limit on the Account API endpoint
6+
- Fixes an issue with handling of proxies
37

48
### 1.0.0
9+
510
- Adding support for Iris Detect API endpoints
611
- Update underlying HTTP client
712
- Addition of helper functions for common tasks
813
- Documentation and example code updates
914

1015
### 0.6.2
16+
1117
- Update README with Iris trademarks
1218

1319
### 0.6.1
20+
1421
- Fix an invalid response type error for available_api_calls on CLI
1522
- Add better error messaging for users when proxy info is not set correctly
1623
- Fix typo on limit_exceeded when outputting formats other than JSON when using non-async results
1724

1825
### 0.6.0
1926

2027
### 0.3.3
28+
2129
- Python 3.5.2 installation fix
2230

2331
### 0.3.1
32+
2433
- Python 3.7.0 Python version check for async fixed
2534

2635
### 0.3.0
36+
2737
- Python 3.7 support as well as general Async fixes and improvements (Thanks @jnwatson)
2838

2939
### 0.2.4
40+
3041
- Enabled rate-limiting support for Iris API endpoints
3142

3243
### 0.2.3
44+
3345
- Added support for Iris Investigate and Enrich
3446

3547
### 0.2.2
48+
3649
- HTTP Authentication fixes
3750
- Initial proxy support
3851

3952
### 0.2.1
53+
4054
- Separated out IncompleteResponseException; enabling partial results to still be read
4155
- Fixed unknown exception handling
4256

4357
### 0.2.0
58+
4459
- Ensure connections are cleaned up
4560

4661
### 0.1.9
62+
4763
- Added support for `risk` and `risk_evidence` API calls
4864

4965
### 0.1.8
66+
5067
- Updated defaults for domain_search call
5168

5269
### 0.1.7
70+
5371
- Fixed typo in registrar information assignment
5472

5573
### 0.1.6
74+
5675
- Added support for Iris endpoint
5776

5877
### 0.1.5
78+
5979
- Made Results a subclass of both MutableMapping and MutableSequence for more natural interaction
6080

6181
### 0.1.4
82+
6283
- Wait to make account information call for rate limiting till a call is made against another API endpoint
6384

6485
### 0.0.1
86+
6587
- Initial Release

domaintools/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@
1919
OTHER DEALINGS IN THE SOFTWARE.
2020
2121
"""
22-
current = "1.0.0"
22+
current = "1.0.1"

domaintools/api.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,25 @@ def __init__(self, username, key, https=True, verify_ssl=True, rate_limit=True,
5757
raise Exception("The DomainTools API endpoints no longer support http traffic. Please make sure https=True.")
5858
if proxy_url:
5959
if isinstance(proxy_url, str):
60-
self.extra_request_params['proxies'] = {'http': proxy_url, 'https': proxy_url}
60+
self.proxy_url = {'http://': proxy_url, 'https://': proxy_url}
6161
else:
6262
raise Exception("Proxy URL must be a string. For example: '127.0.0.1:8888'")
6363

6464
def _rate_limit(self):
6565
"""Pulls in and enforces the latest rate limits for the specified user"""
6666
self.limits_set = True
6767
for product in self.account_information():
68-
self.limits[product['id']] = {'interval': timedelta(seconds=60 / float(product['per_minute_limit']))}
68+
limit_minutes = product['per_minute_limit'] or None
69+
limit_hours = product['per_hour_limit'] or None
70+
71+
default = 3600
72+
hours = limit_hours and 3600 / float(limit_hours)
73+
minutes = limit_minutes and 60 / float(limit_minutes)
74+
75+
self.limits[product['id']] = {'interval': timedelta(
76+
seconds = minutes or hours or default
77+
)
78+
}
6979

7080
def _results(self, product, path, cls=Results, **kwargs):
7181
"""Returns _results for the specified API path with the specified **kwargs parameters"""

domaintools/base_results.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ def _wait_time(self):
5757
return wait_for
5858

5959
def _make_request(self):
60-
with Client(verify=self.api.verify_ssl, proxies=self.api.extra_request_params.get('proxies'), timeout=None) as session:
60+
61+
with Client(verify=self.api.verify_ssl, proxies=self.api.proxy_url, timeout=None) as session:
6162
if self.product in ['iris-investigate', 'iris-enrich', 'iris-detect-escalate-domains']:
6263
post_data = self.kwargs.copy()
6364
post_data.update(self.api.extra_request_params)

domaintools_async/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ async def _make_async_request(self, session):
5959

6060
async def __awaitable__(self):
6161
if self._data is None:
62-
async with AsyncClient(verify=self.api.verify_ssl, proxies=self.api.extra_request_params.get('proxies'), timeout=None) as session:
62+
63+
async with AsyncClient(verify=self.api.verify_ssl, proxies=self.api.proxy_url, timeout=None) as session:
6364
wait_time = self._wait_time()
6465
if wait_time is None and self.api:
6566
try:

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def run_tests(self):
6666
readme = ''
6767

6868
setup(name='domaintools_api',
69-
version='1.0.0',
69+
version='1.0.1',
7070
description="DomainTools Official Python API",
7171
long_description=readme,
7272
long_description_content_type="text/markdown",
Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
11
interactions:
2-
- request:
3-
body: ''
4-
headers:
5-
accept:
6-
- '*/*'
7-
accept-encoding:
8-
- gzip, deflate
9-
connection:
10-
- keep-alive
11-
host:
12-
- api.domaintools.com
13-
user-agent:
14-
- python-httpx/0.22.0
15-
method: GET
16-
uri: https://api.domaintools.com/v1/account?app_name=python_wrapper&app_version=1.0.0
17-
response:
18-
content: '{"response":{"account":{"api_username":"integrations_testing","active":true},"products":[{"id":"account-information","per_month_limit":"100000","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"12"},"expiration_date":null},{"id":"iris-investigate","per_month_limit":"1000","per_minute_limit":"20","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"iris-enrich","per_month_limit":"1000","per_minute_limit":"20","absolute_limit":null,"usage":{"today":"0","month":"5"},"expiration_date":null},{"id":"iris-detect-escalate-domains","per_month_limit":"1500","per_minute_limit":"30","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"iris-detect-ignored-domains","per_month_limit":"1500","per_minute_limit":"30","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"iris-detect-manage-watchlist-domains","per_month_limit":"1500","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"iris-detect-monitors","per_month_limit":"1500","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"iris-detect-new-domains","per_month_limit":"1500","per_minute_limit":"30","absolute_limit":null,"usage":{"today":"0","month":"8"},"expiration_date":null},{"id":"iris-detect-watched-domains","per_month_limit":"1500","per_minute_limit":"30","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"phisheye","per_month_limit":"10000","per_minute_limit":"10","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"domain-profile","per_month_limit":"100000","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"domain-search","per_month_limit":"100000","per_minute_limit":"500","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"hosting-history","per_month_limit":"100000","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"ip-monitor","per_month_limit":"100000","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"ip-registrant-monitor","per_month_limit":"100000","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"iris","per_month_limit":"1000","per_minute_limit":"10","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"reputation","per_month_limit":"100000","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"reverse-ip","per_month_limit":"100000","per_minute_limit":"10","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"reverse-ip-whois","per_month_limit":"100000","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"risk","per_month_limit":"100000","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"risk-evidence","per_month_limit":"100000","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"reverse-name-server","per_month_limit":"100000","per_minute_limit":"10","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"reverse-whois","per_month_limit":"100000","per_minute_limit":"10","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"mark-alert","per_month_limit":"100000","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"parsed-whois","per_month_limit":"100000","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"name-server-monitor","per_month_limit":"100000","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"whois","per_month_limit":"100000","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"whois-history","per_month_limit":"5000","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"parsed-whois-live","per_month_limit":"120","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"registrant-alert","per_month_limit":"100000","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null}]}}'
19-
headers:
20-
Content-Encoding:
21-
- gzip
22-
Content-Type:
23-
- application/json;charset=utf-8
24-
Date:
25-
- Thu, 16 Jun 2022 15:01:58 GMT
26-
Transfer-Encoding:
27-
- chunked
28-
Vary:
29-
- Accept-Encoding
30-
X-TIME:
31-
- '120038'
32-
http_version: HTTP/1.1
33-
status_code: 200
2+
- request:
3+
body: ""
4+
headers:
5+
accept:
6+
- "*/*"
7+
accept-encoding:
8+
- gzip, deflate
9+
connection:
10+
- keep-alive
11+
host:
12+
- api.domaintools.com
13+
user-agent:
14+
- python-httpx/0.22.0
15+
method: GET
16+
uri: https://api.domaintools.com/v1/account?app_name=python_wrapper&app_version=1.0.1
17+
response:
18+
content: '{"response":{"account":{"api_username":"integrations_testing","active":true},"products":[{"id":"account-information","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"12"},"expiration_date":null},{"id":"iris-investigate","per_month_limit":"1000","per_hour_limit":"1","per_minute_limit":"20","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"iris-enrich","per_month_limit":"1000","per_hour_limit":"1","per_minute_limit":"20","absolute_limit":null,"usage":{"today":"0","month":"5"},"expiration_date":null},{"id":"iris-detect-escalate-domains","per_month_limit":"1500","per_hour_limit":"1","per_minute_limit":"30","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"iris-detect-ignored-domains","per_month_limit":"1500","per_hour_limit":"1","per_minute_limit":"30","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"iris-detect-manage-watchlist-domains","per_month_limit":"1500","per_hour_limit":"1","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"iris-detect-monitors","per_month_limit":"1500","per_hour_limit":"1","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"iris-detect-new-domains","per_month_limit":"1500","per_hour_limit":"1","per_minute_limit":"30","absolute_limit":null,"usage":{"today":"0","month":"8"},"expiration_date":null},{"id":"iris-detect-watched-domains","per_month_limit":"1500","per_hour_limit":"1","per_minute_limit":"30","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"phisheye","per_month_limit":"10000","per_hour_limit":"1","per_minute_limit":"10","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"domain-profile","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"domain-search","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"500","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"hosting-history","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"ip-monitor","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"ip-registrant-monitor","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"iris","per_month_limit":"1000","per_hour_limit":"1","per_minute_limit":"10","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"reputation","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"reverse-ip","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"10","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"reverse-ip-whois","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"risk","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"risk-evidence","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"reverse-name-server","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"10","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"reverse-whois","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"10","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"mark-alert","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"parsed-whois","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"name-server-monitor","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"whois","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"whois-history","per_month_limit":"5000","per_hour_limit":"1","per_minute_limit":"120","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"parsed-whois-live","per_month_limit":"120","per_hour_limit":"1","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null},{"id":"registrant-alert","per_month_limit":"100000","per_hour_limit":"1","per_minute_limit":"5","absolute_limit":null,"usage":{"today":"0","month":"0"},"expiration_date":null}]}}'
19+
headers:
20+
Content-Encoding:
21+
- gzip
22+
Content-Type:
23+
- application/json;charset=utf-8
24+
Date:
25+
- Thu, 16 Jun 2022 15:01:58 GMT
26+
Transfer-Encoding:
27+
- chunked
28+
Vary:
29+
- Accept-Encoding
30+
X-TIME:
31+
- "120038"
32+
http_version: HTTP/1.1
33+
status_code: 200
3434
version: 1

tests/fixtures/vcr/test_async_context_manager.yaml

Lines changed: 32 additions & 32 deletions
Large diffs are not rendered by default.

tests/fixtures/vcr/test_async_iteration.yaml

Lines changed: 32 additions & 32 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)