Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

Changeset 1911

Show
Ignore:
Timestamp:
03/07/08 23:16:44
Author:
lakin
Message:

Some quick changes to make the SizeObjectWrapper? is more compliant with non-blocking sockets.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/598-sendall/cherrypy/wsgiserver/__init__.py

    r1909 r1911  
    193193    def readline(self, size=None): 
    194194        if size is not None: 
    195             data = self.rfile.readline(size) 
    196             self.bytes_read += len(data) 
     195            local_bytes_seen = 0 
     196            seen_data = [] 
     197            while local_bytes_seen < size: 
     198                data = self.rfile.readline(size-local_bytes_seen) 
     199                if not data: 
     200                    break 
     201                seen_data.append(data) 
     202                local_bytes_seen += len(data) 
     203                if '\n' in data: 
     204                    break 
     205 
     206            self.bytes_read += local_bytes_seen 
    197207            self._check_length() 
    198             return data 
     208            return "".join(seen_data) 
    199209         
    200210        # User didn't specify a size ... 
     
    244254    def __init__(self, sock): 
    245255        self.sock = sock 
    246         self.incomplete_line_size = 0 
    247256        self.incomplete_line_buffer = [] 
    248257        self.lines_buffer = [] 
     
    251260        raise NotImplementedError 
    252261     
    253     def readline(self, size=None): 
     262    def readline(self): 
    254263        # This doesn't raise the appropriate exceptions 
    255264        # as the result may result in an Index Error? 
    256265 
    257266        # if we can't return their data right away, let's try to read (blocking) 
    258         if not (self.lines_buffer or (size and self.incomplete_line_size >= size))
     267        if not self.lines_buffer
    259268            self._fill_lines_buffer() 
    260          
    261         # if we have a complete line to send, use it. 
    262         if self.lines_buffer: 
    263             line = self.lines_buffer[0] 
    264             if size and len(line) > size: 
    265                 self.lines_buffer[0] = line[size:] 
    266                 line = line[:size] 
    267                 return line 
    268             else: 
    269                 return self.lines_buffer.pop(0) 
    270  
    271         # If we have enough of a non-complete line to 
    272             # satisfy the size requirement return that. 
    273         elif size and self.incomplete_line_size >= size: 
    274             line = ''.join(self.incomplete_line_buffer) 
    275             new_incomplete_line = line[:size] 
    276             self.incomplete_line_size = len(new_incomplete_line) 
    277             self.incomplete_line_buffer = [new_incomplete_line] 
    278         else: 
    279             assert ("We should never get here, should we?") 
     269 
     270        if not self.lines_buffer: 
     271            return "" 
     272         
     273        return self.lines_buffer.pop(0) 
     274 
    280275             
    281     def _fill_lines_buffer(self, size=None): 
    282         bytes_seen = 0 
     276    def _fill_lines_buffer(self): 
    283277        while True: 
    284278            data = self.sock.recv(256) 
    285             bytes_seen += len(data) 
    286279 
    287280            lines = data.split("\n") 
     
    299292                self.incomplete_line_buffer.append(lines.pop(0)) 
    300293                self.lines_buffer.append("".join(self.incomplete_line_buffer)) 
    301                 self.incomplete_line_size = 0 
     294 
    302295                self.incomplete_line_buffer = [] 
    303296 
     
    306299                
    307300            # Record the latest new incomplete line 
    308             if new_incomplete_line: 
    309                 self.incomplete_line_size += len(new_incomplete_line) 
    310                 self.incomplete_line_buffer.append(new_incomplete_line) 
     301            self.incomplete_line_buffer.append(new_incomplete_line) 
    311302 
    312303            # If they didn't specify a size and we have a line to send them 
    313304            # stop reading 
    314             if not size and self.lines_buffer: 
    315                 return 
    316  
    317             # if we've read over the size that they wanted, then stop reading 
    318             if size and bytes_seen > size: 
     305            if self.lines_buffer: 
    319306                return 
    320307     
     
    892879        if SSL and isinstance(sock, SSL.ConnectionType): 
    893880            timeout = sock.gettimeout() 
    894             self.rfile = SSL_fileobject(HTTPRequestSocketWrapper(sock), "r", self.rbufsize) 
     881            self.rfile = SSL_fileobject(sock, "r", self.rbufsize) 
    895882            self.rfile.ssl_timeout = timeout 
    896883            self.send = self.rfile.send 
    897884        else: 
    898             #self.rfile = sock.makefile("rb", self.rbufsize) 
    899             self.rfile = HTTPRequestSocketWrapper(sock) 
     885            self.rfile = sock.makefile("rb", self.rbufsize) 
    900886            self.send = sock.send 
    901887         

Hosted by WebFaction

Log in as guest/cpguest to create tickets