From 9bc21035adb046cce28dbe73be826677f2bb8d21 Mon Sep 17 00:00:00 2001 From: dnomd343 Date: Sun, 7 Aug 2022 02:25:28 +0800 Subject: [PATCH] feat: filter of Hysteria --- Filter/Hysteria.py | 86 ++++++++++++++++++++++++++++++++++++++++++++++ demo.py | 18 +++++++++- 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 Filter/Hysteria.py diff --git a/Filter/Hysteria.py b/Filter/Hysteria.py new file mode 100644 index 0000000..bba338a --- /dev/null +++ b/Filter/Hysteria.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from Basis.Filter import rulesFilter +from Basis.Functions import isHost, isPort +from Basis.Constant import hysteriaProtocols +from Basis.Functions import toInt, toStr, toStrTidy, toBool + +hysteriaObject = rulesFilter({ + 'server': { + 'type': str, + 'format': toStrTidy, + 'filter': isHost, + 'errMsg': 'Invalid server address' + }, + 'port': { + 'type': int, + 'format': toInt, + 'filter': isPort, + 'errMsg': 'Invalid port number' + }, + 'protocol': { + 'optional': True, + 'default': 'udp', + 'type': str, + 'format': lambda s: toStrTidy(s).replace('_', '-'), + 'filter': lambda s: s in hysteriaProtocols, + 'errMsg': 'Unknown Hysteria protocol' + }, + + 'obfs': { + 'optional': True, + 'default': None, + 'allowNone': True, + 'type': str, + 'format': toStr, + 'errMsg': 'Invalid obfs content' + }, + 'passwd': { + 'optional': True, + 'default': None, + 'allowNone': True, + 'type': str, + 'format': toStr, + 'errMsg': 'Invalid password content' + }, + + 'up': { + 'optional': True, + 'default': 10, + 'type': int, + 'format': toInt, + 'filter': lambda i: i > 0, + 'errMsg': 'Invalid upload speed option' + }, + 'down': { + 'optional': True, + 'default': 50, + 'type': int, + 'format': toInt, + 'filter': lambda i: i > 0, + 'errMsg': 'Invalid download speed option' + }, + 'sni': { + 'optional': True, + 'default': '', + 'type': str, + 'format': toStrTidy, + 'errMsg': 'Invalid SNI content' + }, + 'alpn': { + 'optional': True, + 'default': None, + 'allowNone': True, + 'type': str, + 'format': toStrTidy, + 'errMsg': 'Invalid alpn option' + }, + 'verify': { + 'optional': True, + 'default': True, + 'type': bool, + 'format': toBool, + 'errMsg': 'Invalid verify option' + } +}) diff --git a/demo.py b/demo.py index 941fe5d..63c138c 100755 --- a/demo.py +++ b/demo.py @@ -10,6 +10,7 @@ from Filter.VLESS import vlessObject from Filter.Trojan import trojanObject from Filter.TrojanGo import trojanGoObject from Filter.Brook import brookObject +from Filter.Hysteria import hysteriaObject # pprint(ssObject, sort_dicts = False) # pprint(ssrObject, sort_dicts = False) @@ -18,6 +19,7 @@ from Filter.Brook import brookObject # pprint(trojanObject, sort_dicts = False) # pprint(trojanGoObject, sort_dicts = False) # pprint(brookObject, sort_dicts = False) +# pprint(hysteriaObject, sort_dicts = False) # pprint(filterObject, sort_dicts = False) ssProxy = { @@ -143,11 +145,25 @@ brookProxy = { }, } +hysteriaProxy = { + 'server': '1.1.1.1', + 'port': 12345, + 'protocol': 'faketcp', + 'obfs': '1234', + 'passwd': 'dnomd343', + 'up': 100, + 'down': 500, + 'sni': '343.re', + 'alpn': 'h3', + 'verify': 'FALSE', +} + # ret = Filter(ssProxy, ssObject) # ret = Filter(ssrProxy, ssrObject) # ret = Filter(vmessProxy, vmessObject) # ret = Filter(vlessProxy, vlessObject) # ret = Filter(trojanProxy, trojanObject) # ret = Filter(trojanGoProxy, trojanGoObject) -ret = Filter(brookProxy, brookObject) +# ret = Filter(brookProxy, brookObject) +ret = Filter(hysteriaProxy, hysteriaObject) pprint(ret, sort_dicts = False)