def __init__(
     self,
     content: typing.Any,
     status_code: int = 200,
     headers: dict = None,
     media_type: str = None,
     background: BackgroundTask = None,
 ) -> None:
     if inspect.isasyncgen(content):
         self.body_iterator = content
     else:
         self.body_iterator = iterate_in_threadpool(content)
     self.status_code = status_code
     self.media_type = self.media_type if media_type is None else media_type
     self.background = background
     self.init_headers(headers)
示例#2
0
 def __init__(
     self,
     content: ContentStream,
     status_code: int = 200,
     headers: typing.Optional[typing.Mapping[str, str]] = None,
     media_type: typing.Optional[str] = None,
     background: typing.Optional[BackgroundTask] = None,
 ) -> None:
     if isinstance(content, typing.AsyncIterable):
         self.body_iterator = content
     else:
         self.body_iterator = iterate_in_threadpool(content)
     self.status_code = status_code
     self.media_type = self.media_type if media_type is None else media_type
     self.background = background
     self.init_headers(headers)
示例#3
0
    def __init__(
        self,
        content: Any,
        # content: Iterator[Any],
        # content: Union[
        #     Generator[Union[str, Dict], None, None],
        #     AsyncGenerator[Union[str, Dict], None],
        # ],
        status_code: int = 200,
        headers: dict = None,
        media_type: str = "text/html",
        background: BackgroundTask = None,
        ping: int = None,
        sep: str = None,
    ) -> None:
        self.sep = sep
        if inspect.isasyncgen(content):
            self.body_iterator = content
        else:
            self.body_iterator = iterate_in_threadpool(content)
        self.status_code = status_code
        self.media_type = self.media_type if media_type is None else media_type
        self.background = background

        _headers = dict()
        if headers is not None:  # pragma: no cover
            _headers.update(headers)

        # mandatory for servers-sent events headers
        _headers["Content-Type"] = "text/event-stream"
        _headers["Cache-Control"] = "no-cache"
        _headers["Connection"] = "keep-alive"
        _headers["X-Accel-Buffering"] = "no"
        # _headers['Transfer-Encoding'] = 'chunked'

        self.init_headers(_headers)

        self._loop = None
        self.ping_interval = self.DEFAULT_PING_INTERVAL if ping is None else ping
        self._ping_task = None
        self.active = True

        self._loop = asyncio.get_event_loop()
        self._ping_task = None
示例#4
0
    def __init__(
        self,
        content: Any,
        status_code: int = 200,
        headers: Optional[Dict] = None,
        media_type: str = "text/event-stream",
        background: Optional[BackgroundTask] = None,
        ping: Optional[int] = None,
        sep: Optional[str] = None,
        ping_message_factory: Optional[Callable[[], ServerSentEvent]] = None,
    ) -> None:
        self.sep = sep
        self.ping_message_factory = ping_message_factory
        if inspect.isasyncgen(content):
            self.body_iterator = (
                content
            )  # type: AsyncIterable[Union[Any,dict,ServerSentEvent]]
        else:
            self.body_iterator = iterate_in_threadpool(content)  # type: ignore
        self.status_code = status_code
        self.media_type = self.media_type if media_type is None else media_type
        self.background = background  # type: ignore  # follows https://github.com/encode/starlette/blob/master/starlette/responses.py

        _headers = {}
        if headers is not None:  # pragma: no cover
            _headers.update(headers)

        # mandatory for servers-sent events headers
        # allow cache control header to be set by user to support fan out proxies
        # https://www.fastly.com/blog/server-sent-events-fastly
        _headers.setdefault("Cache-Control", "no-cache")
        _headers["Connection"] = "keep-alive"
        _headers["X-Accel-Buffering"] = "no"

        self.init_headers(_headers)

        self.ping_interval = self.DEFAULT_PING_INTERVAL if ping is None else ping
        self.active = True

        self._ping_task = None