Esempio n. 1
0
    def start_response(self, status, headers, exc_info=None):
        """'start_response()' callable as specified by PEP 333"""
        if exc_info:
            try:
                if self.headers_sent:
                    raise exc_info[0], exc_info[1], exc_info[2]
            finally:
                exc_info = None

        elif self.headers is not None:
            raise AssertionError('Headers already set!')
        raise type(status) is StringType or AssertionError(
            'Status must be a string')
        raise len(status) >= 4 or AssertionError(
            'Status must be at least 4 characters')
        raise int(status[:3]) or AssertionError(
            'Status message must begin w/3-digit code')
        raise status[3] == ' ' or AssertionError(
            'Status message must have a space after code')
        for name, val in headers:
            raise type(name) is StringType or AssertionError(
                'Header names must be strings')
            raise type(val) is StringType or AssertionError(
                'Header values must be strings')
            raise not is_hop_by_hop(name) or AssertionError(
                'Hop-by-hop headers not allowed')

        self.status = status
        self.headers = self.headers_class(headers)
        return self.write
Esempio n. 2
0
    def start_response(self, status, headers,exc_info=None):
        """'start_response()' callable as specified by PEP 333"""

        if exc_info:
            try:
                if self.headers_sent:
                    # Re-raise original exception if headers sent
                    raise exc_info[0], exc_info[1], exc_info[2]
            finally:
                exc_info = None        # avoid dangling circular ref
        elif self.headers is not None:
            raise AssertionError("Headers already set!")

        assert type(status) is StringType,"Status must be a string"
        assert len(status)>=4,"Status must be at least 4 characters"
        assert int(status[:3]),"Status message must begin w/3-digit code"
        assert status[3]==" ", "Status message must have a space after code"
        if __debug__:
            for name,val in headers:
                assert type(name) is StringType,"Header names must be strings"
                assert type(val) is StringType,"Header values must be strings"
                assert not is_hop_by_hop(name),"Hop-by-hop headers not allowed"
        self.status = status
        self.headers = self.headers_class(headers)
        return self.write
Esempio n. 3
0
    def start_response(self, status, headers, exc_info=None):
        """'start_response()' callable as specified by PEP 333"""

        if exc_info:
            try:
                if self.headers_sent:
                    # Re-raise original exception if headers sent
                    raise exc_info[0], exc_info[1], exc_info[2]
            finally:
                exc_info = None  # avoid dangling circular ref
        elif self.headers is not None:
            raise AssertionError("Headers already set!")

        assert type(status) is StringType, "Status must be a string"
        assert len(status) >= 4, "Status must be at least 4 characters"
        assert int(status[:3]), "Status message must begin w/3-digit code"
        assert status[3] == " ", "Status message must have a space after code"
        if __debug__:
            for name, val in headers:
                assert type(name) is StringType, "Header names must be strings"
                assert type(val) is StringType, "Header values must be strings"
                assert not is_hop_by_hop(
                    name), "Hop-by-hop headers not allowed"
        self.status = status
        self.headers = self.headers_class(headers)
        return self.write
Esempio n. 4
0
    def start_response(self, status, headers, exc_info=None):
        """'start_response()' callable as specified by PEP 333"""

        # M:
        # exc_info:
        #    The exc_info argument, if supplied, must be a Python sys.exc_info()
        #    tuple. This argument should be supplied by the application only if
        #    start_response is being called by an error handler.

        #    exc_info is the most recent exception catch in except clause

        #    in error_output:
        #        start_response(
        #             self.error_status,self.error_headers[:],sys.exc_info())

        # headers_sent:
        #    when send_headers is invoked, headers_sent = True
        #    when close is invoked, headers_sent = False

        if exc_info:
            try:
                if self.headers_sent:
                    # Re-raise original exception if headers sent
                    raise exc_info[0], exc_info[1], exc_info[2]
            finally:
                exc_info = None  # avoid dangling circular ref
        elif self.headers is not None:
            raise AssertionError("Headers already set!")

        assert type(status) is StringType, "Status must be a string"
        assert len(status) >= 4, "Status must be at least 4 characters"
        assert int(status[:3]), "Status message must begin w/3-digit code"
        assert status[3] == " ", "Status message must have a space after code"
        if __debug__:
            for name, val in headers:
                assert type(name) is StringType, "Header names must be strings"
                assert type(val) is StringType, "Header values must be strings"
                assert not is_hop_by_hop(
                    name), "Hop-by-hop headers not allowed"

        # M: set status and headers

        self.status = status

        # M:
        #    headers_class is Headers in module headers
        self.headers = self.headers_class(headers)

        return self.write
Esempio n. 5
0
    def start_response(self, status, headers,exc_info=None):
        """'start_response()' callable as specified by PEP 333"""

        # M:
        # exc_info:
        #    The exc_info argument, if supplied, must be a Python sys.exc_info()
        #    tuple. This argument should be supplied by the application only if
        #    start_response is being called by an error handler.

        #    exc_info is the most recent exception catch in except clause

        #    in error_output:
        #        start_response(
        #             self.error_status,self.error_headers[:],sys.exc_info())

        # headers_sent:
        #    when send_headers is invoked, headers_sent = True
        #    when close is invoked, headers_sent = False

        if exc_info:
            try:
                if self.headers_sent:
                    # Re-raise original exception if headers sent
                    raise exc_info[0], exc_info[1], exc_info[2]
            finally:
                exc_info = None        # avoid dangling circular ref
        elif self.headers is not None:
            raise AssertionError("Headers already set!")

        assert type(status) is StringType,"Status must be a string"
        assert len(status)>=4,"Status must be at least 4 characters"
        assert int(status[:3]),"Status message must begin w/3-digit code"
        assert status[3]==" ", "Status message must have a space after code"
        if __debug__:
            for name,val in headers:
                assert type(name) is StringType,"Header names must be strings"
                assert type(val) is StringType,"Header values must be strings"
                assert not is_hop_by_hop(name),"Hop-by-hop headers not allowed"

        # M: set status and headers

        self.status = status

        # M:
        #    headers_class is Headers in module headers
        self.headers = self.headers_class(headers)

        return self.write
Esempio n. 6
0
    def start_response(self, status, headers, exc_info=None):
        """'start_response()' callable as specified by PEP 333"""
        # 设置好头信息,返回write函数
        #
        # 三种错误:
        #           1.若头还未设置,比如status出现错误的情景
        #
        #           2.若头已经设置好,发送数据(finish_response/write)时出现
        #             问题,比如第一次data不符合类型,此时头还未发送
        #
        #           3.若头已通过设置并随第一次data发送,但第二次data有问题,
        #             handle_error处理不了,直接交给self.close
        #
        #           ...
        #
        if exc_info:  #错误处理如何进行?
            try:
                if self.headers_sent:
                    # Re-raise original exception if headers sent
                    raise exc_info[0], exc_info[1], exc_info[2]
            finally:
                exc_info = None  # avoid dangling circular ref
        elif self.headers is not None:  # 多余吗?
            raise AssertionError("Headers already set!")

        assert type(status) is StringType, "Status must be a string"
        assert len(status) >= 4, "Status must be at least 4 characters"
        assert int(status[:3]), "Status message must begin w/3-digit code"
        assert status[3] == " ", "Status message must have a space after code"
        if __debug__:  # 如何使用?
            for name, val in headers:
                assert type(name) is StringType, "Header names must be strings"
                assert type(val) is StringType, "Header values must be strings"
                assert not is_hop_by_hop(
                    name), "Hop-by-hop headers not allowed"
        self.status = status
        self.headers = self.headers_class(headers)  # 设置好头信息
        return self.write  # 这样app里就可以捕获服务器端write函数并运用它了!!!!!
Esempio n. 7
0
    def start_response(self, status, headers, exc_info = None):
        """'start_response()' callable as specified by PEP 333"""
        if exc_info:
            try:
                if self.headers_sent:
                    raise exc_info[0], exc_info[1], exc_info[2]
            finally:
                exc_info = None

        elif self.headers is not None:
            raise AssertionError('Headers already set!')
        raise type(status) is StringType or AssertionError('Status must be a string')
        raise len(status) >= 4 or AssertionError('Status must be at least 4 characters')
        raise int(status[:3]) or AssertionError('Status message must begin w/3-digit code')
        raise status[3] == ' ' or AssertionError('Status message must have a space after code')
        for name, val in headers:
            raise type(name) is StringType or AssertionError('Header names must be strings')
            raise type(val) is StringType or AssertionError('Header values must be strings')
            raise not is_hop_by_hop(name) or AssertionError('Hop-by-hop headers not allowed')

        self.status = status
        self.headers = self.headers_class(headers)
        return self.write