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
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
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
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
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
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函数并运用它了!!!!!
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