/
serve.go
90 lines (72 loc) · 1.64 KB
/
serve.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package internal
import (
"context"
"crypto/tls"
"fmt"
"net"
"net/http"
"sync"
"time"
"github.com/d2jvkpn/chatgpt-proxy/internal/settings"
"go.uber.org/zap"
)
func Serve(addr string, meta map[string]any) (errch chan error, err error) {
var (
once *sync.Once
listener net.Listener
cert tls.Certificate
)
if listener, err = net.Listen("tcp", addr); err != nil {
return nil, err
}
if TlsEnabled() {
cert, err = tls.LoadX509KeyPair(_Tls.Cert, _Tls.Key)
if err != nil {
return nil, err
}
_Server.TLSConfig = &tls.Config{
Certificates: []tls.Certificate{cert},
}
}
meta["allowIps"] = settings.AllowIps.Enable
meta["apiKeys"] = settings.AllowApiKeys.Enable
meta["tls"] = TlsEnabled()
settings.AppLogger.Info("the server is starting", zap.Any("meta", meta))
once = new(sync.Once)
shutdown := func() {
var err error
ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Second)
if err = _Server.Shutdown(ctx); err != nil {
settings.AppLogger.Error(fmt.Sprintf("shutdown the server : %v", err))
} else {
settings.AppLogger.Warn("the server is shutting down")
}
cancel()
}
errch = make(chan error, 2)
go func() {
// err := _Server.ServeTLS(listener, "configs/localhost.csr", "configs/localhost.key")
var err error
if TlsEnabled() {
err = _Server.ServeTLS(listener, "", "")
} else {
err = _Server.Serve(listener)
}
if err != http.ErrServerClosed {
once.Do(onExit)
errch <- err
}
}()
go func() {
var err = <-errch
if err.Error() == MSG_Shutdown {
shutdown()
once.Do(onExit)
errch <- nil
}
}()
return errch, nil
}
func onExit() {
settings.Logger.Down()
}