Skip to content

Commit dc4c3a5

Browse files
committed
pull base64 decoding into helper
1 parent 105a450 commit dc4c3a5

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

src/sentry/grouping/enhancer/__init__.py

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,31 @@ def base64_string(self) -> str:
770770
base64_str = base64_bytes.decode("ascii")
771771
return base64_str
772772

773+
@classmethod
774+
def _get_config_from_base64_bytes(cls, bytes_str: bytes) -> EnhancementsConfig:
775+
padded_bytes = bytes_str + b"=" * (4 - (len(bytes_str) % 4))
776+
777+
try:
778+
compressed_pickle = base64.urlsafe_b64decode(padded_bytes)
779+
780+
if compressed_pickle.startswith(b"\x28\xb5\x2f\xfd"):
781+
pickled = zstandard.decompress(compressed_pickle)
782+
else:
783+
pickled = zlib.decompress(compressed_pickle)
784+
785+
config_structure = msgpack.loads(pickled, raw=False)
786+
version, bases, rules = config_structure
787+
if version not in VERSIONS:
788+
raise InvalidEnhancerConfig(f"Unknown enhancements version: {version}")
789+
790+
rules = [EnhancementRule._from_config_structure(rule, version) for rule in rules]
791+
rust_enhancements = get_rust_enhancements("config_structure", pickled)
792+
793+
except (LookupError, AttributeError, TypeError, ValueError) as e:
794+
raise ValueError("invalid stack trace rule config: %s" % e)
795+
796+
return EnhancementsConfig(rules, rust_enhancements, version, bases)
797+
773798
@classmethod
774799
def from_base64_string(
775800
cls, base64_string: str | bytes, referrer: str | None = None
@@ -784,31 +809,17 @@ def from_base64_string(
784809
if isinstance(base64_string, str)
785810
else base64_string
786811
)
787-
padded_bytes = bytes_str + b"=" * (4 - (len(bytes_str) % 4))
788-
try:
789-
compressed_pickle = base64.urlsafe_b64decode(padded_bytes)
790812

791-
if compressed_pickle.startswith(b"\x28\xb5\x2f\xfd"):
792-
pickled = zstandard.decompress(compressed_pickle)
793-
else:
794-
pickled = zlib.decompress(compressed_pickle)
813+
unsplit_config = cls._get_config_from_base64_bytes(bytes_str)
795814

796-
config_structure = msgpack.loads(pickled, raw=False)
797-
version, bases, rules = config_structure
798-
if version not in VERSIONS:
799-
raise InvalidEnhancerConfig(f"Unknown enhancements version: {version}")
815+
version = unsplit_config.version
816+
bases = unsplit_config.bases
800817

801-
metrics_timer_tags.update({"split": version == 3})
802-
803-
rules = [EnhancementRule._from_config_structure(rule, version) for rule in rules]
804-
rust_enhancements = get_rust_enhancements("config_structure", pickled)
805-
806-
except (LookupError, AttributeError, TypeError, ValueError) as e:
807-
raise ValueError("invalid stack trace rule config: %s" % e)
818+
metrics_timer_tags.update({"split": version == 3})
808819

809820
return cls(
810-
rules=rules,
811-
rust_enhancements=rust_enhancements,
821+
rules=unsplit_config.rules,
822+
rust_enhancements=unsplit_config.rust_enhancements,
812823
version=version,
813824
bases=bases,
814825
)

0 commit comments

Comments
 (0)