U 췀g"@sBddlZddlZddlZddlZddlmZddlZddlmZm Z ddl m Z ddl m Z ddlmZmZddlmZmZmZmZmZmZmZddlmZerdd lmZdd lmZdd lmZdd lmZdd lmZddl m!Z!m"Z"e#dej$ddej%dZ&Gddde Z'ddZ(dddZ)ddZ*ddZ+dS)N)HTTPConnection)OPSPANDATA) Integration)add_global_event_processor)EnvironHeadersshould_propagate_trace)SENSITIVE_DATA_SUBSTITUTEcapture_internal_exceptionsensure_integration_enabled is_sentry_urllogger safe_repr parse_url) TYPE_CHECKING)Any)Callable)Dict)Optional)List)EventHintz%s.%s.%s)nameversionbuildc@seZdZdZeddZdS)StdlibIntegrationstdlibcCstttdd}dS)NcSs<ttdk r8|di}t|tr8d|kr8t|d<|S)Ncontextsruntime) sentry_sdk get_clientget_integrationr setdefault isinstancedict_RUNTIME_CONTEXT)eventhintrr)L/opt/hc_python/lib/python3.8/site-packages/sentry_sdk/integrations/stdlib.pyadd_python_runtime_context2s  z@StdlibIntegration.setup_once..add_python_runtime_context)_install_httplib_install_subprocessr)r+r)r)r* setup_once,szStdlibIntegration.setup_onceN)__name__ __module__ __qualname__ identifier staticmethodr.r)r)r)r*r)srcs4tjtjfdd}fdd}|t_|t_dS)Nc s||j}|j}|j}t}|tdks2t||rF|||f||S|} | dks\| dsd|dkrjdpld|||kr~d|pd|f} d} t t | dd } W5QRXtj t j d || r| jntfd d } | tj|| dk r| d | j| tj| j| tj| j|||f||} t|| rrtj| dD],\} }tdj| || d|| |qD| |_| S)N)zhttp://zhttps://z %s://%s%s%sihttpshttpz:%sF)sanitizez%s %szauto.http.stdlib.httpliboproriginurlspanzJ[Tracing] Adding `{key}` header {value} to outgoing request to {real_url}.)keyvaluereal_url)hostport default_portr r!r"rr startswithr r start_spanrZ HTTP_CLIENTr;r set_datarZ HTTP_METHODZ HTTP_QUERYqueryZ HTTP_FRAGMENTfragmentrget_current_scopeiter_trace_propagation_headersr debugformat putheader_sentrysdk_span)selfmethodr;argskwargsrArBrCclientr@ parsed_urlr=rvr>r?)real_putrequestr)r* putrequestBsd  z$_install_httplib..putrequestcsft|dd}|dkr$|f||Sz2|f||}|t|j|d|jW5|X|S)NrNreason)getattrfinishZset_http_statusintstatusrFrX)rOrQrRr=rU)real_getresponser)r* getresponse{s  z%_install_httplib..getresponse)rrWr^)rWr^r))r]rVr*r,=s  9 r,cCs||kr2||}|dk r ||}|dk r|||<nR|t|krh||}|dk rV||}|dk r|||<n|or|d}|dk r|||<|S)a? given (*args, **kwargs) of a function call, retrieve (and optionally set a default for) an argument by either name or position. This is useful for wrapping functions with complex type signatures and extracting a few arguments without needing to redefine that function's entire type signature. N)len)rQrRrpositionZsetdefault_callbackrUr)r)r*_init_arguments     racsvtjjttfdd}|tj_tjjttfdd}|tj_tjjttfdd}|tj_dS)Nc s&t|}t||ddpg}t||dd}d}t|ttfrht|dkrhtdtt|}W5QRX|dkrxt |}d}t j t j |dd}t j|d D]<\}} |dkrt||d d d d }| |d|dd<q|r|d||f||} |d|j| W5QRSQRXdS)NrQrcwd d !auto.subprocess.stdlib.subprocessr8r<env cSst|dk r|ntjS)N)r%osenviron)xr)r)r*zH_install_subprocess..sentry_patched_popen_init.. SUBPROCESS_-_zsubprocess.cwdsubprocess.pid)listrar$tupler_r joinmapstrrr rErZ SUBPROCESSrIrJupperreplacerFset_tagpid) rOakwrQrb descriptionrgr=kvrU)old_popen_initr)r*sentry_patched_popen_initsB  z6_install_subprocess..sentry_patched_popen_initc sFtjtjdd,}|d|j|f||W5QRSQRXdSNrf)r9r:rq)r rErZSUBPROCESS_WAITryrzrOr{r|r=)old_popen_waitr)r*sentry_patched_popen_waitsz6_install_subprocess..sentry_patched_popen_waitc sFtjtjdd,}|d|j|f||W5QRSQRXdSr)r rErZSUBPROCESS_COMMUNICATEryrzr)old_popen_communicater)r* sentry_patched_popen_communicatesz=_install_subprocess..sentry_patched_popen_communicate) subprocessPopen__init__r rwait communicate)rrrr))rrrr*r-s4  r-cCsttjddS)Nrn)prefix)rrirjr)r)r)r*"get_subprocess_traceparent_headerssr)N),rirsysplatform http.clientrr Zsentry_sdk.constsrrZsentry_sdk.integrationsrZsentry_sdk.scoperZsentry_sdk.tracing_utilsrrZsentry_sdk.utilsr r r r r rrtypingrrrrrrZsentry_sdk._typesrrpython_implementation version_inforr&rr,rar-rr)r)r)r*s6   $      S X