U ì·€gtã@s¬ddlmZddlmZmZmZmZmZddlm Z ddl m Z ddl m Z e rpddl mZmZmZddlmZdd „Zd d „Zd d „Zdd„Zdd„Zdd„Zdd„ZdS)é)ÚSPANDATA)Ú"_COMMANDS_INCLUDING_SENSITIVE_DATAÚ _MAX_NUM_ARGSÚ_MAX_NUM_COMMANDSÚ_MULTI_KEY_COMMANDSÚ_SINGLE_KEY_COMMANDS)Úshould_send_default_pii)ÚSENSITIVE_DATA_SUBSTITUTE)Ú TYPE_CHECKING)ÚAnyÚOptionalÚSequence)ÚSpancCsŠ|g}t|ƒD]l\}}|tkr"q|| ¡}|tkr>| t¡q|dk}|rZ| t|ƒ¡qtƒrp| t|ƒ¡q| t¡qd |¡}|S)Nrú ) Ú enumeraterÚlowerrÚappendr ÚreprrÚjoin)ÚnameÚargsZ command_partsÚiÚargÚname_lowZarg_is_the_keyÚcommand©rúQ/opt/hc_python/lib/python3.8/site-packages/sentry_sdk/integrations/redis/utils.pyÚ_get_safe_commands    rcCs4t|tƒr,z | ¡WStk r*YdSXt|ƒS)NÚ)Ú isinstanceÚbytesÚdecodeÚUnicodeDecodeErrorÚstr©ÚkeyrrrÚ _safe_decode/s   r&cCsTt|tttfƒr&d dd„|Dƒ¡}n*t|tƒr:t|ƒ}n|dkrHd}nt|ƒ}|S)Nz, css|]}t|ƒVqdS©N)r&)Ú.0ÚxrrrÚ =sz!_key_as_string..r)rÚdictÚlistÚtuplerr r&r#r$rrrÚ_key_as_string:s  r.cCs¾d}|dk r"| ¡tkr"t|ƒ}n˜|dk rdt|ƒdkrdt|dtttfƒrXt|dƒ}qº|df}nV|dk rºd|krºt|dttfƒr¤t|dƒdkrºt|dƒ}n|ddk rº|df}|S)z… Gets the key (or keys) from the given method_name. The method_name could be a redis command or a django caching command Nérr%)rrr-Úlenrr+r,)Ú method_namerÚkwargsr%rrrÚ _get_safe_keyHs    r3cCs|jSr')r)rrrrÚ_parse_rediscluster_commandgsr4c Csx| d|¡| d|¡g}t|ƒD]8\}}|tkr8q^||ƒ}| t|d|dd…ƒ¡q$| dt|ƒ|dœ¡dS)Núredis.is_clusterzredis.transactionrr/zredis.commands)ÚcountZ first_ten)Úset_tagrrrrÚset_datar0) ÚspanÚ is_clusterZget_command_args_fnZis_transactionZ command_stackÚcommandsrrrrrrÚ_set_pipeline_datals  þþr<cGsj| d|¡|r*| d|¡| tj|¡|rf|rf| ¡}|tksV|tkrft|ƒdkrf| d|d¡dS)Nr5z redis.commandr/z redis.keyr)r7rZ DB_OPERATIONrrrr0)r9r:rrrrrrÚ_set_client_data„s  ÿ ÿr=N)Zsentry_sdk.constsrZ$sentry_sdk.integrations.redis.constsrrrrrZsentry_sdk.scoperZsentry_sdk.utilsr Útypingr r r r Zsentry_sdk.tracingrrr&r.r3r4r<r=rrrrÚs