def filter(self, handler):
is_local_client = handler.client_address[0] in ('127.0.0.1', '::1')
pacfile = os.path.join(os.path.dirname(os.path.abspath(__file__)), common.PAC_FILE)
urlparts = urlparse.urlsplit(handler.path)
if handler.command == 'GET' and urlparts.path.lstrip('/') == common.PAC_FILE:
if urlparts.query == 'flush':
if is_local_client:
thread.start_new_thread(PacUtil.update_pacfile, (pacfile,))
else:
return 'mock', {'status': 403, 'headers': {'Content-Type': 'text/plain'}, 'body': 'client address %r not allowed' % handler.client_address[0]}
if time.time() - os.path.getmtime(pacfile) > common.PAC_EXPIRED:
# check system uptime > 30 minutes
uptime = get_uptime()
if uptime and uptime > 1800:
thread.start_new_thread(lambda: os.utime(pacfile, (time.time(), time.time())) or PacUtil.update_pacfile(pacfile), tuple())
with open(pacfile, 'rb') as fp:
content = fp.read()
if not is_local_client:
serving_addr = urlparts.hostname or ProxyUtil.get_listen_ip()
content = content.replace('127.0.0.1', serving_addr)
headers = {'Content-Type': 'text/plain'}
if 'gzip' in handler.headers.get('Accept-Encoding', ''):
headers['Content-Encoding'] = 'gzip'
compressobj = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, -zlib.MAX_WBITS, zlib.DEF_MEM_LEVEL, 0)
dataio = io.BytesIO()
dataio.write('\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff')
dataio.write(compressobj.compress(content))
dataio.write(compressobj.flush())
dataio.write(struct.pack('<LL', zlib.crc32(content) & 0xFFFFFFFFL, len(content) & 0xFFFFFFFFL))
content = dataio.getvalue()
return 'mock', {'status': 200, 'headers': headers, 'body': content}
评论列表
文章目录