11
11
12
12
from .constants import ERRORS
13
13
14
- TRANSFORMATION_PARAMETER = "tr"
15
- DEFAULT_TRANSFORMATION_POSITION = "path"
16
- QUERY_TRANSFORMATION_POSITION = "query"
17
- CHAIN_TRANSFORM_DELIMITER = ":"
18
- TRANSFORM_DELIMITER = ","
19
- TRANSFORM_KEY_VALUE_DELIMITER = "-"
20
14
21
- SIGNATURE_PARAMETER = "ik-s"
22
- TIMESTAMP_PARAMETER = "ik-t"
23
- DEFAULT_TIMESTAMP = "9999999999"
24
-
25
-
26
- class Url (object ):
15
+ class Url :
27
16
"""
28
17
Url class holds the request and related methods
29
18
to generate url(signed and unsigned)
@@ -42,44 +31,47 @@ def build_url(self, options: dict) -> str:
42
31
builds url for from all options,
43
32
"""
44
33
34
+ # important to strip the trailing slashes. later logic assumes no trailing slashes.
45
35
path = options .get ("path" , "" ).strip ("/" )
46
36
src = options .get ("src" , "" ).strip ("/" )
47
37
url_endpoint = options .get ("url_endpoint" , "" ).strip ("/" )
48
38
transformation_str = self .transformation_to_str (options .get ("transformation" ))
49
- transformation_position = options .get ("transformation_position" ) or DEFAULT_TRANSFORMATION_POSITION
39
+ transformation_position = options .get ("transformation_position" , Default . DEFAULT_TRANSFORMATION_POSITION . value )
50
40
51
41
if transformation_position not in Default .VALID_TRANSFORMATION_POSITION .value :
52
42
raise ValueError (ERRORS .INVALID_TRANSFORMATION_POSITION .value )
53
43
54
- if (path is "" and src is "" ):
44
+ if (path == "" and src == "" ):
55
45
return ""
56
46
57
- if src :
58
- temp_url = src .strip ("/" )
59
- transformation_position = QUERY_TRANSFORMATION_POSITION
60
- else :
47
+ # if path is present then it is given priority over src parameter
48
+ if path :
61
49
if transformation_position == "path" :
62
50
temp_url = "{}/{}:{}/{}" .format (
63
- url_endpoint . strip ( "/" ) ,
64
- TRANSFORMATION_PARAMETER ,
51
+ url_endpoint ,
52
+ Default . TRANSFORMATION_PARAMETER . value ,
65
53
transformation_str .strip ("/" ),
66
- path . strip ( "/" )
54
+ path
67
55
)
68
56
else :
69
57
temp_url = "{}/{}" .format (
70
- url_endpoint . strip ( "/" ) ,
71
- path . strip ( "/" )
58
+ url_endpoint ,
59
+ path
72
60
)
61
+ else :
62
+ temp_url = src
63
+ # if src parameter is used, then we force transformation position in query
64
+ transformation_position = Default .QUERY_TRANSFORMATION_POSITION .value
73
65
74
- url_object = urlparse (temp_url . strip ( "/" ) )
66
+ url_object = urlparse (temp_url )
75
67
76
68
query_params = dict (parse_qsl (url_object .query ))
77
69
query_params .update (options .get ("query_parameters" , {}))
78
- if transformation_position == QUERY_TRANSFORMATION_POSITION :
79
- query_params .update ({"tr" : transformation_str })
80
- query_params .update ({"ik-sdk-version" : Default .SDK_VERSION .value })
70
+ if transformation_position == Default . QUERY_TRANSFORMATION_POSITION . value :
71
+ query_params .update ({Default . TRANSFORMATION_PARAMETER . value : transformation_str })
72
+ query_params .update ({Default . SDK_VERSION_PARAMETER . value : Default .SDK_VERSION .value })
81
73
82
- # Update query params
74
+ # Update query params in the url
83
75
url_object = url_object ._replace (query = urlencode (query_params ))
84
76
85
77
if options .get ("signed" ):
@@ -92,39 +84,41 @@ def build_url(self, options: dict) -> str:
92
84
url_endpoint = url_endpoint ,
93
85
expiry_timestamp = expiry_timestamp ,
94
86
)
95
- query_params .update ({TIMESTAMP_PARAMETER : expiry_timestamp , SIGNATURE_PARAMETER : url_signature })
87
+
88
+ """
89
+ If the expire_seconds parameter is specified then the output URL contains
90
+ ik-t parameter (unix timestamp seconds when the URL expires) and
91
+ the signature contains the timestamp for computation.
92
+
93
+ If not present, then no ik-t parameter and the value 9999999999 is used.
94
+ """
95
+ if expire_seconds :
96
+ query_params .update ({Default .TIMESTAMP_PARAMETER .value : expiry_timestamp , Default .SIGNATURE_PARAMETER .value : url_signature })
97
+ else :
98
+ query_params .update ({Default .SIGNATURE_PARAMETER .value : url_signature })
99
+
96
100
# Update signature related query params
97
101
url_object = url_object ._replace (query = urlencode (query_params ))
98
102
99
103
return url_object .geturl ()
100
104
101
105
@staticmethod
102
- def get_signature_timestamp (seconds : int = None ) -> int :
106
+ def get_signature_timestamp (expiry_seconds : int = None ) -> int :
103
107
"""
104
- this function returns either default time stamp
105
- or current unix time and expiry seconds to get
106
- signature time stamp
108
+ this function returns the signature timestamp to be used
109
+ with the generated url.
110
+ If expiry_seconds is provided, it returns expiry_seconds added
111
+ to the current unix time, otherwise the default time stamp
112
+ is returned.
107
113
"""
108
- if not seconds :
114
+ if not expiry_seconds :
109
115
return Default .DEFAULT_TIMESTAMP .value
110
116
current_timestamp = int (dt .now ().strftime ("%s" ))
111
117
112
- return current_timestamp + seconds
113
-
114
- @staticmethod
115
- def prepare_dict_for_unparse (url_dict : dict ) -> dict :
116
- """
117
- remove and add required back slash of 'netloc' and 'path'
118
- to parse it properly, urllib.parse.unparse() function can't
119
- create url properly if path doesn't have '/' at the start
120
- """
121
- url_dict ["netloc" ] = url_dict ["netloc" ].rstrip ("/" )
122
- url_dict ["path" ] = "/" + url_dict ["path" ].strip ("/" )
123
-
124
- return url_dict
118
+ return current_timestamp + expiry_seconds
125
119
126
120
@staticmethod
127
- def get_signature (private_key , url , url_endpoint , expiry_timestamp ) -> str :
121
+ def get_signature (private_key , url , url_endpoint , expiry_timestamp : int ) -> str :
128
122
""""
129
123
create signature(hashed hex key) from
130
124
private_key, url, url_endpoint and expiry_timestamp
@@ -133,8 +127,8 @@ def get_signature(private_key, url, url_endpoint, expiry_timestamp) -> str:
133
127
if url_endpoint [- 1 ] != '/' :
134
128
url_endpoint += '/'
135
129
136
- if isinstance ( expiry_timestamp , int ) and expiry_timestamp < 1 :
137
- expiry_timestamp = DEFAULT_TIMESTAMP
130
+ if expiry_timestamp < 1 :
131
+ expiry_timestamp = Default . DEFAULT_TIMESTAMP . value
138
132
139
133
replaced_url = url .replace (url_endpoint , "" ) + str (expiry_timestamp )
140
134
@@ -187,12 +181,12 @@ def transformation_to_str(transformation):
187
181
parsed_transform_step .append (
188
182
"{}{}{}" .format (
189
183
transform_key ,
190
- TRANSFORM_KEY_VALUE_DELIMITER ,
184
+ Default . TRANSFORM_KEY_VALUE_DELIMITER . value ,
191
185
transformation [i ][key ],
192
186
)
193
187
)
194
188
195
189
parsed_transforms .append (
196
- TRANSFORM_DELIMITER .join (parsed_transform_step ))
190
+ Default . TRANSFORM_DELIMITER . value .join (parsed_transform_step ))
197
191
198
- return CHAIN_TRANSFORM_DELIMITER .join (parsed_transforms )
192
+ return Default . CHAIN_TRANSFORM_DELIMITER . value .join (parsed_transforms )
0 commit comments