Skip to content

Commit 18ffd9c

Browse files
committed
IDEV-2020: Use the FeedsResults class.
1 parent 0c7b051 commit 18ffd9c

File tree

2 files changed

+32
-20
lines changed

2 files changed

+32
-20
lines changed

domaintools/api.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from datetime import datetime, timedelta, timezone
22
from hashlib import sha1, sha256, md5
33
from hmac import new as hmac
4+
from types import GeneratorType
5+
46
import re
57

68
from domaintools.constants import Endpoint, ENDPOINT_TO_SOURCE_MAP, FEEDS_PRODUCTS_LIST, OutputFormat
@@ -11,6 +13,7 @@
1113
ParsedDomainRdap,
1214
Reputation,
1315
Results,
16+
FeedsResults,
1417
)
1518
from domaintools.filters import (
1619
filter_by_riskscore,
@@ -1065,7 +1068,7 @@ def iris_detect_ignored_domains(
10651068
**kwargs,
10661069
)
10671070

1068-
def nod(self, **kwargs):
1071+
def nod(self, **kwargs) -> GeneratorType:
10691072
"""Returns back list of the newly observed domains feed"""
10701073
validate_feeds_parameters(kwargs)
10711074
endpoint = kwargs.pop("endpoint", Endpoint.FEED.value)
@@ -1078,10 +1081,11 @@ def nod(self, **kwargs):
10781081
f"newly-observed-domains-feed-({source.value})",
10791082
f"v1/{endpoint}/nod/",
10801083
response_path=(),
1084+
cls=FeedsResults,
10811085
**kwargs,
10821086
)
10831087

1084-
def nad(self, **kwargs):
1088+
def nad(self, **kwargs) -> GeneratorType:
10851089
"""Returns back list of the newly active domains feed"""
10861090
validate_feeds_parameters(kwargs)
10871091
endpoint = kwargs.pop("endpoint", Endpoint.FEED.value)
@@ -1094,10 +1098,11 @@ def nad(self, **kwargs):
10941098
f"newly-active-domains-feed-({source})",
10951099
f"v1/{endpoint}/nad/",
10961100
response_path=(),
1101+
cls=FeedsResults,
10971102
**kwargs,
10981103
)
10991104

1100-
def domainrdap(self, **kwargs):
1105+
def domainrdap(self, **kwargs) -> GeneratorType:
11011106
"""Returns changes to global domain registration information, populated by the Registration Data Access Protocol (RDAP)"""
11021107
validate_feeds_parameters(kwargs)
11031108
endpoint = kwargs.pop("endpoint", Endpoint.FEED.value)
@@ -1107,10 +1112,11 @@ def domainrdap(self, **kwargs):
11071112
f"domain-registration-data-access-protocol-feed-({source})",
11081113
f"v1/{endpoint}/domainrdap/",
11091114
response_path=(),
1115+
cls=FeedsResults,
11101116
**kwargs,
11111117
)
11121118

1113-
def domaindiscovery(self, **kwargs):
1119+
def domaindiscovery(self, **kwargs) -> GeneratorType:
11141120
"""Returns new domains as they are either discovered in domain registration information, observed by our global sensor network, or reported by trusted third parties"""
11151121
validate_feeds_parameters(kwargs)
11161122
endpoint = kwargs.pop("endpoint", Endpoint.FEED.value)
@@ -1123,5 +1129,6 @@ def domaindiscovery(self, **kwargs):
11231129
f"real-time-domain-discovery-feed-({source})",
11241130
f"v1/{endpoint}/domaindiscovery/",
11251131
response_path=(),
1132+
cls=FeedsResults,
11261133
**kwargs,
11271134
)

domaintools/base_results.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,23 @@ def _wait_time(self):
7777

7878
return wait_for
7979

80+
def _get_session_params(self):
81+
parameters = deepcopy(self.kwargs)
82+
parameters.pop("output_format", None)
83+
parameters.pop(
84+
"format", None
85+
) # For some unknownn reasons, even if "format" is not included in the cli params for feeds endpoint, it is being populated thus we need to remove it. Happens only if using CLI.
86+
headers = {}
87+
if self.kwargs.get("output_format", OutputFormat.JSONL.value) == OutputFormat.CSV.value:
88+
parameters["headers"] = int(bool(self.kwargs.get("headers", False)))
89+
headers["accept"] = HEADER_ACCEPT_KEY_CSV_FORMAT
90+
91+
header_api_key = parameters.pop("X-Api-Key", None)
92+
if header_api_key:
93+
headers["X-Api-Key"] = header_api_key
94+
95+
return {"parameters": parameters, "headers": headers}
96+
8097
def _make_request(self):
8198

8299
with Client(verify=self.api.verify_ssl, proxy=self.api.proxy_url, timeout=None) as session:
@@ -93,20 +110,9 @@ def _make_request(self):
93110
patch_data.update(self.api.extra_request_params)
94111
return session.patch(url=self.url, json=patch_data)
95112
elif self.product in FEEDS_PRODUCTS_LIST:
96-
parameters = deepcopy(self.kwargs)
97-
parameters.pop("output_format", None)
98-
parameters.pop(
99-
"format", None
100-
) # For some unknownn reasons, even if "format" is not included in the cli params for feeds endpoint, it is being populated thus we need to remove it. Happens only if using CLI.
101-
headers = {}
102-
if self.kwargs.get("output_format", OutputFormat.JSONL.value) == OutputFormat.CSV.value:
103-
parameters["headers"] = int(bool(self.kwargs.get("headers", False)))
104-
headers["accept"] = HEADER_ACCEPT_KEY_CSV_FORMAT
105-
106-
header_api_key = parameters.pop("X-Api-Key", None)
107-
if header_api_key:
108-
headers["X-Api-Key"] = header_api_key
109-
113+
session_params = self._get_session_params()
114+
parameters = session_params.get("parameters")
115+
headers = session_params.get("headers")
110116
return session.get(url=self.url, params=parameters, headers=headers, **self.api.extra_request_params)
111117
else:
112118
return session.get(url=self.url, params=self.kwargs, **self.api.extra_request_params)
@@ -158,7 +164,6 @@ def check_limit_exceeded(self):
158164
if self.kwargs.get("format", "json") == "json" and self.product not in FEEDS_PRODUCTS_LIST:
159165
if "response" in self._data and "limit_exceeded" in self._data["response"] and self._data["response"]["limit_exceeded"] is True:
160166
return True, self._data["response"]["message"]
161-
# TODO: handle html, xml response errors better.
162167
elif "response" in self._data and "limit_exceeded" in self._data:
163168
return True, "limit exceeded"
164169
return False, ""
@@ -172,7 +177,7 @@ def status(self):
172177

173178
def setStatus(self, code, response=None):
174179
self._status = code
175-
if code == 200:
180+
if code == 200 or (self.product in FEEDS_PRODUCTS_LIST and code == 206):
176181
return
177182

178183
reason = None

0 commit comments

Comments
 (0)