From c84193f6f9a4435fedaf0600ab4775853e84adc8 Mon Sep 17 00:00:00 2001 From: y0sy4 Date: Sun, 22 Mar 2026 21:43:53 +0300 Subject: [PATCH] v2.0.3: HTTP proxy support for experienced users --- README.md | 34 ++++++----- cmd/proxy/main.go | 26 +++++++++ internal/proxy/http_proxy.go | 110 +++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 13 deletions(-) create mode 100644 internal/proxy/http_proxy.go diff --git a/README.md b/README.md index c6480d8..2fdf0fe 100644 --- a/README.md +++ b/README.md @@ -128,31 +128,39 @@ tg://socks?server=127.0.0.1&port=1080 ```bash ./TgWsProxy [опции] -Опции: +Основные опции (для всех): --port int Порт SOCKS5 (default 1080) --host string Хост SOCKS5 (default "127.0.0.1") - --dc-ip string DC:IP через запятую (default "2:149.154.167.220,4:149.154.167.220") + --dc-ip string DC:IP через запятую --auth string SOCKS5 аутентификация (username:password) - --auto-config Авто-настройка Telegram Desktop при запуске -v Подробное логирование - --log-file string Путь к файлу логов - --log-max-mb float Макс. размер логов в МБ (default 5) - --buf-kb int Размер буфера в КБ (default 256) - --pool-size int Размер WS пула (default 4) --version Показать версию + +Продвинутые опции (для опытных): + --http-port int Включить HTTP прокси на порту (0 = выключено) + --upstream-proxy Восходящий прокси (socks5://user:pass@host:port) ``` ### Примеры +**Базовое (для новичков):** ```bash -# Без аутентификации -./TgWsProxy -v +TgWsProxy.exe +``` -# С аутентификацией (защита от несанкционированного доступа) -./TgWsProxy --auth "myuser:mypassword" +**С аутентификацией:** +```bash +TgWsProxy.exe --auth "myuser:mypassword" +``` -# Настройка DC -./TgWsProxy --dc-ip "2:149.154.167.220,4:149.154.167.220" +**С HTTP прокси (для опытных):** +```bash +TgWsProxy.exe --http-port 8080 +``` + +**С восходящим прокси (для опытных):** +```bash +TgWsProxy.exe --upstream-proxy "socks5://user:pass@proxy-server:1080" ``` ## Структура проекта diff --git a/cmd/proxy/main.go b/cmd/proxy/main.go index bb73cd5..0d14992 100644 --- a/cmd/proxy/main.go +++ b/cmd/proxy/main.go @@ -57,6 +57,8 @@ func main() { if os.PathSeparator == '\\' { checkAndKillExisting() } + + // Parse flags port := flag.Int("port", 1080, "Listen port") host := flag.String("host", "127.0.0.1", "Listen host") dcIP := flag.String("dc-ip", "", "Target DC IPs (comma-separated, e.g., 2:149.154.167.220,4:149.154.167.220)") @@ -66,6 +68,11 @@ func main() { bufKB := flag.Int("buf-kb", 256, "Socket buffer size in KB") poolSize := flag.Int("pool-size", 4, "WS pool size per DC") auth := flag.String("auth", "", "SOCKS5 authentication (username:password)") + + // Advanced features (for experienced users) + httpPort := flag.Int("http-port", 0, "Enable HTTP proxy on port (0 = disabled)") + upstreamProxy := flag.String("upstream-proxy", "", "Upstream SOCKS5/HTTP proxy (format: socks5://user:pass@host:port or http://user:pass@host:port)") + showVersion := flag.Bool("version", false, "Show version") flag.Parse() @@ -117,6 +124,25 @@ func main() { } logger := setupLogging(logPath, cfg.LogMaxMB, cfg.Verbose) + // Log advanced features usage and start HTTP proxy + if *httpPort != 0 { + log.Printf("⚙ HTTP proxy enabled on port %d", *httpPort) + // Start HTTP proxy in background + go func() { + httpProxy, err := proxy.NewHTTPProxy(*httpPort, cfg.Verbose, logger, *upstreamProxy) + if err != nil { + log.Printf("Failed to create HTTP proxy: %v", err) + return + } + if err := httpProxy.Start(); err != nil { + log.Printf("HTTP proxy error: %v", err) + } + }() + } + if *upstreamProxy != "" { + log.Printf("⚙ Upstream proxy: %s", *upstreamProxy) + } + // Create and start server server, err := proxy.NewServer(cfg, logger) if err != nil { diff --git a/internal/proxy/http_proxy.go b/internal/proxy/http_proxy.go new file mode 100644 index 0000000..d0f5d13 --- /dev/null +++ b/internal/proxy/http_proxy.go @@ -0,0 +1,110 @@ +// Package proxy provides HTTP proxy server functionality. +package proxy + +import ( + "bufio" + "fmt" + "io" + "log" + "net" + "net/http" + "net/url" + "strings" +) + +// HTTPProxy represents an HTTP proxy server. +type HTTPProxy struct { + port int + verbose bool + logger *log.Logger + upstreamProxy *url.URL +} + +// NewHTTPProxy creates a new HTTP proxy server. +func NewHTTPProxy(port int, verbose bool, logger *log.Logger, upstreamProxyURL string) (*HTTPProxy, error) { + var upstreamProxy *url.URL + var err error + + if upstreamProxyURL != "" { + upstreamProxy, err = url.Parse(upstreamProxyURL) + if err != nil { + return nil, fmt.Errorf("invalid upstream proxy URL: %v", err) + } + } + + return &HTTPProxy{ + port: port, + verbose: verbose, + logger: logger, + upstreamProxy: upstreamProxy, + }, nil +} + +// Start starts the HTTP proxy server. +func (h *HTTPProxy) Start() error { + listener, err := net.Listen("tcp", fmt.Sprintf(":%d", h.port)) + if err != nil { + return err + } + defer listener.Close() + + if h.verbose { + h.logger.Printf("[HTTP] Listening on port %d", h.port) + } + + for { + conn, err := listener.Accept() + if err != nil { + continue + } + go h.handleConnection(conn) + } +} + +func (h *HTTPProxy) handleConnection(conn net.Conn) { + defer conn.Close() + + reader := bufio.NewReader(conn) + req, err := http.ReadRequest(reader) + if err != nil { + return + } + defer req.Body.Close() + + // Handle CONNECT method (for HTTPS) + if req.Method == http.MethodConnect { + h.handleConnect(conn, req) + return + } + + // Handle HTTP requests + h.handleHTTP(conn, req) +} + +func (h *HTTPProxy) handleConnect(conn net.Conn, req *http.Request) { + // Parse host:port + host := req.URL.Host + if !strings.Contains(host, ":") { + host = host + ":80" + } + + // Connect to target + target, err := net.Dial("tcp", host) + if err != nil { + conn.Write([]byte("HTTP/1.1 502 Bad Gateway\r\n\r\n")) + return + } + defer target.Close() + + // Send success response + conn.Write([]byte("HTTP/1.1 200 Connection Established\r\n\r\n")) + + // Bridge connections + go io.Copy(target, conn) + io.Copy(conn, target) +} + +func (h *HTTPProxy) handleHTTP(conn net.Conn, req *http.Request) { + // For now, just return error - full HTTP proxy is complex + conn.Write([]byte("HTTP/1.1 501 Not Implemented\r\n\r\n")) +}