U 췀g3@sTddlZddlZddlmZmZmZddlmZddlmZm Z m Z m Z m Z m Z ddlmZerddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZeeefZeeeeefgeeeffZeeefZ ee!e"e#fZ$dZ%dZ&dZ'dZ(gZ)ddZ*GdddZ+ddZ,dS)N)MappingSequenceSet)datetime)AnnotatedValuecapture_internal_exceptiondisable_capture_eventformat_timestamp safe_repr strip_string) TYPE_CHECKING) TracebackType)Any)Callable)ContextManager)Dict)List)Optional)Type)Union)NotImplementedTypei@B zcCst|dSN)global_repr_processorsappend) processorrC/opt/hc_python/lib/python3.8/site-packages/sentry_sdk/serializer.pyadd_global_repr_processor=src@s0eZdZdZddZddZddZdd Zd S) Memo_ids_objscCsi|_g|_dSrr!)selfrrr__init__Esz Memo.__init__cCs|j||Sr)r#rr$objrrrmemoizeJs z Memo.memoizecCs2|jd}t||jkrdS||jt|<dSdS)NTF)r#idr"r&rrr __enter__Os  zMemo.__enter__cCs|jt|jddSr)r"popr*r#)r$tyvaluetbrrr__exit__Xsz Memo.__exit__N)__name__ __module__ __qualname__ __slots__r%r(r+r0rrrrr Bs  r c st g g |dddk |dd |dd|ddfdd  fd d  fd d  fddd fdd fdd f ddtdz2|f|}s rt|tr d|d<|WStdXdS)at A very smart serializer that takes a dict and emits a json-friendly dict. Currently used for serializing the final Event and also prematurely while fetching the stack local variables for each frame in a stacktrace. It works internally with 'databags' which are arbitrary data structures like Mapping, Sequence and Set. The algorithm itself is a recursive graph walk down the data structures it encounters. It has the following responsibilities: * Trimming databags and keeping them within MAX_DATABAG_BREADTH and MAX_DATABAG_DEPTH. * Calling safe_repr() on objects appropriately to keep them informative and readable in the final payload. * Annotating the payload with the _meta field whenever trimming happens. :param max_request_body_size: If set to "always", will never trim request bodies. :param max_value_length: The max length to strip strings to, defaults to sentry_sdk.consts.DEFAULT_MAX_VALUE_LENGTH :param is_vars: If we're serializing vars early, we want to repr() things that are JSON-serializable to make their type more apparent. For example, it's useful to see the difference between a unicode-string and a bytestring when viewing a stacktrace. :param custom_repr: A custom repr function that runs before safe_repr on the object to be serialized. If it returns None or throws internally, we will fallback to safe_repr. Zmax_request_body_sizeNalwaysmax_value_lengthis_varsF custom_reprcsDz"d}dk r|}|p t|WStk r>t|YSXdSr)r Exception)r.Z repr_value)r8rr_safe_repr_wrappersz%serialize.._safe_repr_wrappercsxttkr^z(td}dt|i}Wntk rPi}YnX|qddi|dS)Nr))len setdefaultstr IndexErrorrupdate)metasegmentnode) meta_stackpathrr _annotates  zserialize.._annotatecsvzZr WdS}|dkr |WSd}|dkrJddkrJdWdS|dkrXWdSWntk rpYd SXd S) z A databag is any value that we need to trim. True for stuff like vars, request bodies, breadcrumbs and extra. :returns: `True` for "yes", `False` for :"no", `None` for "maybe soon". T)TNrZ breadcrumbsr;valuesextraNFr@)is_request_bodyp0)_is_request_bodyr7rFrr _is_databags zserialize.._is_databagcs>z"ddkr ddkr WdSWntk r8YdSXdS)Nrrequestr;dataTFrKr)rFrrrNs  z#serialize.._is_request_bodyc s|dk r|zzV|B}|r) rr,r=r( CYCLE_MARKER BaseExceptionrsysexc_info)r'rRrLrSrCrUrTresult)_serialize_node_implmemorErFrr_serialize_nodes,   "  z"serialize.._serialize_nodecs t|trf|j|j}|Sr) isinstancermetadatar.)r')rGrr_flatten_annotateds  z%serialize.._flatten_annotatedc s@t|trd}|dkr}|dkr(}|dkr6}|rl|rTrTtd}td}n|dkr`t}|dkrlt}|}|dk r|dkrddggd|rt|dSdS|rtr |d}tD]"}|||}|tk rƈ|Sqtt |d d} |dkst|t t tfrP|s@t|trHt |s@t |rH|S|Snft| rb| |St|tr|stt|S|St|tr(t|}i} d} |D]r\} } |dk r| |krt|d q$t| }| |||||dk r|d nd|d } | | |<| d 7} q| St|tst|ttfrg}t|D]`\} } |dk r| |krt|d q|| | ||||dk r|d nd|d qP|S|rƈ|}n8t|tst|tr|d d}t|ts|}t dko$ ddko$ ddk}|r0|St|dS)NFinfrz!limitx)rem) max_length)r\rTZ__sentry_repr__)r=r;)rCrSrRrLrTrUzutf-8replacespansr) description)r^rfloatMAX_DATABAG_DEPTHMAX_DATABAG_BREADTHr rNotImplementedgetattrtypeboolintmathisinfisnancallablerr?r rdictitemsr=serializable_str_typesrr enumeraterbytes bytearraydecode)r'rRrLrSrTrUhintsrrZZ sentry_reprZrv_dictikvZstr_kZrv_listZis_span_description) rGr`rOrNr:r]r7keep_request_bodiesr6r\rFrrr[s             &z'serialize.._serialize_node_implTr_meta)NNNNNN)r r,rsetr^ru)eventkwargsZserialized_eventr)rGr`rOrNr:r]r[r8r7rr6r\rErFr serializebs:      &     r)-rXrqcollections.abcrrrrZsentry_sdk.utilsrrrr r r typingr typesr rrrrrrrrZsentry_sdk._typesrr?SpanZ ReprProcessorrpSegmentryrz memoryviewrwZMAX_EVENT_BYTESrjrkrVrrr rrrrrs8