U \@sddlZddlmZmZddlmZmZddlmZm Z ddl m Z erTddd Zn dd d Zd d Zd dZGdddeZddZddZddZddZGdddeZddZdS)N)Hub_should_send_default_pii)capture_internal_exceptionsevent_from_exception)PY2reraise)_filter_headersutf-8replacecCs |||SN)decodescharseterrorsr/wsgi.pywsgi_decoding_dancesrcCs|d||S)Nlatin1)encoder r rrrrscCs|drZ|d}|ddkr6|dr6|dd}q|ddkr|dr|dd }n<|d r|d }|d|d fd kr|d |d 7}nd}|S)zEReturn the host for the given WSGI environment. Yanked from Werkzeug.Z HTTP_HOSTwsgi.url_schemehttpz:80Nhttpsz:443 SERVER_NAME SERVER_PORT))rZ443)rZ80:unknown)getendswith)environrvrrrget_host"s  r#cCs,d|dt|t|dpddfS)zPReturn the absolute URL without query string for the given WSGI environment.z %s://%s/%srZ PATH_INFO/)rr#rlstripr!rrrget_request_url9s r(c@s eZdZdZddZddZdS)SentryWsgiMiddlewareappcCs ||_dSr r*)selfr+rrr__init__GszSentryWsgiMiddleware.__init__c Csttj}|zt6|"}|d|_|t|W5QRXW5QRXz|||}Wn t k rt t |YnXW5QRXt ||S)Nwsgi) rZcurrentrZconfigure_scopeZclear_breadcrumbs_nameZadd_event_processor_make_wsgi_event_processorr+ Exceptionr_capture_exception_ScopedResponse)r,r!Zstart_responsehubZscoper"rrr__call__Ks  "zSentryWsgiMiddleware.__call__N)__name__ __module__ __qualname__ __slots__r-r5rrrrr)Dsr)ccs6d}tr|d7}|D]}||kr|||fVqdS)z8 Returns our whitelisted environment variables. )rr) REMOTE_ADDRN)r)r!keyskeyrrr _get_environ^s r=ccsn|D]`\}}t|}|drJ|dkrJ|dddd|fVq|dkr|dd|fVqdS)z, Returns only proper HTTP headers. ZHTTP_)ZHTTP_CONTENT_TYPEZHTTP_CONTENT_LENGTHN_-)Z CONTENT_TYPEZCONTENT_LENGTH)itemsstr startswithr title)r!r<valuerrr _get_headersps  rFc Cs@z|dddWSttfk r:|dYSXdS)z Naively yank the first IP address in an X-Forwarded-For header and assume this is correct. Note: Don't use this in security sensitive situations since this value may be forged from a client. ZHTTP_X_FORWARDED_FOR,rr:N)splitstripKeyError IndexErrorrr'rrr get_client_ips rLcCs@|jdk r.event_processor)rLr(rdictr=rrF)r!rcrrbrr0s   r0)r r )r r )rOZsentry_sdk.hubrrZsentry_sdk.utilsrrZsentry_sdk._compatrrZ$sentry_sdk.integrations._wsgi_commonrCallableZDictZListIteratorZAnyZTupleZOptionalZExcInforr#r(objectr)r=rFrLr2r3r0rrrrs     !