]>
jfr.im git - irc/quakenet/qwebirc.git/blob - qwebirc/util/gziprequest.py
3 class GZipRequest(object):
4 """Wrapper for a request that applies a gzip content encoding"""
6 def __init__(self
, request
, compressLevel
=6):
8 self
.request
.setHeader('Content-Encoding', 'gzip')
9 # Borrowed from twisted.web2 gzip filter
10 self
.compress
= zlib
.compressobj(compressLevel
, zlib
.DEFLATED
, -zlib
.MAX_WBITS
, zlib
.DEF_MEM_LEVEL
,0)
12 def __getattr__(self
, attr
):
13 if 'request' in self
.__dict
__:
14 return getattr(self
.request
, attr
)
16 raise AttributeError, attr
18 def __setattr__(self
, attr
, value
):
19 if 'request' in self
.__dict
__:
20 return setattr(self
.request
, attr
, value
)
22 self
.__dict
__[attr
] = value
24 def write(self
, data
):
25 if not self
.request
.startedWriting
:
26 self
.crc
= zlib
.crc32('')
27 self
.size
= self
.csize
= 0
28 # XXX: Zap any length for now since we don't know final size
29 if 'content-length' in self
.request
.headers
:
30 del self
.request
.headers
['content-length']
31 # Borrow header information from twisted.web2 gzip filter
32 self
.request
.write('\037\213\010\000' '\0\0\0\0' '\002\377')
34 self
.crc
= zlib
.crc32(data
, self
.crc
)
35 self
.size
+= len(data
)
36 cdata
= self
.compress
.compress(data
)
37 self
.csize
+= len(cdata
)
39 self
.request
.write(cdata
)
40 elif self
.request
.producer
:
41 # Simulate another pull even though it hasn't really made it out to the consumer yet.
42 self
.request
.producer
.resumeProducing()
45 remain
= self
.compress
.flush()
46 self
.csize
+= len(remain
)
48 self
.request
.write(remain
)
50 self
.request
.write(struct
.pack('<LL', self
.crc
& 0xFFFFFFFFL
, self
.size
& 0xFFFFFFFFL
))