def testCachingWithContentLength(self): # The HTTPInputStream implementation will cache the input # stream in a temporary file (instead of in memory) when the # reported content length is over a certain number (100000 is # definitely over that). # HTTPInputStream understands both CONTENT_LENGTH... stream1 = HTTPInputStream(BytesIO(data), {'CONTENT_LENGTH': '100000'}) self.assertTrue(isinstance(stream1.getCacheStream(), TempFileType)) # ... and HTTP_CONTENT_LENGTH. stream2 = HTTPInputStream(BytesIO(data), {'HTTP_CONTENT_LENGTH': '100000'}) self.assertTrue(isinstance(stream2.getCacheStream(), TempFileType)) # If CONTENT_LENGTH is absent or empty, it takes the value # given in HTTP_CONTENT_LENGTH: stream3 = HTTPInputStream(BytesIO(data), { 'CONTENT_LENGTH': '', 'HTTP_CONTENT_LENGTH': '100000' }) self.assertTrue(isinstance(stream3.getCacheStream(), TempFileType)) # In fact, HTTPInputStream can be instantiated with both an # empty CONTENT_LENGTH and an empty HTTP_CONTENT_LENGTH: stream4 = HTTPInputStream(BytesIO(data), { 'CONTENT_LENGTH': '', 'HTTP_CONTENT_LENGTH': '' })
def testCachingWithContentLength(self): # The HTTPInputStream implementation will cache the input # stream in a temporary file (instead of in memory) when the # reported content length is over a certain number (100000 is # definitely over that). # HTTPInputStream understands both CONTENT_LENGTH... stream1 = HTTPInputStream(BytesIO(data), {'CONTENT_LENGTH': '100000'}) self.assertTrue(isinstance(stream1.getCacheStream(), TempFileType)) # ... and HTTP_CONTENT_LENGTH. stream2 = HTTPInputStream(BytesIO(data), {'HTTP_CONTENT_LENGTH': '100000'}) self.assertTrue(isinstance(stream2.getCacheStream(), TempFileType)) # If CONTENT_LENGTH is absent or empty, it takes the value # given in HTTP_CONTENT_LENGTH: stream3 = HTTPInputStream(BytesIO(data), {'CONTENT_LENGTH': '', 'HTTP_CONTENT_LENGTH': '100000'}) self.assertTrue(isinstance(stream3.getCacheStream(), TempFileType)) # In fact, HTTPInputStream can be instantiated with both an # empty CONTENT_LENGTH and an empty HTTP_CONTENT_LENGTH: stream4 = HTTPInputStream(BytesIO(data), {'CONTENT_LENGTH': '', 'HTTP_CONTENT_LENGTH': ''})
class HTTPInputStreamTests(unittest.TestCase): def setUp(self): self.stream = HTTPInputStream(StringIO(data), {}) def getCacheStreamValue(self): self.stream.cacheStream.seek(0) result = self.stream.cacheStream.read() # We just did a read on a file opened for update. If the next # operation on that file is a write, behavior is 100% undefined, # and it in fact frequently (but not always) blows up on Windows. # Behavior is 100% defined instead if we explictly seek. Since # we expect to be at EOF now, explicitly seek to the end. self.stream.cacheStream.seek(0, 2) return result def testRead(self): output = '' self.assertEqual(output, self.getCacheStreamValue()) output += self.stream.read(5) self.assertEqual(output, self.getCacheStreamValue()) output += self.stream.read() self.assertEqual(output, self.getCacheStreamValue()) self.assertEqual(data, self.getCacheStreamValue()) def testReadLine(self): output = self.stream.readline() self.assertEqual(output, self.getCacheStreamValue()) output += self.stream.readline() self.assertEqual(output, self.getCacheStreamValue()) output += self.stream.readline() self.assertEqual(output, self.getCacheStreamValue()) output += self.stream.readline() self.assertEqual(output, self.getCacheStreamValue()) self.assertEqual(data, self.getCacheStreamValue()) def testReadLines(self): output = ''.join(self.stream.readlines(4)) self.assertEqual(output, self.getCacheStreamValue()) output += ''.join(self.stream.readlines()) self.assertEqual(output, self.getCacheStreamValue()) self.assertEqual(data, self.getCacheStreamValue()) def testGetChacheStream(self): self.stream.read(5) self.assertEqual(data, self.stream.getCacheStream().read())
def testWorkingWithNonClosingStreams(self): # It turns out that some Web servers (Paste for example) do not send # the EOF signal after the data has been transmitted and the read() # simply hangs if no expected content length has been specified. # # In this test we simulate the hanging of the server by throwing an # exception. class ServerHung(Exception): pass class NonClosingStream(object): def read(self, size=-1): if size == -1: raise ServerHung return b'a' * size stream = HTTPInputStream(NonClosingStream(), {'CONTENT_LENGTH': '10'}) self.assertEqual(stream.getCacheStream().read(), b'aaaaaaaaaa') stream = HTTPInputStream(NonClosingStream(), {}) self.assertRaises(ServerHung, stream.getCacheStream)
def testWorkingWithNonClosingStreams(self): # It turns out that some Web servers (Paste for example) do not send # the EOF signal after the data has been transmitted and the read() # simply hangs if no expected content length has been specified. # # In this test we simulate the hanging of the server by throwing an # exception. class ServerHung(Exception): pass class NonClosingStream(object): def read(self, size=-1): if size == -1: raise ServerHung return b'a'*size stream = HTTPInputStream(NonClosingStream(), {'CONTENT_LENGTH': '10'}) self.assertEqual(stream.getCacheStream().read(), b'aaaaaaaaaa') stream = HTTPInputStream(NonClosingStream(), {}) self.assertRaises(ServerHung, stream.getCacheStream)
def testGetCacheStream(self): stream = HTTPInputStream(BytesIO(data), {}) stream.read(5) self.assertEqual(data, stream.getCacheStream().read())