def compress_file(fh_, compresslevel=9, chunk_size=1048576): """ Generator that reads chunk_size bytes at a time from a file/filehandle and yields the compressed result of each read. .. note:: Each chunk is compressed separately. They cannot be stitched together to form a compressed file. This function is designed to break up a file into compressed chunks for transport and decompression/reassembly on a remote host. """ try: bytes_read = int(chunk_size) if bytes_read != chunk_size: raise ValueError except ValueError: raise ValueError("chunk_size must be an integer") try: while bytes_read == chunk_size: buf = BytesIO() with open_fileobj(buf, "wb", compresslevel) as ogz: try: bytes_read = ogz.write(fh_.read(chunk_size)) except AttributeError: # Open the file and re-attempt the read fh_ = salt.utils.files.fopen(fh_, "rb") bytes_read = ogz.write(fh_.read(chunk_size)) yield buf.getvalue() finally: try: fh_.close() except AttributeError: pass
def compress(data, compresslevel=9): ''' Returns the data compressed at gzip level compression. ''' buf = BytesIO() with open_fileobj(buf, 'wb', compresslevel) as ogz: ogz.write(data) compressed = buf.getvalue() return compressed
def compress(data, compresslevel=9): """ Returns the data compressed at gzip level compression. """ buf = BytesIO() with open_fileobj(buf, "wb", compresslevel) as ogz: if six.PY3 and not isinstance(data, bytes): data = data.encode(__salt_system_encoding__) ogz.write(data) compressed = buf.getvalue() return compressed
def uncompress(data): buf = BytesIO(data) with open_fileobj(buf, "rb") as igz: unc = igz.read() return unc
def request(self, path='/', method='GET', app_path='', scheme='http', proto='HTTP/1.1', body=None, qs=None, headers=None, **kwargs): """ CherryPy does not have a facility for serverless unit testing. However this recipe demonstrates a way of doing it by calling its internal API to simulate an incoming request. This will exercise the whole stack from there. Remember a couple of things: * CherryPy is multithreaded. The response you will get from this method is a thread-data object attached to the current thread. Unless you use many threads from within a unit test, you can mostly forget about the thread data aspect of the response. * Responses are dispatched to a mounted application's page handler, if found. This is the reason why you must indicate which app you are targeting with this request by specifying its mount point. You can simulate various request settings by setting the `headers` parameter to a dictionary of headers, the request's `scheme` or `protocol`. .. seealso: http://docs.cherrypy.org/stable/refman/_cprequest.html#cherrypy._cprequest.Response """ # This is a required header when running HTTP/1.1 h = {'Host': '127.0.0.1'} # if we had some data passed as the request entity # let's make sure we have the content-length set fd = None if body is not None: h['content-length'] = '{0}'.format(len(body)) fd = BytesIO(salt.utils.stringutils.to_bytes(body)) if headers is not None: h.update(headers) # Get our application and run the request against it app = cherrypy.tree.apps.get(app_path) if not app: # XXX: perhaps not the best exception to raise? raise AssertionError( "No application mounted at '{0}'".format(app_path)) # Cleanup any previous returned response # between calls to this method app.release_serving() # Let's fake the local and remote addresses request, response = app.get_serving(local, remote, scheme, proto) try: h = [(k, v) for k, v in six.iteritems(h)] response = request.run(method, path, qs, proto, h, fd) finally: if fd: fd.close() fd = None if response.output_status.startswith(b'500'): response_body = response.collapse_body() if six.PY3: response_body = response_body.decode(__salt_system_encoding__) print(response_body) raise AssertionError("Unexpected error") # collapse the response into a bytestring response.collapse_body() return request, response