Merge pull request #109 from Mrreadiness/fix/piclke-coder

Fix Piclke Coder
This commit is contained in:
long2ice
2023-01-11 21:31:02 +08:00
committed by GitHub
2 changed files with 28 additions and 5 deletions

View File

@@ -1,3 +1,4 @@
import codecs
import datetime
import json
import pickle # nosec:B403
@@ -45,7 +46,7 @@ class Coder:
raise NotImplementedError
@classmethod
def decode(cls, value: Any) -> Any:
def decode(cls, value: str) -> Any:
raise NotImplementedError
@@ -57,7 +58,7 @@ class JsonCoder(Coder):
return json.dumps(value, cls=JsonEncoder)
@classmethod
def decode(cls, value: Any) -> str:
def decode(cls, value: str) -> str:
return json.loads(value, object_hook=object_hook)
@@ -66,8 +67,8 @@ class PickleCoder(Coder):
def encode(cls, value: Any) -> str:
if isinstance(value, TemplateResponse):
value = value.body
return str(pickle.dumps(value))
return codecs.encode(pickle.dumps(value), "base64").decode()
@classmethod
def decode(cls, value: Any) -> Any:
return pickle.loads(bytes(value)) # nosec:B403,B301
def decode(cls, value: str) -> Any:
return pickle.loads(codecs.decode(value.encode(), "base64")) # nosec:B403,B301

22
tests/test_codecs.py Normal file
View File

@@ -0,0 +1,22 @@
from typing import Any
import pytest
from fastapi_cache.coder import PickleCoder
@pytest.mark.parametrize(
"value",
[
1,
"some_string",
(1, 2),
[1, 2, 3],
{"some_key": 1, "other_key": 2},
],
)
def test_pickle_coder(value: Any) -> None:
encoded_value = PickleCoder.encode(value)
assert isinstance(encoded_value, str)
decoded_value = PickleCoder.decode(encoded_value)
assert decoded_value == value