| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 | from ..utils import cached_propertyfrom .auth import WWWAuthenticateMixinfrom .base_response import BaseResponsefrom .common_descriptors import CommonResponseDescriptorsMixinfrom .cors import CORSResponseMixinfrom .etag import ETagResponseMixinclass ResponseStream(object):    """A file descriptor like object used by the :class:`ResponseStreamMixin` to    represent the body of the stream.  It directly pushes into the response    iterable of the response object.    """    mode = "wb+"    def __init__(self, response):        self.response = response        self.closed = False    def write(self, value):        if self.closed:            raise ValueError("I/O operation on closed file")        self.response._ensure_sequence(mutable=True)        self.response.response.append(value)        self.response.headers.pop("Content-Length", None)        return len(value)    def writelines(self, seq):        for item in seq:            self.write(item)    def close(self):        self.closed = True    def flush(self):        if self.closed:            raise ValueError("I/O operation on closed file")    def isatty(self):        if self.closed:            raise ValueError("I/O operation on closed file")        return False    def tell(self):        self.response._ensure_sequence()        return sum(map(len, self.response.response))    @property    def encoding(self):        return self.response.charsetclass ResponseStreamMixin(object):    """Mixin for :class:`BaseResponse` subclasses.  Classes that inherit from    this mixin will automatically get a :attr:`stream` property that provides    a write-only interface to the response iterable.    """    @cached_property    def stream(self):        """The response iterable as write-only stream."""        return ResponseStream(self)class Response(    BaseResponse,    ETagResponseMixin,    WWWAuthenticateMixin,    CORSResponseMixin,    ResponseStreamMixin,    CommonResponseDescriptorsMixin,):    """Full featured response object implementing the following mixins:    -   :class:`ETagResponseMixin` for etag and cache control handling    -   :class:`WWWAuthenticateMixin` for HTTP authentication support    -   :class:`~werkzeug.wrappers.cors.CORSResponseMixin` for Cross        Origin Resource Sharing headers    -   :class:`ResponseStreamMixin` to add support for the ``stream``        property    -   :class:`CommonResponseDescriptorsMixin` for various HTTP        descriptors    """
 |