From eecfc51c1e43461607d82f7d780348304169bb04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=B9=BF?= Date: Tue, 24 Jun 2025 11:07:31 +0800 Subject: [PATCH] =?UTF-8?q?"feat(server):=20=E6=B7=BB=E5=8A=A0SSL=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E5=99=A8=E5=B9=B6=E6=94=AF=E6=8C=81HTTPS=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E5=90=AF=E5=8A=A8=E9=80=BB=E8=BE=91"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/names.go | 16 ++++++++++++++++ server/manager.go | 32 +++++++++++++++++++++++++++++--- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/model/names.go b/model/names.go index b95c63a..f86d16d 100644 --- a/model/names.go +++ b/model/names.go @@ -51,3 +51,19 @@ func (s *Strings) HasOrContainPrefix(value string) bool { return false } } + +func (s *Strings) HasOrContain(value string) bool { + switch v := s.Values.(type) { + case []interface{}: + for _, item := range v { + if strings.Contains(value, item.(string)) { + return true + } + } + return false + case string: + return strings.Contains(value, v) + default: + return false + } +} diff --git a/server/manager.go b/server/manager.go index 8278c77..f739fa2 100644 --- a/server/manager.go +++ b/server/manager.go @@ -31,6 +31,24 @@ func makeMatcher(name model.Strings, s *ServerListener) cmux.Matcher { } } +func makeSSLMatcher(name model.Strings, s *ServerListener) cmux.Matcher { + l := logger.GetLogger("ServerListener") + tlsMathcer := cmux.TLS() + return func(r io.Reader) bool { + isTls := tlsMathcer(r) + if isTls { + buf := make([]byte, 1024) + n, err := r.Read(buf) + if err != nil { + return false + } + l.Debug("Request Host:", string(buf[:n]), "Name:", name) + return name.HasOrContain(string(buf[:n])) + } + return false + } +} + type sl struct { net.Listener closed bool @@ -107,11 +125,19 @@ func (s *ServerListener) StartServer(name string) { server.Renew() } if server.l == nil { - server.l = &sl{ - Listener: s.listener.Match(makeMatcher(serverName, s)), + if server.Conf.EnableSSL { + server.l = &sl{Listener: s.listener.Match(makeSSLMatcher(serverName, s)), closed: false} + } else { + server.l = &sl{Listener: s.listener.Match(makeMatcher(serverName, s)), closed: false} } } else { - server.l.Listener = s.listener.Match(makeMatcher(serverName, s)) + if server.Conf.EnableSSL { + server.l.Listener = s.listener.Match(makeSSLMatcher(serverName, s)) + + } else { + server.l.Listener = s.listener.Match(makeMatcher(serverName, s)) + } + } if server.Conf.EnableSSL {