mirror of
https://github.com/Flowseal/tg-ws-proxy.git
synced 2026-05-17 00:25:51 +03:00
github downloader fix
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
from .config import parse_dc_ip_list, proxy_config
|
from .config import parse_dc_ip_list, proxy_config
|
||||||
from .utils import get_link_host
|
from .utils import get_link_host, build_github_opener
|
||||||
|
|
||||||
__version__ = "1.6.6"
|
__version__ = "1.6.5"
|
||||||
|
|
||||||
__all__ = ["__version__", "get_link_host", "proxy_config", "parse_dc_ip_list"]
|
__all__ = ["__version__", "get_link_host", "proxy_config", "parse_dc_ip_list", "build_github_opener"]
|
||||||
@@ -7,9 +7,10 @@ import threading
|
|||||||
|
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from typing import Dict, List
|
from typing import Dict, List
|
||||||
from urllib.request import Request, urlopen
|
from urllib.request import Request
|
||||||
|
|
||||||
from .balancer import balancer
|
from .balancer import balancer
|
||||||
|
from .utils import build_github_opener
|
||||||
|
|
||||||
log = logging.getLogger('tg-mtproto-proxy')
|
log = logging.getLogger('tg-mtproto-proxy')
|
||||||
|
|
||||||
@@ -70,7 +71,7 @@ def _fetch_cfproxy_domain_list() -> List[str]:
|
|||||||
try:
|
try:
|
||||||
req = Request(CFPROXY_DOMAINS_URL + "?" + "".join(random.choices(string.ascii_letters, k=7)),
|
req = Request(CFPROXY_DOMAINS_URL + "?" + "".join(random.choices(string.ascii_letters, k=7)),
|
||||||
headers={'User-Agent': 'tg-ws-proxy'})
|
headers={'User-Agent': 'tg-ws-proxy'})
|
||||||
with urlopen(req, timeout=10) as resp:
|
with build_github_opener().open(req, timeout=10) as resp:
|
||||||
text = resp.read().decode('utf-8', errors='replace')
|
text = resp.read().decode('utf-8', errors='replace')
|
||||||
encoded = [
|
encoded = [
|
||||||
line.strip() for line in text.splitlines()
|
line.strip() for line in text.splitlines()
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
import socket as _socket
|
import socket as _socket
|
||||||
|
import urllib.request
|
||||||
|
import http.client
|
||||||
|
|
||||||
from typing import Optional
|
from typing import Optional, Dict
|
||||||
|
from urllib.request import Request
|
||||||
|
|
||||||
|
|
||||||
ZERO_64 = b'\x00' * 64
|
ZERO_64 = b'\x00' * 64
|
||||||
@@ -26,6 +29,11 @@ RESERVED_STARTS = {b'\x48\x45\x41\x44', b'\x50\x4F\x53\x54',
|
|||||||
b'\xdd\xdd\xdd\xdd', b'\x16\x03\x01\x02'}
|
b'\xdd\xdd\xdd\xdd', b'\x16\x03\x01\x02'}
|
||||||
RESERVED_CONTINUE = b'\x00\x00\x00\x00'
|
RESERVED_CONTINUE = b'\x00\x00\x00\x00'
|
||||||
|
|
||||||
|
_GITHUB_IPS: Dict[str, str] = {
|
||||||
|
"release-assets.githubusercontent.com": "185.199.109.133",
|
||||||
|
"raw.githubusercontent.com": "185.199.109.133",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def human_bytes(n: int) -> str:
|
def human_bytes(n: int) -> str:
|
||||||
for unit in ('B', 'KB', 'MB', 'GB'):
|
for unit in ('B', 'KB', 'MB', 'GB'):
|
||||||
@@ -45,4 +53,32 @@ def get_link_host(host: str) -> Optional[str]:
|
|||||||
link_host = '127.0.0.1'
|
link_host = '127.0.0.1'
|
||||||
return link_host
|
return link_host
|
||||||
else:
|
else:
|
||||||
return host
|
return host
|
||||||
|
|
||||||
|
|
||||||
|
class _PinnedHTTPSHandler(urllib.request.HTTPSHandler):
|
||||||
|
def https_open(self, req: Request):
|
||||||
|
host = req.host.split(":")[0]
|
||||||
|
ip = _GITHUB_IPS.get(host)
|
||||||
|
if not ip:
|
||||||
|
return super().https_open(req)
|
||||||
|
pinned = ip
|
||||||
|
|
||||||
|
class _Conn(http.client.HTTPSConnection):
|
||||||
|
def connect(self):
|
||||||
|
self.sock = _socket.create_connection(
|
||||||
|
(pinned, self.port or 443),
|
||||||
|
self.timeout,
|
||||||
|
self.source_address,
|
||||||
|
)
|
||||||
|
if self._tunnel_host:
|
||||||
|
self._tunnel()
|
||||||
|
self.sock = self._context.wrap_socket(
|
||||||
|
self.sock, server_hostname=self._tunnel_host or self.host
|
||||||
|
)
|
||||||
|
|
||||||
|
return self.do_open(_Conn, req)
|
||||||
|
|
||||||
|
|
||||||
|
def build_github_opener() -> urllib.request.OpenerDirector:
|
||||||
|
return urllib.request.build_opener(_PinnedHTTPSHandler())
|
||||||
@@ -14,7 +14,8 @@ from itertools import zip_longest
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Dict, Optional, Tuple
|
from typing import Any, Dict, Optional, Tuple
|
||||||
from urllib.error import HTTPError, URLError
|
from urllib.error import HTTPError, URLError
|
||||||
from urllib.request import Request, urlopen
|
from urllib.request import Request
|
||||||
|
from proxy.utils import build_github_opener
|
||||||
|
|
||||||
REPO = "Flowseal/tg-ws-proxy"
|
REPO = "Flowseal/tg-ws-proxy"
|
||||||
RELEASES_LATEST_API = f"https://api.github.com/repos/{REPO}/releases/latest"
|
RELEASES_LATEST_API = f"https://api.github.com/repos/{REPO}/releases/latest"
|
||||||
@@ -135,7 +136,7 @@ def fetch_latest_release(
|
|||||||
method="GET",
|
method="GET",
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
with urlopen(req, timeout=timeout) as resp:
|
with build_github_opener().open(req, timeout=timeout) as resp:
|
||||||
code = getattr(resp, "status", None) or resp.getcode()
|
code = getattr(resp, "status", None) or resp.getcode()
|
||||||
new_etag = resp.headers.get("ETag")
|
new_etag = resp.headers.get("ETag")
|
||||||
raw = resp.read().decode("utf-8", errors="replace")
|
raw = resp.read().decode("utf-8", errors="replace")
|
||||||
|
|||||||
15
windows.py
15
windows.py
@@ -8,8 +8,11 @@ import threading
|
|||||||
import time
|
import time
|
||||||
import webbrowser
|
import webbrowser
|
||||||
import winreg
|
import winreg
|
||||||
|
import tempfile
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
from proxy.utils import build_github_opener
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import pyperclip
|
import pyperclip
|
||||||
@@ -219,9 +222,6 @@ def update_ctk_form(
|
|||||||
|
|
||||||
|
|
||||||
def _perform_update(download_url: str, set_status=None) -> None:
|
def _perform_update(download_url: str, set_status=None) -> None:
|
||||||
import tempfile
|
|
||||||
import urllib.request
|
|
||||||
|
|
||||||
def _step(msg: str) -> None:
|
def _step(msg: str) -> None:
|
||||||
log.info("Update: %s", msg)
|
log.info("Update: %s", msg)
|
||||||
if set_status:
|
if set_status:
|
||||||
@@ -244,7 +244,14 @@ def _perform_update(download_url: str, set_status=None) -> None:
|
|||||||
os.close(fd)
|
os.close(fd)
|
||||||
tmp_path = Path(tmp_name)
|
tmp_path = Path(tmp_name)
|
||||||
log.info("Downloading update from %s", download_url)
|
log.info("Downloading update from %s", download_url)
|
||||||
urllib.request.urlretrieve(download_url, str(tmp_path))
|
opener = build_github_opener()
|
||||||
|
with opener.open(download_url) as _resp:
|
||||||
|
with open(str(tmp_path), "wb") as _fout:
|
||||||
|
while True:
|
||||||
|
_chunk = _resp.read(65536)
|
||||||
|
if not _chunk:
|
||||||
|
break
|
||||||
|
_fout.write(_chunk)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
_err(f"Не удалось скачать:\n{exc}")
|
_err(f"Не удалось скачать:\n{exc}")
|
||||||
if tmp_path:
|
if tmp_path:
|
||||||
|
|||||||
Reference in New Issue
Block a user