99import eventlet
1010from eventlet import greenio
1111from eventlet import support
12+ from eventlet .corolocal import local
1213from eventlet .green import BaseHTTPServer
1314from eventlet .green import socket
1415import six
@@ -69,19 +70,7 @@ class ChunkReadError(ValueError):
6970 pass
7071
7172
72- # special flag return value for apps
73- class _AlreadyHandled (object ):
74-
75- def __iter__ (self ):
76- return self
77-
78- def next (self ):
79- raise StopIteration
80-
81- __next__ = next
82-
83-
84- ALREADY_HANDLED = _AlreadyHandled ()
73+ WSGI_LOCAL = local ()
8574
8675
8776class Input (object ):
@@ -570,14 +559,12 @@ def cap(x):
570559
571560 try :
572561 try :
562+ WSGI_LOCAL .already_handled = False
573563 result = self .application (self .environ , start_response )
574- if (isinstance (result , _AlreadyHandled )
575- or isinstance (getattr (result , '_obj' , None ), _AlreadyHandled )):
576- self .close_connection = 1
577- return
578564
579565 # Set content-length if possible
580- if not headers_sent and hasattr (result , '__len__' ) and \
566+ if headers_set and \
567+ not headers_sent and hasattr (result , '__len__' ) and \
581568 'Content-Length' not in [h for h , _v in headers_set [1 ]]:
582569 headers_set [1 ].append (('Content-Length' , str (sum (map (len , result )))))
583570
@@ -599,6 +586,9 @@ def cap(x):
599586 towrite = []
600587 just_written_size = towrite_size
601588 towrite_size = 0
589+ if WSGI_LOCAL .already_handled :
590+ self .close_connection = 1
591+ return
602592 if towrite :
603593 just_written_size = towrite_size
604594 write (b'' .join (towrite ))
0 commit comments