晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/opt/cloudlinux/venv/lib64/python3.11/site-packages/raven/ |
| Current File : //opt/cloudlinux/venv/lib64/python3.11/site-packages/raven/middleware.py |
"""
raven.middleware
~~~~~~~~~~~~~~~~~~~~~~~~
:copyright: (c) 2010-2012 by the Sentry Team, see AUTHORS for more details.
:license: BSD, see LICENSE for more details.
"""
from __future__ import absolute_import
from contextlib import contextmanager
from raven.utils.compat import Iterator, next
from raven.utils.wsgi import (
get_current_url, get_headers, get_environ)
@contextmanager
def common_exception_handling(environ, client):
try:
yield
except (StopIteration, GeneratorExit):
# Make sure we do this explicitly here. At least GeneratorExit
# is handled implicitly by the rest of the logic but we want
# to make sure this does not regress
raise
except Exception:
client.handle_exception(environ)
raise
except KeyboardInterrupt:
client.handle_exception(environ)
raise
except SystemExit as e:
if e.code != 0:
client.handle_exception(environ)
raise
class ClosingIterator(Iterator):
"""
An iterator that is implements a ``close`` method as-per
WSGI recommendation.
"""
def __init__(self, sentry, iterable, environ):
self.sentry = sentry
self.environ = environ
self._close = getattr(iterable, 'close', None)
self.iterable = iter(iterable)
self.closed = False
def __iter__(self):
return self
def __next__(self):
try:
with common_exception_handling(self.environ, self.sentry):
return next(self.iterable)
except StopIteration:
# We auto close here if we reach the end because some WSGI
# middleware does not really like to close things. To avoid
# massive leaks we just close automatically at the end of
# iteration.
self.close()
raise
def close(self):
if self.closed:
return
try:
if self._close is not None:
with common_exception_handling(self.environ, self.sentry):
self._close()
finally:
self.sentry.client.context.clear()
self.sentry.client.transaction.clear()
self.closed = True
class Sentry(object):
"""
A WSGI middleware which will attempt to capture any
uncaught exceptions and send them to Sentry.
>>> from raven.base import Client
>>> application = Sentry(application, Client())
"""
def __init__(self, application, client=None):
self.application = application
if client is None:
from raven.base import Client
client = Client()
self.client = client
def __call__(self, environ, start_response):
# TODO(dcramer): ideally this is lazy, but the context helpers must
# support callbacks first
self.client.http_context(self.get_http_context(environ))
with common_exception_handling(environ, self):
iterable = self.application(environ, start_response)
return ClosingIterator(self, iterable, environ)
def get_http_context(self, environ):
return {
'method': environ.get('REQUEST_METHOD'),
'url': get_current_url(environ, strip_querystring=True),
'query_string': environ.get('QUERY_STRING'),
# TODO
# 'data': environ.get('wsgi.input'),
'headers': dict(get_headers(environ)),
'env': dict(get_environ(environ)),
}
def handle_exception(self, environ=None):
return self.client.captureException()
|