U 췀g*@sddlZddlmZddlZddlmZmZddlmZddl m Z ddl m Z ddl mZmZmZddlmZdd l mZdd lmZmZdd lmZmZmZmZdd lmZerZdd lmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddl'm(Z(m)Z)e$dZ*e$dZ+e$dZ,Gddde%Z-edZ.d2dd Z/d3d"d#Z0Gd$d%d%Z1d4d&d'Z2d(d)Z3d*d+Z4d,d-Z5Gd.d/d/Z6d0d1Z7dS)5N)partial)get_host _get_headers)continue_trace)OPshould_send_default_pii)DEFAULT_HTTP_METHODS_TO_CAPTURE_filter_headers nullcontext) track_session)use_isolation_scope) TransactionTRANSACTION_SOURCE_ROUTE) ContextVarcapture_internal_exceptionsevent_from_exceptionreraise) TYPE_CHECKING)Callable)Dict)Iterator)Any)Tuple)Optional)TypeVar)Protocol)ExcInfo)EventEventProcessorWsgiResponseIterWsgiResponseHeaders WsgiExcInfoc@seZdZdddZdS) StartResponseNcCsdSN)selfstatusresponse_headersexc_infor%r%J/opt/hc_python/lib/python3.8/site-packages/sentry_sdk/integrations/wsgi.py__call__,szStartResponse.__call__)N)__name__ __module__ __qualname__r+r%r%r%r*r#+sr#Zsentry_wsgi_middleware_appliedutf-8replacecCs|d||S)Nlatin1)encodedecode)scharseterrorsr%r%r*wsgi_decoding_dance4sr7FcCsV|ddd}|ddd}|d|}d|dt||t|dfS)zPReturn the absolute URL without query string for the given WSGI environment.Z SCRIPT_NAME/Z PATH_INFOz %s://%s/%szwsgi.url_scheme)getrstriplstriprr7)environuse_x_forwarded_for script_nameZ path_infopathr%r%r*get_request_url9s rAc@s(eZdZdZddefddZddZdS) SentryWsgiMiddlewareappr> span_originhttp_methods_to_captureFZmanualcCs||_||_||_||_dSr$rC)r&rDr>rErFr%r%r*__init__PszSentryWsgiMiddleware.__init__c Cs2tdr|||Stdzt}t|ddt&|d|_ | t ||j W5QRX|dd }d}||jkrt|tjdt|jd }|dk rtj|d |id nt>z||tt||}Wntk rttYnXW5QRXW5QRXW5QRXW5tdXt||S) NFTrequest)Z session_modewsgiREQUEST_METHODr8zgeneric WSGI request)opnamesourceoriginZ wsgi_environ)Zcustom_sampling_context)_wsgi_middleware_appliedr:rDset sentry_sdkZisolation_scoper rZclear_breadcrumbs_nameZadd_event_processor_make_wsgi_event_processorr>upperrFrrZ HTTP_SERVERrrEZstart_transactionr r_sentry_start_response BaseExceptionr_capture_exception_ScopedResponse)r&r=Zstart_responsescopemethod transactionresponser%r%r*r+]sZ      2 zSentryWsgiMiddleware.__call__N)r,r-r. __slots__r rGr+r%r%r%r*rBHs   rBc CsZt,t|ddd}|dk r.||W5QRX|dkrJ|||S||||SdS)N r)rintsplitZset_http_status)Zold_start_responser[r'r(r)Z status_intr%r%r*rUs rUccs<ddg}tr|dg7}|D]}||kr|||fVqdS)z Returns our explicitly included environment variables we want to capture (server name, port and remote addr if pii is enabled). Z SERVER_NAMEZ SERVER_PORT REMOTE_ADDRNr)r=keyskeyr%r%r* _get_environs  rec Cs\z|dddWSttfk r0YnXz |dWStk rPYnX|dS)z Infer the user IP address from various headers. This cannot be used in security sensitive situations since the value may be forged from a client, but it's good enough for the event payload. ZHTTP_X_FORWARDED_FOR,rZHTTP_X_REAL_IPrb)rastripKeyError IndexErrorr:)r=r%r%r* get_client_ips rjcCsXt}|d}t|to"|jdk}|sTt|tjdddd\}}tj ||d|S)z Captures the current exception and sends it to Sentry. Returns the ExcInfo tuple to it can be reraised afterwards. r_)rNrIF)typeZhandled)Zclient_optionsZ mechanism)hint) sysr) isinstance SystemExitcoderrQZ get_clientoptionsZ capture_event)r)eZshould_skip_captureeventrlr%r%r*rWs rWc@s,eZdZdZdZddZddZddZd S) rXaY Users a separate scope for each response chunk. This will make WSGI apps more tolerant against: - WSGI servers streaming responses from a different thread/from different threads than the one that called start_response - close() not being called - WSGI servers streaming responses interleaved from the same thread ) _response_scopecCs||_||_dSr$)rurt)r&rYr\r%r%r*rGsz_ScopedResponse.__init__c csxt|j}t|jRz t|}Wn>tk rDYW5QRqtYntk r`ttYnXW5QRX|Vq dSr$) iterrtr runext StopIterationrVrrW)r&iteratorchunkr%r%r*__iter__s   z_ScopedResponse.__iter__c CsZt|jFz|jWn0tk r.Yntk rJttYnXW5QRXdSr$)r rurtcloseAttributeErrorrVrrW)r&r%r%r*r|s z_ScopedResponse.closeN)r,r-r.__doc__r]rGr{r|r%r%r%r*rXs  rXcs\t|t|||d|dtt|ttt|fdd}|S)NZ QUERY_STRINGrJc slt\|di}tr6|di}r6|d|d<|d<|d<|d<|d<W5QRX|S) NrHuser ip_addressurl query_stringrZenvheaders)r setdefaultr)rsrlZ request_infoZ user_infoZ client_iprrrZr request_urlr%r*event_processor#s   z3_make_wsgi_event_processor..event_processor)rjrAr:dictrer r)r=r>rr%rr*rSs    rS)r/r0)F)N)8rm functoolsrrQZsentry_sdk._werkzeugrrZsentry_sdk.apirZsentry_sdk.constsrZsentry_sdk.scoperZ$sentry_sdk.integrations._wsgi_commonr r r Zsentry_sdk.sessionsr r Zsentry_sdk.tracingrrZsentry_sdk.utilsrrrrtypingrrrrrrrrrrZsentry_sdk._typesrrr r!r"r#rOr7rArBrUrerjrWrXrSr%r%r%r*sL                  N ,