Package dpkt :: Module gzip
[hide private]
[frames] | no frames]

Source Code for Module dpkt.gzip

  1  # $Id: gzip.py 23 2006-11-08 15:45:33Z dugsong $ 
  2   
  3  """GNU zip.""" 
  4   
  5  import struct, zlib 
  6  import dpkt 
  7   
  8  # RFC 1952 
  9  GZIP_MAGIC      = '\x1f\x8b' 
 10   
 11  # Compression methods 
 12  GZIP_MSTORED    = 0 
 13  GZIP_MCOMPRESS  = 1 
 14  GZIP_MPACKED    = 2 
 15  GZIP_MLZHED     = 3 
 16  GZIP_MDEFLATE   = 8 
 17   
 18  # Flags 
 19  GZIP_FTEXT      = 0x01 
 20  GZIP_FHCRC      = 0x02 
 21  GZIP_FEXTRA     = 0x04 
 22  GZIP_FNAME      = 0x08 
 23  GZIP_FCOMMENT   = 0x10 
 24  GZIP_FENCRYPT   = 0x20 
 25  GZIP_FRESERVED  = 0xC0 
 26   
 27  # OS 
 28  GZIP_OS_MSDOS   = 0 
 29  GZIP_OS_AMIGA   = 1 
 30  GZIP_OS_VMS     = 2 
 31  GZIP_OS_UNIX    = 3 
 32  GZIP_OS_VMCMS   = 4 
 33  GZIP_OS_ATARI   = 5 
 34  GZIP_OS_OS2     = 6 
 35  GZIP_OS_MACOS   = 7 
 36  GZIP_OS_ZSYSTEM = 8 
 37  GZIP_OS_CPM     = 9 
 38  GZIP_OS_TOPS20  = 10 
 39  GZIP_OS_WIN32   = 11 
 40  GZIP_OS_QDOS    = 12 
 41  GZIP_OS_RISCOS  = 13 
 42  GZIP_OS_UNKNOWN = 255 
 43   
 44  GZIP_FENCRYPT_LEN       = 12 
 45   
46 -class GzipExtra(dpkt.Packet):
47 __hdr__ = ( 48 ('id', '2s', ''), 49 ('len', 'H', 0) 50 )
51
52 -class Gzip(dpkt.Packet):
53 __hdr__ = ( 54 ('magic', '2s', GZIP_MAGIC), 55 ('method', 'B', GZIP_MDEFLATE), 56 ('flags', 'B', 0), 57 ('mtime', 'I', 0), 58 ('xflags', 'B', 0), 59 ('os', 'B', GZIP_OS_UNIX), 60 61 ('extra', '0s', ''), # XXX - GZIP_FEXTRA 62 ('filename', '0s', ''), # XXX - GZIP_FNAME 63 ('comment', '0s', '') # XXX - GZIP_FCOMMENT 64 ) 65
66 - def unpack(self, buf):
67 super(Gzip, self).unpack(buf) 68 if self.flags & GZIP_FEXTRA: 69 n = struct.unpack(self.data[:2], '>H')[0] 70 self.extra = GzipExtra(self.data[2:2+n]) 71 self.data = self.data[2+n:] 72 if self.flags & GZIP_FNAME: 73 n = self.data.find('\x00') 74 self.filename = self.data[:n] 75 self.data = self.data[n + 1:] 76 if self.flags & GZIP_FCOMMENT: 77 n = self.data.find('\x00') 78 self.comment = self.data[:n] 79 self.data = self.data[n + 1:] 80 if self.flags & GZIP_FENCRYPT: 81 self.data = self.data[GZIP_FENCRYPT_LEN:] # XXX - skip 82 if self.flags & GZIP_FHCRC: 83 self.data = self.data[2:] # XXX - skip
84
85 - def pack_hdr(self):
86 l = [] 87 if self.extra: 88 self.flags |= GZIP_FEXTRA 89 s = str(self.extra) 90 l.append(struct.pack('>H', len(s))) 91 l.append(s) 92 if self.filename: 93 self.flags |= GZIP_FNAME 94 l.append(self.filename) 95 l.append('\x00') 96 if self.comment: 97 self.flags |= GZIP_FCOMMENT 98 l.append(self.comment) 99 l.append('\x00') 100 l.insert(0, super(Gzip, self).pack_hdr()) 101 return ''.join(l)
102
103 - def compress(self):
104 """Compress self.data.""" 105 c = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS, 106 zlib.DEF_MEM_LEVEL, 0) 107 self.data = c.compress(self.data)
108
109 - def decompress(self):
110 """Return decompressed payload.""" 111 d = zlib.decompressobj(-zlib.MAX_WBITS) 112 return d.decompress(self.data)
113 114 if __name__ == '__main__': 115 import sys 116 gz = Gzip(open(sys.argv[1]).read()) 117 print `gz`, `gz.decompress()` 118