summaryrefslogtreecommitdiff
path: root/internal/server/server.go
diff options
context:
space:
mode:
authorKyren223 <ulmliad223@gmail.com>2024-10-10 01:14:37 +0300
committerKyren223 <ulmliad223@gmail.com>2024-10-10 01:14:37 +0300
commit755df330a4785456387ecafea2e305c1a9f4ba0a (patch)
tree626f63c6e85087bef4cf2905233428f0d990492b /internal/server/server.go
parent6a157c52540035fa7285ed77bb191c47310671f3 (diff)
refactor: move to tls tcp connection for security purposes
Diffstat (limited to 'internal/server/server.go')
-rw-r--r--internal/server/server.go85
1 files changed, 37 insertions, 48 deletions
diff --git a/internal/server/server.go b/internal/server/server.go
index 8d3937d..aeb97f8 100644
--- a/internal/server/server.go
+++ b/internal/server/server.go
@@ -1,6 +1,8 @@
package server
import (
+ "crypto/tls"
+ _ "embed"
"net"
"os"
"os/signal"
@@ -11,69 +13,56 @@ import (
"github.com/kyren223/eko/internal/utils/log"
)
-const PORT int = 7223
+const port = 7223
+
+//go:embed server.crt
+var certPEM []byte
+
+//go:embed server.key
+var keyPEM []byte
func Start() {
- server, err := NewServer(PORT)
+ cert, err := tls.X509KeyPair(certPEM, keyPEM)
if err != nil {
- log.Error("Unable to start server: %v", err)
- return
+ log.Fatal("Error loading certificate: %s", err)
}
- var wg sync.WaitGroup
- stopChan := make(chan os.Signal, 1)
- signal.Notify(stopChan, syscall.SIGINT, syscall.SIGTERM)
- wg.Add(1)
- go handleInterrupt(server, stopChan, &wg)
+ tlsConfig := &tls.Config{
+ Certificates: []tls.Certificate{cert},
+ }
- server.Listen()
- wg.Wait()
-}
+ listener, err := tls.Listen("tcp", ":"+strconv.Itoa(port), tlsConfig)
+ if err != nil {
+ log.Fatal("Error starting listener: %s", err)
+ }
+ defer listener.Close()
-func handleInterrupt(server *Server, stopChan <-chan os.Signal, wg *sync.WaitGroup) {
- defer wg.Done()
- <-stopChan
- log.Info("Interrupt Occurred")
- log.Info("Shutting down server...")
- server.Close()
- log.Info("Waiting for all connections to close")
- server.Wait()
- log.Info("Server has been shutdown")
-}
+ signalChan := make(chan os.Signal, 1)
+ signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
+ go handleInterrupt(listener, signalChan)
-type Server struct {
- listener net.Listener
- wg sync.WaitGroup
+ var wg sync.WaitGroup
+ listen(listener, &wg)
+ wg.Wait()
}
-func NewServer(port int) (*Server, error) {
- listener, err := net.Listen("tcp", ":"+strconv.Itoa(port))
- if err != nil {
- return nil, err
- }
-
- log.Info("Created server on port %v", port)
- return &Server{listener, sync.WaitGroup{}}, nil
+func handleInterrupt(listener net.Listener, stopChan <-chan os.Signal) {
+ <-stopChan
+ log.Info("Interrupt Signal")
+ log.Info("Closing listener from receiving new connections")
+ listener.Close()
}
-func (s *Server) Listen() {
- log.Info("Server started listening... %v", s.listener.Addr().String())
+func listen(listener net.Listener, wg *sync.WaitGroup) {
+ log.Info("Started listening on port %v...", port)
for {
- conn, err := s.listener.Accept()
+ conn, err := listener.Accept()
if err != nil {
+ log.Warn("Failed to accept connection: %v", err)
break
}
- s.wg.Add(1)
- go handleClient(conn, &s.wg)
+ wg.Add(1)
+ go handleConnection(conn, wg)
}
-}
-
-// Stop stops the server. The blocked Listen call will be unlocked
-func (s *Server) Close() {
- s.listener.Close()
-}
-
-// Wait blocks until all active connections to the server are done
-func (s *Server) Wait() {
- s.wg.Wait()
+ log.Info("Stopped listening on port %v...", port)
}