Skip to content

Commit 92cd826

Browse files
author
Benjamin Krull
committed
fix: comprehensive query param enconding
1 parent 417224e commit 92cd826

File tree

6 files changed

+90
-80
lines changed

6 files changed

+90
-80
lines changed

sw360/base.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
import requests
1313

14+
from urllib.parse import urlencode
15+
1416
from .sw360error import SW360Error
1517

1618

@@ -217,16 +219,17 @@ def _update_external_ids(self, current_data: Dict[str, Any], ext_id_name: str, e
217219
update = False
218220

219221
return (old_value, ext_id_data, update)
220-
221-
def _add_param(self, url: str, param: str) -> str:
222+
223+
def _add_params(self, url: str, params: dict) -> str:
222224
"""Add the given parameter to the given url"""
225+
226+
query_string = urlencode(params)
227+
223228
if "?" in url:
224-
url = url + "&"
229+
return f"{url}&{query_string}"
225230
else:
226-
url = url + "?"
227-
228-
return url + param
229-
231+
return f"{url}?{query_string}"
232+
230233
@classmethod
231234
def get_id_from_href(cls, href: str) -> str:
232235
""""Extracts the identifier from the href and returns it

sw360/components.py

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,25 @@ def get_all_components(self, fields: str = "", page: int = -1, page_size: int =
3737
:rtype: list of JSON component objects
3838
:raises SW360Error: if there is a negative HTTP response
3939
"""
40-
41-
url = self.url + "resource/api/components"
40+
41+
fullbase_url = self.url + "resource/api/components"
42+
params = {}
4243

4344
if all_details:
44-
url = self._add_param(url, "allDetails=true")
45+
params["allDetails"] = "true"
4546

4647
if fields:
47-
url = self._add_param(url, "fields=" + fields)
48+
params["fields"] = fields
4849

4950
if page > -1:
50-
url = self._add_param(url, "page=" + str(page))
51-
url = self._add_param(url, "page_entries=" + str(page_size))
51+
params["page"] = str(page)
52+
params["page_entries"] = str(page_size)
5253

5354
if sort:
54-
# ensure HTML encoding
55-
sort = sort.replace(",", "%2C")
56-
url = self._add_param(url, "sort=" + sort)
55+
params["sort"] = sort
5756

58-
resp = self.api_get(url)
57+
full_url = self._add_params(fullbase_url, params)
58+
resp = self.api_get(full_url)
5959
if not resp:
6060
return []
6161

@@ -94,18 +94,18 @@ def get_components_by_type(
9494
:raises SW360Error: if there is a negative HTTP response
9595
"""
9696

97-
url = self.url + "resource/api/components?type=" + component_type
97+
fullbase_url = self.url + "resource/api/components"
98+
params = {"type": component_type}
9899

99100
if page > -1:
100-
url = self._add_param(url, "page=" + str(page))
101-
url = self._add_param(url, "page_entries=" + str(page_size))
101+
params["page"] = str(page)
102+
params["page_entries"] = str(page_size)
102103

103104
if sort:
104-
# ensure HTML encoding
105-
sort = sort.replace(",", "%2C")
106-
url = self._add_param(url, "sort=" + sort)
105+
params["sort"] = sort
107106

108-
resp = self.api_get(url)
107+
full_url = self._add_params(fullbase_url, params)
108+
resp = self.api_get(full_url)
109109

110110
if resp and ("_embedded" in resp) and ("sw360:components" in resp["_embedded"]):
111111
return resp["_embedded"]["sw360:components"]
@@ -165,17 +165,18 @@ def get_component_by_name(
165165
:raises SW360Error: if there is a negative HTTP response
166166
"""
167167

168-
url = self.url + "resource/api/components?name=" + component_name
168+
fullbase_url = self.url + "resource/api/components?name=" + component_name
169+
params = {"name": component_name}
170+
169171
if page > -1:
170-
url = self._add_param(url, "page=" + str(page))
171-
url = self._add_param(url, "page_entries=" + str(page_size))
172+
params["page"] = str(page)
173+
params["page_entries"] = str(page_size)
172174

173175
if sort:
174-
# ensure HTML encoding
175-
sort = sort.replace(",", "%2C")
176-
url = self._add_param(url, "sort=" + sort)
176+
params["sort"] = sort
177177

178-
resp = self.api_get(url)
178+
full_url = self._add_params(fullbase_url, params)
179+
resp = self.api_get(full_url)
179180
return resp
180181

181182
def get_components_by_external_id(self, ext_id_name: str, ext_id_value: str = "") -> List[Dict[str, Any]]:

sw360/moderationrequests.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,17 @@ def get_all_moderation_requests(self, page: int = -1, page_size: int = -1,
3030
:raises SW360Error: if there is a negative HTTP response
3131
"""
3232

33-
full_url = self.url + "resource/api/moderationrequest"
33+
fullbase_url = self.url + "resource/api/moderationrequest"
34+
params = {}
35+
3436
if page > -1:
35-
full_url = self._add_param(full_url, "page=" + str(page))
36-
full_url = self._add_param(full_url, "page_entries=" + str(page_size))
37+
params["page"] = str(page)
38+
params["page_entries"] = str(page_size)
3739

3840
if sort:
39-
# ensure HTML encoding
40-
sort = sort.replace(",", "%2C")
41-
full_url = self._add_param(full_url, "sort=" + sort)
41+
params["sort"] = sort
4242

43+
full_url = self._add_params(fullbase_url, params)
4344
resp = self.api_get(full_url)
4445
return resp
4546

@@ -63,22 +64,23 @@ def get_moderation_requests_by_state(self, state: str, all_details: bool = False
6364
:raises SW360Error: if there is a negative HTTP response
6465
"""
6566

66-
full_url = self.url + "resource/api/moderationrequest/byState?state=" + state
67+
fullbase_url = self.url + "resource/api/moderationrequest/byState"
68+
params = {"state": state}
69+
6770
if all_details:
68-
full_url = self._add_param(full_url, "allDetails=true")
71+
params["allDetails"] = "true"
6972

7073
if page > -1:
71-
full_url = self._add_param(full_url, "page=" + str(page))
72-
full_url = self._add_param(full_url, "page_entries=" + str(page_size))
74+
params["page"] = str(page)
75+
params["page_entries"] = str(page_size)
7376

7477
if sort:
75-
# ensure HTML encoding
76-
sort = sort.replace(",", "%2C")
77-
full_url = self._add_param(full_url, "sort=" + sort)
78+
params["sort"] = sort
7879

80+
full_url = self._add_params(fullbase_url, params)
7981
resp = self.api_get(full_url)
8082
return resp
81-
83+
8284
def get_moderation_request(self, mr_id: str) -> Optional[Dict[str, Any]]:
8385
"""Get information of about a moderation request
8486

sw360/packages.py

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -65,26 +65,29 @@ def get_all_packages(self, name: str = "", version: str = "", purl: str = "",
6565
:rtype: list of JSON package objects
6666
:raises SW360Error: if there is a negative HTTP response
6767
"""
68-
full_url = self.url + "resource/api/packages"
68+
fullbase_url = self.url + "resource/api/packages"
69+
params = {}
70+
6971
if all_details:
70-
full_url = self._add_param(full_url, "allDetails=true")
72+
params["allDetails"] = "true"
7173

7274
if name:
73-
full_url = self._add_param(full_url, "name=" + name)
75+
params["name"] = name
76+
7477
if version:
75-
full_url = self._add_param(full_url, "version=" + version)
76-
if purl:
77-
full_url = self._add_param(full_url, "purl=" + purl)
78+
params["version"] = version
7879

80+
if purl:
81+
params["purl"] = purl
82+
7983
if page > -1:
80-
full_url = self._add_param(full_url, "page=" + str(page))
81-
full_url = self._add_param(full_url, "page_entries=" + str(page_size))
84+
params["page"] = str(page)
85+
params["page_entries"] = str(page_size)
8286

8387
if sort:
84-
# ensure HTML encoding
85-
sort = sort.replace(",", "%2C")
86-
full_url = self._add_param(full_url, "sort=" + sort)
88+
params["sort"] = sort
8789

90+
full_url = self._add_params(fullbase_url, params)
8891
resp = self.api_get(full_url)
8992

9093
if page == -1 and resp and ("_embedded" in resp) and ("sw360:packages" in resp["_embedded"]):
@@ -110,19 +113,17 @@ def get_packages_by_packagemanager(self, manager: str, page: int = -1,
110113
:rtype: list of JSON package objects
111114
:raises SW360Error: if there is a negative HTTP response
112115
"""
113-
full_url = self.url + "resource/api/packages"
114-
full_url = self._add_param(full_url, "packageManager=" + str(manager))
116+
fullbase_url = self.url + "resource/api/packages"
117+
params = {"packageManager": manager}
115118

116119
if page > -1:
117-
full_url = self._add_param(full_url, "page=" + str(page))
118-
full_url = self._add_param(full_url, "page_entries=" + str(page_size))
120+
params["page"] = str(page)
121+
params["page_entries"] = str(page_size)
119122

120123
if sort:
121-
# ensure HTML encoding
122-
sort = sort.replace(",", "%2C")
123-
full_url = self._add_param(full_url, "sort=" + sort)
124+
params["sort"] = sort
124125

125-
resp = self.api_get(full_url)
126+
resp = self.api_get(fullbase_url)
126127

127128
if page == -1 and resp and ("_embedded" in resp) and ("sw360:packages" in resp["_embedded"]):
128129
return resp["_embedded"]["sw360:packages"]

sw360/project.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,19 +83,20 @@ def get_projects(self, all_details: bool = False, page: int = -1,
8383
:raises SW360Error: if there is a negative HTTP response
8484
"""
8585

86-
full_url = self.url + "resource/api/projects"
86+
fullbase_url = self.url + "resource/api/projects"
87+
params = {}
88+
8789
if all_details:
88-
full_url = self._add_param(full_url, "allDetails=true")
90+
params["allDetails"] = "true"
8991

9092
if page > -1:
91-
full_url = self._add_param(full_url, "page=" + str(page))
92-
full_url = self._add_param(full_url, "page_entries=" + str(page_size))
93+
params["page"] = str(page)
94+
params["page_entries"] = str(page_size)
9395

9496
if sort:
95-
# ensure HTML encoding
96-
sort = sort.replace(",", "%2C")
97-
full_url = self._add_param(full_url, "sort=" + sort)
97+
params["sort"] = sort
9898

99+
full_url = self._add_params(fullbase_url, params)
99100
resp = self.api_get(full_url)
100101
return resp
101102

sw360/releases.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,24 +85,26 @@ def get_all_releases(self, fields: str = "", all_details: bool = False,
8585
:rtype: list of JSON release objects
8686
:raises SW360Error: if there is a negative HTTP response
8787
"""
88-
full_url = self.url + "resource/api/releases"
88+
fullbase_url = self.url + "resource/api/releases"
89+
params = {}
90+
8991
if all_details:
90-
full_url = self._add_param(full_url, "allDetails=true")
92+
params["allDetails"] = "true"
9193

9294
if isNewClearingWithSourceAvailable:
93-
full_url = self._add_param(full_url, "isNewClearingWithSourceAvailable=true")
95+
params["isNewClearingWithSourceAvailable"] = "true"
9496

9597
if fields:
96-
full_url = self._add_param(full_url, "fields=" + fields)
98+
params["fields"] = fields
9799

98100
if page > -1:
99-
full_url = self._add_param(full_url, "page=" + str(page))
100-
full_url = self._add_param(full_url, "page_entries=" + str(page_size))
101+
params["page"] = str(page)
102+
params["page_entries"] = str(page_size)
101103

102104
if sort:
103-
# ensure HTML encoding
104-
sort = sort.replace(",", "%2C")
105-
full_url = self._add_param(full_url, "sort=" + sort)
105+
params["sort"] = sort
106+
107+
full_url = self._add_params(fullbase_url, params)
106108

107109
resp = self.api_get(full_url)
108110

0 commit comments

Comments
 (0)