22from pproxy import proto
33
44__title__ = 'pproxy'
5- __version__ = "0.9.4 "
5+ __version__ = "0.9.6 "
66__description__ = "Proxy server that can tunnel among remote servers by regex rules."
77__author__ = "Qian Wenjie"
88__license__ = "MIT License"
1515asyncio .StreamReader .read_n = lambda self , n : asyncio .wait_for (self .readexactly (n ), timeout = SOCKET_TIMEOUT )
1616asyncio .StreamReader .read_until = lambda self , s : asyncio .wait_for (self .readuntil (s ), timeout = SOCKET_TIMEOUT )
1717
18- async def proxy_handler (reader , writer , protos , auth , rserver , block , auth_tables , cipher , pac , pactext , unix_path , verbose = DUMMY , modstat = lambda r ,h :lambda i :DUMMY , ** kwargs ):
18+ async def proxy_handler (reader , writer , protos , auth , rserver , block , auth_tables , cipher , httpget , unix_path , verbose = DUMMY , modstat = lambda r ,h :lambda i :DUMMY , ** kwargs ):
1919 try :
2020 remote_ip = writer .get_extra_info ('peername' )[0 ] if not unix_path else None
21- reader_cipher = ( await cipher (reader , writer ) )[0 ] if cipher else None
21+ reader_cipher = cipher (reader , writer )[0 ] if cipher else None
2222 header = await reader .read_n (1 )
23- lproto , host_name , port , initbuf = await proto .parse (protos , reader = reader , writer = writer , header = header , auth = auth , auth_tables = auth_tables , remote_ip = remote_ip , pac = pac , pactext = pactext , reader_cipher = reader_cipher )
23+ lproto , host_name , port , initbuf = await proto .parse (protos , reader = reader , writer = writer , header = header , auth = auth , auth_tables = auth_tables , remote_ip = remote_ip , httpget = httpget , reader_cipher = reader_cipher )
2424 if host_name is None :
2525 writer .close ()
2626 return
@@ -44,7 +44,7 @@ async def proxy_handler(reader, writer, protos, auth, rserver, block, auth_table
4444 raise Exception (f'Connection timeout { rserver } ' )
4545 try :
4646 if viaproxy :
47- writer_cipher_r = ( await roption .cipher (reader_remote , writer_remote ) )[1 ] if roption .cipher else None
47+ writer_cipher_r = roption .cipher (reader_remote , writer_remote )[1 ] if roption .cipher else None
4848 await roption .protos [0 ].connect (reader_remote = reader_remote , writer_remote = writer_remote , rauth = roption .auth , host_name = host_name , port = port , initbuf = initbuf , writer_cipher_r = writer_cipher_r )
4949 else :
5050 writer_remote .write (initbuf )
@@ -60,8 +60,8 @@ async def proxy_handler(reader, writer, protos, auth, rserver, block, auth_table
6060 try : writer .close ()
6161 except Exception : pass
6262
63- def pattern_compile (file_name ):
64- with open (file_name ) as f :
63+ def pattern_compile (filename ):
64+ with open (filename ) as f :
6565 return re .compile ('|' .join (i .strip () for i in f if i .strip () and not i .startswith ('#' ))).fullmatch
6666
6767def uri_compile (uri ):
@@ -100,7 +100,8 @@ def main():
100100 parser .add_argument ('-b' , dest = 'block' , type = pattern_compile , help = 'block regex rules' )
101101 parser .add_argument ('-v' , dest = 'v' , action = 'store_true' , help = 'print verbose output' )
102102 parser .add_argument ('--ssl' , dest = 'sslfile' , help = 'certfile[,keyfile] if server listen in ssl mode' )
103- parser .add_argument ('--pac' , dest = 'pac' , help = 'http pac file path' )
103+ parser .add_argument ('--pac' , dest = 'pac' , help = 'http PAC path' )
104+ parser .add_argument ('--get' , dest = 'gets' , default = [], action = 'append' , help = 'http custom path/file' )
104105 parser .add_argument ('--version' , action = 'version' , version = f'%(prog)s { __version__ } ' )
105106 args = parser .parse_args ()
106107 if not args .listen :
@@ -110,13 +111,18 @@ def main():
110111 args .auth_tables = pickle .load (f )
111112 else :
112113 args .auth_tables = {}
114+ args .httpget = {}
113115 if args .pac :
114116 pactext = 'function FindProxyForURL(u,h){' + (f'var b=/^(:?{ args .block .__self__ .pattern } )$/i;if(b.test(h))return "";' if args .block else '' )
115117 for i , option in enumerate (args .rserver ):
116118 pactext += (f'var m{ i } =/^(:?{ option .match .__self__ .pattern } )$/i;if(m{ i } .test(h))' if option .match else '' ) + f'return "PROXY %(host)s";'
117- args .pactext = (pactext + 'return "DIRECT";}' , 'function FindProxyForURL(u,h){{return "PROXY %(host)s";}}' , 'function FindProxyForURL(u,h){return "DIRECT";}' )
118- else :
119- args .pactext = None
119+ args .httpget [args .pac ] = pactext + 'return "DIRECT";}'
120+ args .httpget [args .pac + '/all' ] = 'function FindProxyForURL(u,h){return "PROXY %(host)s";}'
121+ args .httpget [args .pac + '/none' ] = 'function FindProxyForURL(u,h){return "DIRECT";}'
122+ for gets in args .gets :
123+ path , filename = gets .split (',' , 1 )
124+ with open (filename , 'r' ) as f :
125+ args .httpget [path ] = f .read ()
120126 if args .sslfile :
121127 sslfile = args .sslfile .split (',' )
122128 for option in args .listen :
0 commit comments