Initial commit of LineBuffer
This commit is contained in:
		
							parent
							
								
									fa101660a8
								
							
						
					
					
						commit
						36a3127ce6
					
				
					 1 changed files with 68 additions and 0 deletions
				
			
		
							
								
								
									
										68
									
								
								lib/nntp/tiny/buffer.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								lib/nntp/tiny/buffer.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,68 @@ | |||
| class BufferOverflow(Exception): | ||||
|     def __init__(self): | ||||
|         super().__init__("Buffer overflow") | ||||
| 
 | ||||
| class LineBuffer(): | ||||
|     __slots__ = 'buf', 'offset', | ||||
| 
 | ||||
|     BUFFER_SIZE = 4096 | ||||
| 
 | ||||
|     def __init__(self, size: int=BUFFER_SIZE): | ||||
|         self.buf:    bytearray = bytearray(size) | ||||
|         self.offset: int = 0 | ||||
| 
 | ||||
|     def readline(self, sock: socket.socket) -> bytes: | ||||
|         while True: | ||||
|             # | ||||
|             # Check and see if there is already a line in the | ||||
|             # internal buffer. | ||||
|             # | ||||
|             offset = self.buf.find(b'\n', self.offset, self.count) | ||||
| 
 | ||||
|             if offset < 0: | ||||
|                 # | ||||
|                 # There is no line in the buffer.  Check and see if | ||||
|                 # there is more room in the buffer to continue | ||||
|                 # reading. | ||||
|                 # | ||||
|                 if offset == self.BUFFER_SIZE - 1: | ||||
|                     # | ||||
|                     # There is no room left in the buffer; the line | ||||
|                     # must be too long.  Panic. | ||||
|                     # | ||||
|                     raise BufferOverflow() | ||||
| 
 | ||||
|                 # | ||||
|                 # Read from the socket to attempt to fill the buffer | ||||
|                 # more. | ||||
|                 # | ||||
|                 data = sock.recv(self.BUFFER_SIZE - self.offset) | ||||
| 
 | ||||
|                 # | ||||
|                 # Check to see if recv() returned any data.  If not, | ||||
|                 # the socket is closed.  Return an empty string. | ||||
|                 # | ||||
|                 if data == b'': | ||||
|                     return '' | ||||
| 
 | ||||
|                 count = len(data) | ||||
| 
 | ||||
|                 # | ||||
|                 # Now, fill the buffer.  The next iteration of the | ||||
|                 # loop will be used to check for a newline. | ||||
|                 # | ||||
|                 self.buf[self.offset:self.offset+count] = data | ||||
|             else: | ||||
|                 # | ||||
|                 # There is a line in the buffer.  Prepare to return | ||||
|                 # it. | ||||
|                 # | ||||
|                 ret = self.buf[self.offset:offset] | ||||
| 
 | ||||
|                 # | ||||
|                 # Advance the offset to one character beyond the | ||||
|                 # newline. | ||||
|                 # | ||||
|                 self.offset = offset + 1 | ||||
| 
 | ||||
|                 return str(ret, 'ascii') | ||||
		Loading…
	
	Add table
		
		Reference in a new issue