Skip to content

Commit 67c102e

Browse files
adding api key parser
1 parent 8281587 commit 67c102e

File tree

3 files changed

+113
-4
lines changed

3 files changed

+113
-4
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from .stringextension import StringExtension
2+
from .apikeyparseresult import ApiKeyParseResult
3+
4+
class ApiKeyParser(object):
5+
"""
6+
Wrapper of the Http Client to handle threading for async
7+
"""
8+
9+
def parse(self, whole_api_key: str):
10+
"""
11+
Parse the API key to determine what kind of key was provided.
12+
:param whole_api_key: A ApiKeyParseResult with the parsing results
13+
:type whole_api_key: string
14+
:return the ApiKeyParseResult from the request
15+
:rtype ApiKeyParseResult
16+
"""
17+
18+
if StringExtension.is_none_or_white_space(whole_api_key):
19+
return ApiKeyParseResult.InvalidEmptyOrWhitespace
20+
21+
if len(whole_api_key) != 61:
22+
return ApiKeyParseResult.InvalidKeyLength
23+
24+
if whole_api_key.index('.') == -1:
25+
return ApiKeyParseResult.InvalidKeyFormat
26+
27+
public_part_end = whole_api_key[0:50].index('.')
28+
if public_part_end == -1:
29+
return ApiKeyParseResult.InvalidUnableToExtractPublicPart
30+
31+
public_part = whole_api_key[0:public_part_end]
32+
if len(public_part) != 20:
33+
return ApiKeyParseResult.InvalidPublicPartLength
34+
35+
if len(whole_api_key) <= public_part_end + 1:
36+
return ApiKeyParseResult.InvalidUnableToExtractSecretPart
37+
38+
private_part = whole_api_key[public_part_end + 1:len(whole_api_key)]
39+
if len(private_part) != 40:
40+
return ApiKeyParseResult.InvalidSecretPartLength
41+
42+
return ApiKeyParseResult.Success
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from enum import Enum
2+
3+
4+
class ApiKeyParseResult(Enum):
5+
"""
6+
Enumerated result of parsing the API Key
7+
"""
8+
9+
""" No result could be produced. """
10+
NoneSet = 0
11+
12+
""" The key was found to be blank or invalid. """
13+
InvalidEmptyOrWhitespace = 1
14+
15+
""" The public portion of the key was unable to be parsed. """
16+
InvalidUnableToExtractPublicPart = 2
17+
18+
""" The secret portion of the key was unable to be parsed. """
19+
InvalidUnableToExtractSecretPart = 3
20+
21+
""" Key was successfully parsed. """
22+
Success = 4
23+
24+
def __str__(self):
25+
"""
26+
String representation of the SendResult Enum
27+
:return the string
28+
:rtype str
29+
"""
30+
switcher = {
31+
0: "No result could be produced.",
32+
1: "The key was found to be blank or invalid.",
33+
2: "The public portion of the key was unable to be parsed.",
34+
3: "The secret portion of the key was unable to be parsed.",
35+
4: "Key was successfully parsed.",
36+
}
37+
return switcher.get(self.value, "An error has occurred that was unforeseen")
38+
39+
def describe(self):
40+
"""
41+
string output of the
42+
:return the string
43+
:rtype str
44+
"""
45+
return self.name, self.value, self.__str__

socketlabs/injectionapi/socketlabsclient.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
from .message.bulkmessage import BulkMessage
1414
from .proxy import Proxy
1515
from .sendresult import SendResult
16+
from .core.apikeyparser import ApiKeyParser
17+
from .core.apikeyparseresult import ApiKeyParseResult
1618

1719

1820
class SocketLabsClient(object):
@@ -81,13 +83,15 @@ def number_of_retries(self):
8183
def number_of_retries(self, retries: int):
8284
self._number_of_retries = retries
8385

84-
def __build_http_request(self):
86+
def __build_http_request(self, authentication: str):
8587
"""
8688
Build the HttpRequest. Will add the proxy, if set
89+
:param authentication: the API key to include as a bearer token
90+
:type authentication: object
8791
:return the HttpRequest object to use for the request
8892
:rtype HttpRequest
8993
"""
90-
req = HttpRequest(HttpRequest.HttpRequestMethod.POST, self.__endpoint, self.request_timeout)
94+
req = HttpRequest(HttpRequest.HttpRequestMethod.POST, self.__endpoint, self.request_timeout, authentication)
9195
if self._http_proxy is not None:
9296
req.proxy = self._http_proxy
9397
return req
@@ -119,10 +123,19 @@ def __send_basic_message(self, message: BasicMessage):
119123
if not resp.result == SendResult.Success:
120124
return resp
121125

126+
api_key_parser = ApiKeyParser()
127+
parse_result = api_key_parser.parse(self._api_key)
128+
122129
req_factory = InjectionRequestFactory(self._server_id, self._api_key)
130+
http_request = self.__build_http_request("")
131+
132+
if parse_result == ApiKeyParseResult.Success:
133+
req_factory = InjectionRequestFactory(self._server_id, "")
134+
http_request = self.__build_http_request(self._api_key)
135+
123136
body = req_factory.generate_request(message)
124137

125-
retry_handler = RetryHandler(self.__build_http_request(), RetrySettings(self.number_of_retries))
138+
retry_handler = RetryHandler(http_request, RetrySettings(self.number_of_retries))
126139
response = retry_handler.send(body)
127140

128141
data = response.read().decode("utf-8")
@@ -143,10 +156,19 @@ def __send_bulk_message(self, message: BulkMessage):
143156
if not resp.result == SendResult.Success:
144157
return resp
145158

159+
api_key_parser = ApiKeyParser()
160+
parse_result = api_key_parser.parse(self._api_key)
161+
146162
req_factory = InjectionRequestFactory(self._server_id, self._api_key)
163+
http_request = self.__build_http_request("")
164+
165+
if parse_result == ApiKeyParseResult.Success:
166+
req_factory = InjectionRequestFactory(self._server_id, "")
167+
http_request = self.__build_http_request(self._api_key)
168+
147169
body = req_factory.generate_request(message)
148170

149-
retry_handler = RetryHandler(self.__build_http_request(), RetrySettings(self.number_of_retries))
171+
retry_handler = RetryHandler(http_request, RetrySettings(self.number_of_retries))
150172
response = retry_handler.send(body)
151173

152174
data = response.read().decode("utf-8")

0 commit comments

Comments
 (0)