mirror of
				https://github.com/msgpack/msgpack-python.git
				synced 2025-11-04 03:20:56 +00:00 
			
		
		
		
	Cleaner read_bytes and a test case
No longer reads via buffer for unbuffered bytes
This commit is contained in:
		
							parent
							
								
									ffec10dff3
								
							
						
					
					
						commit
						e7c51d9089
					
				
					 2 changed files with 21 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -458,13 +458,11 @@ cdef class Unpacker(object):
 | 
			
		|||
    def read_bytes(self, Py_ssize_t nbytes):
 | 
			
		||||
        """read a specified number of raw bytes from the stream"""
 | 
			
		||||
        cdef size_t nread
 | 
			
		||||
        ret = ''
 | 
			
		||||
        while len(ret) < nbytes and self.file_like is not None:
 | 
			
		||||
            if self.buf_head == self.buf_tail:
 | 
			
		||||
                self.fill_buffer()
 | 
			
		||||
            nread = min(self.buf_tail - self.buf_head, nbytes - len(ret))
 | 
			
		||||
            ret += PyBytes_FromStringAndSize(self.buf + self.buf_head, nread)
 | 
			
		||||
            self.buf_head += nread
 | 
			
		||||
        nread = min(self.buf_tail - self.buf_head, nbytes)
 | 
			
		||||
        ret = PyBytes_FromStringAndSize(self.buf + self.buf_head, nread)
 | 
			
		||||
        self.buf_head += nread
 | 
			
		||||
        if len(ret) < nbytes and self.file_like is not None:
 | 
			
		||||
            ret += self.file_like.read(nbytes - len(ret))
 | 
			
		||||
        return ret
 | 
			
		||||
 | 
			
		||||
    def __iter__(self):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
#!/usr/bin/env python
 | 
			
		||||
# coding: utf-8
 | 
			
		||||
 | 
			
		||||
import six
 | 
			
		||||
from msgpack import Unpacker, BufferFull
 | 
			
		||||
import nose
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -42,5 +43,20 @@ def test_maxbuffersize():
 | 
			
		|||
    assert ord('b') == next(unpacker)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_readbytes():
 | 
			
		||||
    unpacker = Unpacker(read_size=3)
 | 
			
		||||
    unpacker.feed(b'foobar')
 | 
			
		||||
    assert unpacker.unpack() == ord(b'f')
 | 
			
		||||
    assert unpacker.read_bytes(3) == b'oob'
 | 
			
		||||
    assert unpacker.unpack() == ord(b'a')
 | 
			
		||||
    assert unpacker.unpack() == ord(b'r')
 | 
			
		||||
 | 
			
		||||
    # Test buffer refill
 | 
			
		||||
    unpacker = Unpacker(six.BytesIO(b'foobar'), read_size=3)
 | 
			
		||||
    assert unpacker.unpack() == ord(b'f')
 | 
			
		||||
    assert unpacker.read_bytes(3) == b'oob'
 | 
			
		||||
    assert unpacker.unpack() == ord(b'a')
 | 
			
		||||
    assert unpacker.unpack() == ord(b'r')
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    nose.main()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue