Skip to content

Commit b23202c

Browse files
Improve error handling in Upload API
1 parent 2181844 commit b23202c

File tree

3 files changed

+20
-8
lines changed

3 files changed

+20
-8
lines changed

cloudinary/api_client/execute_request.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ def execute_request(http_connector, method, params, headers, auth, api_url, **op
8787

8888
if "error" in result:
8989
exception_class = EXCEPTION_CODES.get(response.status) or Exception
90-
exception_class = exception_class
9190
raise exception_class("Error {0} - {1}".format(response.status, result["error"]["message"]))
9291

9392
return Response(result, response)

cloudinary/uploader.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import cloudinary
1111
from cloudinary import utils
12+
from cloudinary.api_client.execute_request import EXCEPTION_CODES
1213
from cloudinary.cache.responsive_breakpoints_cache import instance as responsive_breakpoints_cache_instance
1314
from cloudinary.exceptions import Error
1415
from cloudinary.utils import build_eager
@@ -898,7 +899,6 @@ def call_api(action, params, http_headers=None, return_error=False, unsigned=Fal
898899
if timeout is not None:
899900
kw['timeout'] = timeout
900901

901-
code = 200
902902
try:
903903
response = _http.request(method="POST", url=api_url, fields=param_list, headers=headers, **kw)
904904
except HTTPError as e:
@@ -913,11 +913,11 @@ def call_api(action, params, http_headers=None, return_error=False, unsigned=Fal
913913
.format(response.status, response.data, e))
914914

915915
if "error" in result:
916-
if response.status not in [200, 400, 401, 403, 404, 500]:
917-
code = response.status
918916
if return_error:
919-
result["error"]["http_code"] = code
920-
else:
921-
raise Error(result["error"]["message"])
917+
result["error"]["http_code"] = response.status
918+
return result
919+
920+
exception_class = EXCEPTION_CODES.get(response.status) or Error
921+
raise exception_class(result["error"]["message"])
922922

923923
return result

test/test_uploader.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,19 @@ def test_explicit_responsive_breakpoints_cache(self):
447447

448448
self.assertEqual(self.rbp_values, cache_value)
449449

450+
@unittest.skipUnless(cloudinary.config().api_secret, "requires api_key/api_secret")
451+
def test_explicit_error_handling_not_found(self):
452+
# Test explicit error handling
453+
with six.assertRaisesRegex(self, exceptions.NotFound, "Resource not found"):
454+
uploader.explicit(UNIQUE_ID + "_does_not_exist", type="upload", tags=[UNIQUE_TAG])
455+
456+
not_found_res = uploader.explicit(UNIQUE_ID + "_does_not_exist", type="upload", tags=[UNIQUE_TAG],
457+
return_error=True)
458+
459+
self.assertEqual(not_found_res["error"]["http_code"], 404)
460+
self.assertTrue(not_found_res["error"]["message"].startswith("Resource not found"))
461+
462+
450463
@unittest.skipUnless(cloudinary.config().api_secret, "requires api_key/api_secret")
451464
def test_update_metadata(self):
452465
metadata = {METADATA_FIELD_UNIQUE_EXTERNAL_ID: "test"}
@@ -799,7 +812,7 @@ def test_upload_large_file_io(self):
799812
resource = uploader.upload_large(temp_file, chunk_size=LARGE_CHUNK_SIZE,
800813
tags=["upload_large_tag", UNIQUE_TAG], resource_type="image")
801814

802-
self.assertEqual(resource["tags"], ["upload_large_tag", UNIQUE_TAG])
815+
self.assertCountEqual(resource["tags"], ["upload_large_tag", UNIQUE_TAG])
803816
self.assertEqual(resource["resource_type"], "image")
804817
self.assertEqual(resource["width"], LARGE_FILE_WIDTH)
805818
self.assertEqual(resource["height"], LARGE_FILE_HEIGHT)

0 commit comments

Comments
 (0)