From 7046e40d514db69960e3cea1dc2311370cd82ab5 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Wed, 10 May 2023 16:35:17 +0800 Subject: [PATCH] =?UTF-8?q?HTTP=E3=80=81GRPC=20TLS=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/options.go | 23 +++++++++++++++++++++++ server/server.go | 23 +++++++++++++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/server/options.go b/server/options.go index 371d5fa..6ef0b26 100644 --- a/server/options.go +++ b/server/options.go @@ -3,6 +3,7 @@ package server import ( "github.com/kercylan98/minotaur/utils/log" "go.uber.org/zap" + "google.golang.org/grpc" ) const ( @@ -20,6 +21,28 @@ const ( type Option func(srv *Server) +// WithTLS 通过安全传输层协议TLS创建服务器 +// - 支持:Http、Websocket +func WithTLS(certFile, keyFile string) Option { + return func(srv *Server) { + switch srv.network { + case NetworkHttp, NetworkWebsocket, NetworkTCP, NetworkTCP4, NetworkTCP6: + srv.certFile = certFile + srv.keyFile = keyFile + } + } +} + +// WithGRPCServerOptions 通过GRPC的可选项创建GRPC服务器 +func WithGRPCServerOptions(options ...grpc.ServerOption) Option { + return func(srv *Server) { + if srv.network != NetworkGRPC { + return + } + srv.grpcServer = grpc.NewServer(options...) + } +} + // WithProd 通过生产模式运行服务器 func WithProd() Option { return func(srv *Server) { diff --git a/server/server.go b/server/server.go index c6faf4f..aefdc09 100644 --- a/server/server.go +++ b/server/server.go @@ -54,6 +54,7 @@ type Server struct { httpServer *http.Server // HTTP模式下的服务器 grpcServer *grpc.Server // GRPC模式下的服务器 supportMessageTypes map[int]bool // websocket模式下支持的消息类型 + certFile, keyFile string // TLS文件 gServer *gNet // TCP或UDP模式下的服务器 messagePool *synchronization.Pool[*message] // 消息池 @@ -175,9 +176,16 @@ func (slf *Server) Run(addr string) error { go func() { slf.OnStartBeforeEvent() slf.httpServer.Addr = slf.addr - if err := slf.httpServer.ListenAndServe(); err != nil { - slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) + if len(slf.certFile)+len(slf.keyFile) > 0 { + if err := slf.httpServer.ListenAndServeTLS(slf.certFile, slf.keyFile); err != nil { + slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) + } + } else { + if err := slf.httpServer.ListenAndServe(); err != nil { + slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) + } } + }() case NetworkWebsocket: go connectionInitHandle(nil) @@ -241,9 +249,16 @@ func (slf *Server) Run(addr string) error { }) go func() { slf.OnStartBeforeEvent() - if err := http.ListenAndServe(slf.addr, nil); err != nil { - slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) + if len(slf.certFile)+len(slf.keyFile) > 0 { + if err := http.ListenAndServeTLS(slf.addr, slf.certFile, slf.keyFile, nil); err != nil { + slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) + } + } else { + if err := http.ListenAndServe(slf.addr, nil); err != nil { + slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) + } } + }() default: return ErrCanNotSupportNetwork