Bladeren bron

Fix AttributeError: 'unicode' object has no attribute 'more'. Closes #466

Son Nguyen 10 jaren geleden
bovenliggende
commit
7e4e41b1f7
3 gewijzigde bestanden met toevoegingen van 25 en 2 verwijderingen
  1. 16 2
      supervisor/http.py
  2. 2 0
      supervisor/medusa/counter.py
  3. 7 0
      supervisor/web.py

+ 16 - 2
supervisor/http.py

@@ -92,7 +92,10 @@ class deferring_globbing_producer:
             if data is NOT_DONE_YET:
                 return NOT_DONE_YET
             if data:
-                self.buffer = self.buffer + data
+                try:
+                    self.buffer = self.buffer + data
+                except TypeError:
+                    self.buffer = as_bytes(self.buffer) + as_bytes(data)
             else:
                 break
         r = self.buffer
@@ -340,6 +343,13 @@ class deferring_http_channel(http_server.http_channel):
             else:
                 return False
 
+        # It is possible that self.ac_out_buffer is equal b''
+        # and in Python3 b'' is not equal ''. This cause
+        # http_server.http_channel.writable(self) is always True.
+        # To avoid this case, we need to force self.ac_out_buffer = ''
+        if len(self.ac_out_buffer) == 0:
+            self.ac_out_buffer = ''
+
         return http_server.http_channel.writable(self)
 
     def refill_buffer (self):
@@ -366,7 +376,11 @@ class deferring_http_channel(http_server.http_channel):
                     return
 
                 elif data:
-                    self.ac_out_buffer = self.ac_out_buffer + data
+                    try:
+                        self.ac_out_buffer = self.ac_out_buffer + data
+                    except TypeError:
+                        self.ac_out_buffer = as_bytes(self.ac_out_buffer) + as_bytes(data)
+
                     self.delay = False
                     return
                 else:

+ 2 - 0
supervisor/medusa/counter.py

@@ -12,6 +12,8 @@
 # method, the use of long arithmetic is a reminder that the counter
 # will overflow.
 
+from supervisor.compat import long
+
 class counter:
     """general-purpose counter"""
 

+ 7 - 0
supervisor/web.py

@@ -11,6 +11,7 @@ from supervisor.compat import urllib
 from supervisor.compat import parse_qs
 from supervisor.compat import parse_qsl
 from supervisor.compat import as_string
+from supervisor.compat import PY3
 
 from supervisor.medusa import producers
 from supervisor.medusa.http_server import http_date
@@ -124,6 +125,12 @@ class DeferredWebProducer:
                 [outgoing_header, outgoing_producer]
                 )
         else:
+            # fix AttributeError: 'unicode' object has no attribute 'more'
+            if (not PY3) and (len(self.request.outgoing) > 0):
+                body = self.request.outgoing[0]
+                if isinstance(body, unicode):
+                    self.request.outgoing[0] = producers.simple_producer (body)
+
             # prepend the header
             self.request.outgoing.insert(0, outgoing_header)
             outgoing_producer = producers.composite_producer (