U 췀g.f@sddlZddlZddlZddlmZddlmZddlZddlm Z ddl m Z m Z m Z ddlmZmZmZmZddlmZddlmZdd lmZmZmZdd lmZmZmZmZm Z m!Z!m"Z"dd l#m$Z$e$r dd l#m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,dd l-m.Z.m/Z/zxddl0Z0ddl0m1Z2ddl3m4Z4ddl5m6Z6ddl7m8Z8ddl9m:Z:ddl;mZ>ddl?m@Z@mAZAmBZCmDZDWneEk re dYnXzddlFmGZGWn"eEk rddlHmGZGYnXz0z ddlIZJWneEk rddlJZJYnXWneEk r dZJYnXdZKdZLGddde ZMddZNeeMd9dd ZOd!d"ZPeeMd#d$ZQd%d&ZRd'd(ZSd)d*ZTd+d,ZUd-d.ZVd/d0ZWGd1d2d2ZXd3d4ZYd5d6ZZd7d8Z[dS):N)Set)deepcopy)OP) DidNotEnable Integration$_DEFAULT_FAILED_REQUEST_STATUS_CODES)DEFAULT_HTTP_METHODS_TO_CAPTUREHttpCodeRangeContainer_is_json_content_typerequest_body_within_bounds)SentryAsgiMiddleware)should_send_default_pii)SOURCE_FOR_STYLETRANSACTION_SOURCE_COMPONENTTRANSACTION_SOURCE_ROUTE)AnnotatedValuecapture_internal_exceptionsensure_integration_enabledevent_from_exceptionlogger parse_versiontransaction_from_function) TYPE_CHECKING)Any AwaitableCallable ContainerDictOptionalTupleUnion)EventHttpStatusCodeRange) __version__) Starlette) UploadFile) Middleware)AuthenticationMiddleware)Request)Match)ASGIAppReceiveScopeSendzStarlette is not installed)ExceptionMiddlewarezgeneric Starlette request)endpointurlc@s<eZdZdZdeZdZdedefddZe dd Z d S) StarletteIntegration starlettez auto.http.r0TcCsv|tkrtd|tf||_||_tttj||_t |t rH||_ n*t j dtdd|dkrht|_ n t||_ dS)Nz7Invalid value for transaction_style: %s (must be in %s)zgPassing a list or None for failed_request_status_codes is deprecated. Please pass a set of int instead.) stacklevel)TRANSACTION_STYLE_VALUES ValueErrortransaction_stylemiddleware_spanstuplemapstrupperhttp_methods_to_capture isinstancerfailed_request_status_codeswarningswarnDeprecationWarningrr )selfr8r@r9r>rEO/opt/hc_python/lib/python3.8/site-packages/sentry_sdk/integrations/starlette.py__init__Ys, zStarletteIntegration.__init__cCsBtt}|dkrtdtttt|dkr>tdS)Nz Unparsable Starlette version: {})r)rSTARLETTE_VERSIONrformatpatch_middlewarespatch_asgi_apppatch_request_responsepatch_templates)versionrErErF setup_once}szStarletteIntegration.setup_onceN) __name__ __module__ __qualname__ identifieroriginr8rrrG staticmethodrPrErErErFr1Ss  $r1cs*|jfdd}jdk}|r&||_|S)Nc stt}|dks|js4||f|IdHS|jjt|||\}}|dk rftj ||dtj t j tj d}|dfdd} tdt} | dk} | s| n} fdd } tdt}|d k}|s| n}||| |f|IdHW5QRSQRXdS) NsourceopnamerUstarlette.middleware_namec sTtjtjtdttjd*}|d||IdHW5QRSQRXdSNrSrYr\) sentry_sdk start_spanrZMIDDLEWARE_STARLETTE_RECEIVEgetattrr<r1rUset_tagargskwargsspan)middleware_namereceiverErF_sentry_receives zO_enable_span_for_middleware.._create_span_call.._sentry_receiverQrhc sTtjtjtdttjd*}|d||IdHW5QRSQRXdSr]) r^r_rZMIDDLEWARE_STARLETTE_SENDr`r<r1rUrarb)rfsendrErF _sentry_sends zL_enable_span_for_middleware.._create_span_call.._sentry_sendrj)r^ get_clientget_integrationr1r9 __class__rQ _get_transaction_from_middlewareget_current_scopeset_transaction_namer_rZMIDDLEWARE_STARLETTErUrar`r<)appscopergrird integrationr[rXZmiddleware_spanrhZ receive_nameZreceive_patchedZ new_receiverjZ send_nameZ send_patchedZnew_sendold_call)rfrgrirF_create_span_calls4     z6_enable_span_for_middleware.._create_span_call)rv%_sentry_authenticationmiddleware_call _sentry_exceptionmiddleware_call)__call__rQ)middleware_classrvnot_yet_patchedrErtrF_enable_span_for_middlewares  7 r|FcCs2t|tjtj|dd\}}tj||ddS)N)typehandled)Zclient_optionsZ mechanism)hint)rr^rkoptionsr1rTZ capture_event) exceptionr~eventrrErErF_capture_exceptions  rcsD|jdtk}|r@fdd}||_|jfdd}||_dS)zX Capture all exceptions in Starlette app and also extract user information. _sentry_middleware_initcsD|f|||jfdd}|jD]}||j|<q0dS)Ncstt}|d}|dk rPt|do>t|jto>|j|jk}|rPt |ddd}t |j D]}|kr^|}qxq^|dkrdSt |r||f||IdHS||f||SdS)Nr status_codeT)r~) r^rkrlr1hasattrr?rintr@rr}__mro___is_async_callable)rDrcrdrsexpZis_http_server_errorZ old_handlerclsZ old_handlersrErF!_sentry_patched_exception_handlers,    zfpatch_exception_middleware.._sentry_middleware_init.._sentry_patched_exception_handler)Z_exception_handlerscopykeys)rDrcrdrkeyold_middleware_initrrFrs   z;patch_exception_middleware.._sentry_middleware_initcs t|||||IdHdSN_add_user_to_sentry_scoperDrrrgrirtrErFrxs zDpatch_exception_middleware.._sentry_exceptionmiddleware_callN)rGr<ry)rzr{rrxrE)rurrFpatch_exception_middlewares  * rcCsd|kr dStsdSi}|d}t|dd}|r@|d|jt|dd}|r^|d|jt|dd}|r||d|jt}||_dS)zZ Extracts user information from the ASGI scope and adds it to Sentry's scope. userNusernameidemail) r r` setdefaultrrrr^get_isolation_scoper)rrZ user_infoZstarlette_userrZuser_idr sentry_scoperErErFr/s"   rcs,|jdtk}|r(fdd}||_dS)z/ Add user information to Sentry scope. rwcs ||||IdHt|dSrrrrtrErFrwZszNpatch_authentication_middleware.._sentry_authenticationmiddleware_callN)ryr<)rzr{rwrErtrFpatch_authentication_middlewareOs   rcs,tjdtk}|r(fdd}|t_dS)za Patches Starlettes `Middleware` class to record spans for every middleware invoked. rcsP|tkr||f|St|}||f||tkr._sentry_middleware_initN)r&rGr<)r{rrErrFrKbs   rKcstjfdd}|t_dS)zG Instrument Starlette ASGI app using the SentryAsgiMiddleware. csptt}|dkr*|||IdHStfddtj|jtj|rN|jnt d}|j |_ ||||IdHS)Ncsf||SrrE)akw)old_apprDrErFzBpatch_asgi_app.._sentry_patched_asgi_app..)Zmechanism_typer8Z span_originr>) r^rkrlr1r rTr8rUr>rZ _run_asgi3ry)rDrrrgrirsZ middlewarerrDrF_sentry_patched_asgi_apps  z0patch_asgi_app.._sentry_patched_asgi_appN)r$ry)rrErrFrLs rLcCs2t|tjr|j}qt|p0t|o0t|jSr)r? functoolspartialfuncasyncioiscoroutinefunctioncallablery)objrErErFrs   rcs tjjfdd}|tj_dS)NcsD|t}|r"fdd}|}ntfdd}|}|S)Ncstt}|dkr&||IdHS|d}tt|j|t}t|}| IdHfdd}tj |_ | |||||IdHS)Nrcsfdd}|S)NcsH|di}r8dkr$d|d<dkr8d|d<t||d<|S)Nrequestcookiesdatagetrrr request_infoinforErFevent_processors    zpatch_request_response.._sentry_request_response.._sentry_async_func.._make_request_event_processor..event_processorrEreqrsrrrErF_make_request_event_processors z{patch_request_response.._sentry_request_response.._sentry_async_func.._make_request_event_processor) r^rkrlr1 _set_transaction_name_and_sourceror8rStarletteRequestExtractorextract_request_inforT_nameadd_event_processor)rcrdrsrr extractorrZold_funcrrF_sentry_async_funcs( zTpatch_request_response.._sentry_request_response.._sentry_async_funccstt}|dkr ||St}|jdk r<|jt}|jdk rX|j |d}t ||j |t |}| fdd}tj|_||||||S)Nrcsfdd}|S)Ncs(|di}r|d<t||d<|S)NrrrrrrErFrs   zpatch_request_response.._sentry_request_response.._sentry_sync_func.._make_request_event_processor..event_processorrErrrErFrs zzpatch_request_response.._sentry_request_response.._sentry_sync_func.._make_request_event_processor)r^rkrlr1roZ transactionZupdate_active_threadrZprofileZupdate_active_thread_idrr8rextract_cookies_from_requestrTrr)rcrdrsZ current_scoperrrrrrrF_sentry_sync_funcs2      zSpatch_request_response.._sentry_request_response.._sentry_sync_func)rrwraps)rZ is_coroutinerrZold_request_responserrF_sentry_request_responses -0z8patch_request_response.._sentry_request_response)r2ZroutingZrequest_response)rrErrFrMs mrMcsbzddlmWntk r&YdSXddlm}|jdtk}|r^fdd}||_dS)NrMarkup)Jinja2Templates_sentry_jinja2templates_initcsBfdd}|dg||dkr2|d||f||S)Ncst}d|iS)NZsentry_trace_meta)r^roZtrace_propagation_meta)rZ trace_metarrErFadd_sentry_trace_meta5s  zTpatch_templates.._sentry_jinja2templates_init..add_sentry_trace_metaZcontext_processors)rappend)rDrcrdrrZold_jinja2templates_initrErFr3s   z5patch_templates.._sentry_jinja2templates_init)Z markupsafer ImportErrorZstarlette.templatingrrGr<)rr{rrErrFrNs rNc@sTeZdZdZdZddZddZddZd d Zd d Z d dZ ddZ ddZ dS)rz Extracts useful information from the Starlette request (like form data or cookies) and adds it to the Sentry event. NcCs ||_dSr)r)rDrrErErFrGPsz"StarletteRequestExtractor.__init__cCsd}tr|}|Sr)r r)rDrrErErFrTsz6StarletteRequestExtractor.extract_cookies_from_requestc s"t}i}ttr(||d<|IdH}|sJ|W5QRS|rtt||stt|d<|W5QRS| IdH}|r||d<|W5QRS| IdH}|ri}| D]&\}}t |t } | s|nt||<q||d<|W5QRSt|d<|W5QRSQRXdS)Nrr)r^rkrr rcontent_lengthr rZremoved_because_over_size_limitjsonformitemsr?r%Zremoved_because_raw_data) rDclientrrrrZ form_datarvalis_filerErErFr\s>     z.StarletteRequestExtractor.extract_request_infocs d|jjkrt|jjdSdS)Nzcontent-length)rheadersrrrErErFrs z(StarletteRequestExtractor.content_lengthcCs|jjSr)rrrrErErFrsz!StarletteRequestExtractor.cookiescs,tdkr dS|jIdH|jIdHSr) multipartrbodyrrrErErFrszStarletteRequestExtractor.formcCst|jjdS)Nz content-type)r rrrrrErErFis_jsonsz!StarletteRequestExtractor.is_jsoncs|s dS|jIdHSr)rrrrrErErFrszStarletteRequestExtractor.json) rQrRrS__doc__rrGrrrrrrrrErErErFrHs0 rcCsD|d}|sdS|jD]&}||}|dtjkr|jSqdS)Nrouterr)rZroutesmatchesr)ZFULLpath)rrrZroutematchrErErF_transaction_name_from_routers    rcCstd}t|}|dkr2|jd}|rDt|p.d}n|dkrDt|j}|dkrTt}t}|j||dt d||dS)Nr/r0rWz=[Starlette] Set transaction name and source on scope: %s / %s) rrrrrr_DEFAULT_TRANSACTION_NAMErrprdebug)rrr8rr[rXr/rErErFrs"  rcCs@d}d}|jdkr"t|j}t}n|jdkr8t|}t}||fS)Nr/r0)r8rrmrrr)rqZ asgi_scopersr[rXrErErFrns   rn)F)\rrrAcollections.abcrrrr^Zsentry_sdk.constsrZsentry_sdk.integrationsrrrZ$sentry_sdk.integrations._wsgi_commonrr r r Zsentry_sdk.integrations.asgir Zsentry_sdk.scoper Zsentry_sdk.tracingrrrZsentry_sdk.utilsrrrrrrrtypingrrrrrrrrr Zsentry_sdk._typesr!r"r2r#rIZstarlette.applicationsr$Zstarlette.datastructuresr%Zstarlette.middlewarer&Z#starlette.middleware.authenticationr'Zstarlette.requestsr(Zstarlette.routingr)Zstarlette.typesr*r+r,ZStarletteScoper-rZstarlette.middleware.exceptionsr.Zstarlette.exceptionsZpython_multipartrrr6r1r|rrrrrKrLrrMrNrrrrnrErErErFst     $ (         <G M ! t*h