Skip to content

Commit 47134ff

Browse files
committed
Add validator for image integrity
1 parent 46ed508 commit 47134ff

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

src/mock_vws/_services_validators/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
validate_image_data_type,
3030
validate_image_encoding,
3131
validate_image_format,
32+
validate_image_integrity,
3233
validate_image_is_image,
3334
validate_image_size,
3435
)
@@ -122,6 +123,7 @@ def run_services_validators(
122123
validate_image_format(request_body=request_body)
123124
validate_image_color_space(request_body=request_body)
124125
validate_image_size(request_body=request_body)
126+
validate_image_integrity(request_body=request_body)
125127

126128
validate_name_type(request_body=request_body)
127129
validate_name_length(request_body=request_body)

src/mock_vws/_services_validators/image_validators.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,33 @@
2121
_LOGGER = logging.getLogger(name=__name__)
2222

2323

24+
@beartype
25+
def validate_image_integrity(*, request_body: bytes) -> None:
26+
"""Validate the integrity of the image given to a VWS endpoint.
27+
28+
Args:
29+
request_body: The body of the request.
30+
31+
Raises:
32+
BadImageError: The image is given and is not a valid image file.
33+
"""
34+
if not request_body:
35+
return
36+
37+
request_text = request_body.decode()
38+
image = json.loads(s=request_text).get("image")
39+
decoded = decode_base64(encoded_data=image)
40+
41+
image_file = io.BytesIO(initial_bytes=decoded)
42+
pil_image = Image.open(fp=image_file)
43+
44+
try:
45+
pil_image.verify()
46+
except SyntaxError as exc:
47+
_LOGGER.warning(msg="The image is not a valid image file.")
48+
raise BadImageError from exc
49+
50+
2451
@beartype
2552
def validate_image_format(*, request_body: bytes) -> None:
2653
"""Validate the format of the image given to a VWS endpoint.

0 commit comments

Comments
 (0)