v2.0.3: HTTP proxy support for experienced users

This commit is contained in:
y0sy4 2026-03-22 21:43:53 +03:00
parent 5e11303d1d
commit c84193f6f9
3 changed files with 157 additions and 13 deletions

View File

@ -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"
```
## Структура проекта

View File

@ -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 {

View File

@ -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"))
}