#!/usr/bin/python # -*- coding:utf-8 -*- from ProxyDecoder import baseFunc def __addressSplit(address: str) -> dict: # server:port if address == '': return {} server, port = address.rsplit(':', maxsplit = 1) return { 'server': baseFunc.formatHost(server), 'port': int(port) } def __wsSplit(wsServer: str, params: dict) -> dict: # ws[s]://xxx:xxx/... wsUrl = baseFunc.urlSplit(wsServer) wsInfo = { 'server': wsUrl['server'], 'port': wsUrl['port'], 'ws': { 'host': wsUrl['server'], 'path': wsUrl['path'] if wsUrl['path'] != '' else '/ws' # path as `/ws` when omitted } } if 'address' not in params: return wsInfo return { **wsInfo, **__addressSplit(params['address']) # overwrite server and port } def __brookDecode(url: str) -> dict: # Brook分享链接解码 """ Docs: https://txthinking.github.io/brook/#/brook-link """ url = baseFunc.urlSplit(url) # brook://KIND?QUERY brookKind = url['server'] if brookKind not in ['server', 'wsserver', 'wssserver']: # skip socks5 raise Exception('Unknown brook kind') if 'password' not in url['params']: raise Exception('Miss password option') brookInfo = { 'passwd': url['params']['password'], 'remark': url['params']['name'] if 'name' in url['params'] else '' } if brookKind == 'server': # server mode if 'server' not in url['params']: raise Exception('Miss server option') return { **brookInfo, **__addressSplit(url['params']['server']) } if brookKind == 'wsserver': # ws server mode if 'wsserver' not in url['params']: raise Exception('Miss wsserver option') return { **brookInfo, **__wsSplit(url['params']['wsserver'], url['params']) } if brookKind == 'wssserver': # wss server mode if 'wssserver' not in url['params']: raise Exception('Miss wssserver option') brookInfo = { **brookInfo, **__wsSplit(url['params']['wssserver'], url['params']) } brookInfo['ws']['secure'] = {} if 'insecure' in url['params'] and url['params']['insecure'] == 'true': brookInfo['ws']['secure']['verify'] = False return brookInfo def decode(url: str) -> dict: if url.split('://')[0] != 'brook': raise Exception('Unexpected scheme') return { 'type': 'brook', 'info': __brookDecode(url), }