From 918a98068b51648bfcc41a7e2a2a23446200d4f1 Mon Sep 17 00:00:00 2001 From: kosipov Date: Sat, 11 Apr 2026 11:24:23 +0300 Subject: [PATCH] Fix upstream proxy TLS handshake --- Program.cs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/Program.cs b/Program.cs index f30dbdc..b0793de 100644 --- a/Program.cs +++ b/Program.cs @@ -164,10 +164,11 @@ class Program var resp = await ReadHeaders(upstreamStream, $"conn:{connectionId} upstream-connect-response"); - if (resp == null || !resp.Raw.Contains("200")) + int statusCode = ParseStatusCode(resp?.Raw); + if (resp == null || statusCode != 200) { var status = resp?.Raw?.Split("\r\n", StringSplitOptions.None).FirstOrDefault() ?? ""; - Log.Error($"[conn:{connectionId}] upstream CONNECT rejected: {status}"); + Log.Error($"[conn:{connectionId}] upstream CONNECT rejected ({statusCode}): {status}"); await clientStream.WriteAsync(Encoding.ASCII.GetBytes("HTTP/1.1 502 Bad Gateway\r\n\r\n")); return; } @@ -318,6 +319,22 @@ class Program return message.Replace("\r", " ").Replace("\n", " ").Trim(); } + static int ParseStatusCode(string rawHeaders) + { + if (string.IsNullOrWhiteSpace(rawHeaders)) + return 0; + + var line = rawHeaders.Split("\r\n", StringSplitOptions.None).FirstOrDefault(); + if (string.IsNullOrWhiteSpace(line)) + return 0; + + var parts = line.Split(' ', StringSplitOptions.RemoveEmptyEntries); + if (parts.Length < 2) + return 0; + + return int.TryParse(parts[1], out int code) ? code : 0; + } + static int GetHeaderLength(string raw) { int idx = raw.IndexOf("\r\n\r\n", StringComparison.Ordinal);