Skip to content

Commit 9b477eb

Browse files
Fix multipart file upload handling in HTTP client (#516)
* fix: Resolve multipart file upload issue in HTTP client - Fix Content-Type header handling for multipart/form-data requests - Add proper file data handling for binary uploads in aiohttp - Remove Content-Type header to allow aiohttp to set boundary automatically - Update form parameter processing to handle both dict and list formats - Support new tuple-based file upload format: [(field_name, (filename, filedata, mimetype))] This fixes the multipart upload endpoints for theme images (logo, favicon, background) where the Content-Type boundary was being overridden, causing "no multipart boundary param" errors. Fixes: Theme image upload endpoints returning 400 errors Related files: - okta/http_client.py - okta/api/themes_api.py # Conflicts: # openapi/templates/api_client.mustache * Added Pillow library to the requirements * fix: Address review feedback for multipart file upload fix - Make Pillow an optional dependency (lazy import with try/except) - Remove Pillow from mandatory requirements, setup.py, pyproject.toml - Add extras_require so users can `pip install okta[images]` - Add logger.warning() when file type detection falls back - Fix mutable default args in RequestExecutor.create_request() - Fix param_serialize() docstring to match actual return signature - Use case-insensitive Content-Type header lookup for OAuth forms - Simplify JPEG detection to cover all SOI marker variants - Restore issue #131 reference comment for json param handling * - Formatting changes from api_client.py to mustache file. * - Updated LOGGER_NAME to api_client and http_client mustache and .py files. * - Addressed Review comments.
1 parent cc03347 commit 9b477eb

125 files changed

Lines changed: 1086 additions & 934 deletions

File tree

Some content is hidden

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

okta/api/agent_pools_api.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ async def activate_agent_pools_update(
115115
)
116116
)
117117

118-
form = {}
118+
form = post_params if post_params else None
119119
keep_empty_params = False
120120

121121
request, error = await self._request_executor.create_request(
@@ -284,7 +284,7 @@ async def create_agent_pools_update(
284284
)
285285
)
286286

287-
form = {}
287+
form = post_params if post_params else None
288288
keep_empty_params = False
289289

290290
request, error = await self._request_executor.create_request(
@@ -462,7 +462,7 @@ async def deactivate_agent_pools_update(
462462
)
463463
)
464464

465-
form = {}
465+
form = post_params if post_params else None
466466
keep_empty_params = False
467467

468468
request, error = await self._request_executor.create_request(
@@ -630,7 +630,7 @@ async def delete_agent_pools_update(
630630
)
631631
)
632632

633-
form = {}
633+
form = post_params if post_params else None
634634
keep_empty_params = False
635635

636636
request, error = await self._request_executor.create_request(
@@ -785,7 +785,7 @@ async def get_agent_pools_update_instance(
785785
)
786786
)
787787

788-
form = {}
788+
form = post_params if post_params else None
789789
keep_empty_params = False
790790

791791
request, error = await self._request_executor.create_request(
@@ -949,7 +949,7 @@ async def get_agent_pools_update_settings(
949949
)
950950
)
951951

952-
form = {}
952+
form = post_params if post_params else None
953953
keep_empty_params = False
954954

955955
request, error = await self._request_executor.create_request(
@@ -1129,7 +1129,7 @@ async def list_agent_pools(
11291129
)
11301130
)
11311131

1132-
form = {}
1132+
form = post_params if post_params else None
11331133
keep_empty_params = False
11341134

11351135
request, error = await self._request_executor.create_request(
@@ -1311,7 +1311,7 @@ async def list_agent_pools_updates(
13111311
)
13121312
)
13131313

1314-
form = {}
1314+
form = post_params if post_params else None
13151315
keep_empty_params = False
13161316

13171317
request, error = await self._request_executor.create_request(
@@ -1480,7 +1480,7 @@ async def pause_agent_pools_update(
14801480
)
14811481
)
14821482

1483-
form = {}
1483+
form = post_params if post_params else None
14841484
keep_empty_params = False
14851485

14861486
request, error = await self._request_executor.create_request(
@@ -1648,7 +1648,7 @@ async def resume_agent_pools_update(
16481648
)
16491649
)
16501650

1651-
form = {}
1651+
form = post_params if post_params else None
16521652
keep_empty_params = False
16531653

16541654
request, error = await self._request_executor.create_request(
@@ -1817,7 +1817,7 @@ async def retry_agent_pools_update(
18171817
)
18181818
)
18191819

1820-
form = {}
1820+
form = post_params if post_params else None
18211821
keep_empty_params = False
18221822

18231823
request, error = await self._request_executor.create_request(
@@ -1985,7 +1985,7 @@ async def stop_agent_pools_update(
19851985
)
19861986
)
19871987

1988-
form = {}
1988+
form = post_params if post_params else None
19891989
keep_empty_params = False
19901990

19911991
request, error = await self._request_executor.create_request(
@@ -2158,7 +2158,7 @@ async def update_agent_pools_update(
21582158
)
21592159
)
21602160

2161-
form = {}
2161+
form = post_params if post_params else None
21622162
keep_empty_params = False
21632163

21642164
request, error = await self._request_executor.create_request(
@@ -2340,7 +2340,7 @@ async def update_agent_pools_update_settings(
23402340
)
23412341
)
23422342

2343-
form = {}
2343+
form = post_params if post_params else None
23442344
keep_empty_params = False
23452345

23462346
request, error = await self._request_executor.create_request(

okta/api/api_service_integrations_api.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ async def activate_api_service_integration_instance_secret(
124124
)
125125
)
126126

127-
form = {}
127+
form = post_params if post_params else None
128128
keep_empty_params = False
129129

130130
request, error = await self._request_executor.create_request(
@@ -286,7 +286,7 @@ async def create_api_service_integration_instance(
286286
)
287287
)
288288

289-
form = {}
289+
form = post_params if post_params else None
290290
keep_empty_params = False
291291

292292
request, error = await self._request_executor.create_request(
@@ -458,7 +458,7 @@ async def create_api_service_integration_instance_secret(
458458
)
459459
)
460460

461-
form = {}
461+
form = post_params if post_params else None
462462
keep_empty_params = False
463463

464464
request, error = await self._request_executor.create_request(
@@ -626,7 +626,7 @@ async def deactivate_api_service_integration_instance_secret(
626626
)
627627
)
628628

629-
form = {}
629+
form = post_params if post_params else None
630630
keep_empty_params = False
631631

632632
request, error = await self._request_executor.create_request(
@@ -792,7 +792,7 @@ async def delete_api_service_integration_instance(
792792
)
793793
)
794794

795-
form = {}
795+
form = post_params if post_params else None
796796
keep_empty_params = False
797797

798798
request, error = await self._request_executor.create_request(
@@ -947,7 +947,7 @@ async def delete_api_service_integration_instance_secret(
947947
)
948948
)
949949

950-
form = {}
950+
form = post_params if post_params else None
951951
keep_empty_params = False
952952

953953
request, error = await self._request_executor.create_request(
@@ -1098,7 +1098,7 @@ async def get_api_service_integration_instance(
10981098
)
10991099
)
11001100

1101-
form = {}
1101+
form = post_params if post_params else None
11021102
keep_empty_params = False
11031103

11041104
request, error = await self._request_executor.create_request(
@@ -1259,7 +1259,7 @@ async def list_api_service_integration_instance_secrets(
12591259
)
12601260
)
12611261

1262-
form = {}
1262+
form = post_params if post_params else None
12631263
keep_empty_params = False
12641264

12651265
request, error = await self._request_executor.create_request(
@@ -1427,7 +1427,7 @@ async def list_api_service_integration_instances(
14271427
)
14281428
)
14291429

1430-
form = {}
1430+
form = post_params if post_params else None
14311431
keep_empty_params = False
14321432

14331433
request, error = await self._request_executor.create_request(

okta/api/api_token_api.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ async def get_api_token(
104104
_host_index=_host_index,
105105
)
106106

107-
form = {}
107+
form = post_params if post_params else None
108108
keep_empty_params = False
109109

110110
request, error = await self._request_executor.create_request(
@@ -255,7 +255,7 @@ async def list_api_tokens(
255255
_host_index=_host_index,
256256
)
257257

258-
form = {}
258+
form = post_params if post_params else None
259259
keep_empty_params = False
260260

261261
request, error = await self._request_executor.create_request(
@@ -410,7 +410,7 @@ async def revoke_api_token(
410410
)
411411
)
412412

413-
form = {}
413+
form = post_params if post_params else None
414414
keep_empty_params = False
415415

416416
request, error = await self._request_executor.create_request(
@@ -550,7 +550,7 @@ async def revoke_current_api_token(
550550
)
551551
)
552552

553-
form = {}
553+
form = post_params if post_params else None
554554
keep_empty_params = False
555555

556556
request, error = await self._request_executor.create_request(
@@ -697,7 +697,7 @@ async def upsert_api_token(
697697
)
698698
)
699699

700-
form = {}
700+
form = post_params if post_params else None
701701
keep_empty_params = False
702702

703703
request, error = await self._request_executor.create_request(

okta/api/application_api.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ async def activate_application(
105105
)
106106
)
107107

108-
form = {}
108+
form = post_params if post_params else None
109109
keep_empty_params = False
110110

111111
request, error = await self._request_executor.create_request(
@@ -281,7 +281,7 @@ async def create_application(
281281
)
282282
)
283283

284-
form = {}
284+
form = post_params if post_params else None
285285
keep_empty_params = False
286286

287287
request, error = await self._request_executor.create_request(
@@ -458,7 +458,7 @@ async def deactivate_application(
458458
)
459459
)
460460

461-
form = {}
461+
form = post_params if post_params else None
462462
keep_empty_params = False
463463

464464
request, error = await self._request_executor.create_request(
@@ -616,7 +616,7 @@ async def delete_application(
616616
)
617617
)
618618

619-
form = {}
619+
form = post_params if post_params else None
620620
keep_empty_params = False
621621

622622
request, error = await self._request_executor.create_request(
@@ -772,7 +772,7 @@ async def get_application(
772772
_host_index=_host_index,
773773
)
774774

775-
form = {}
775+
form = post_params if post_params else None
776776
keep_empty_params = False
777777

778778
request, error = await self._request_executor.create_request(
@@ -1021,7 +1021,7 @@ async def list_applications(
10211021
)
10221022
)
10231023

1024-
form = {}
1024+
form = post_params if post_params else None
10251025
keep_empty_params = False
10261026

10271027
request, error = await self._request_executor.create_request(
@@ -1217,7 +1217,7 @@ async def replace_application(
12171217
)
12181218
)
12191219

1220-
form = {}
1220+
form = post_params if post_params else None
12211221
keep_empty_params = False
12221222

12231223
request, error = await self._request_executor.create_request(

okta/api/application_connections_api.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ async def activate_default_provisioning_connection_for_application(
112112
)
113113
)
114114

115-
form = {}
115+
form = post_params if post_params else None
116116
keep_empty_params = False
117117

118118
request, error = await self._request_executor.create_request(
@@ -257,7 +257,7 @@ async def deactivate_default_provisioning_connection_for_application(
257257
)
258258
)
259259

260-
form = {}
260+
form = post_params if post_params else None
261261
keep_empty_params = False
262262

263263
request, error = await self._request_executor.create_request(
@@ -402,7 +402,7 @@ async def get_default_provisioning_connection_for_application(
402402
)
403403
)
404404

405-
form = {}
405+
form = post_params if post_params else None
406406
keep_empty_params = False
407407

408408
request, error = await self._request_executor.create_request(
@@ -561,7 +561,7 @@ async def get_user_provisioning_connection_jwks(
561561
)
562562
)
563563

564-
form = {}
564+
form = post_params if post_params else None
565565
keep_empty_params = False
566566

567567
request, error = await self._request_executor.create_request(
@@ -733,7 +733,7 @@ async def update_default_provisioning_connection_for_application(
733733
)
734734
)
735735

736-
form = {}
736+
form = post_params if post_params else None
737737
keep_empty_params = False
738738

739739
request, error = await self._request_executor.create_request(
@@ -924,7 +924,7 @@ async def verify_provisioning_connection_for_application(
924924
)
925925
)
926926

927-
form = {}
927+
form = post_params if post_params else None
928928
keep_empty_params = False
929929

930930
request, error = await self._request_executor.create_request(

0 commit comments

Comments
 (0)