Skip to content
This repository was archived by the owner on Mar 6, 2023. It is now read-only.

Commit 1e16ac3

Browse files
committed
Add TLSServer interface and ListenAndServeTLS func
Closes #1 https://github.com/denji/golang-tls openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout server.key -out server.crt -days 36500
1 parent 05e40fb commit 1e16ac3

File tree

4 files changed

+75
-8
lines changed

4 files changed

+75
-8
lines changed

graceful.go

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ type Server interface {
6868
Shutdowner
6969
}
7070

71+
// TLSServer is implemented by *http.Server
72+
type TLSServer interface {
73+
ListenAndServeTLS(string, string) error
74+
Shutdowner
75+
}
76+
7177
// Shutdowner is implemented by *http.Server, and optionally by *http.Server.Handler
7278
type Shutdowner interface {
7379
Shutdown(ctx context.Context) error
@@ -101,15 +107,8 @@ var (
101107

102108
// LogListenAndServe logs using the logger and then calls ListenAndServe
103109
func LogListenAndServe(s Server, loggers ...Logger) {
104-
if len(loggers) > 0 {
105-
if logger = loggers[0]; logger == nil {
106-
logger = log.New(ioutil.Discard, "", 0)
107-
}
108-
} else {
109-
logger = log.New(os.Stdout, "", 0)
110-
}
111-
112110
if hs, ok := s.(*http.Server); ok {
111+
logger := getLogger(loggers...)
113112
logger.Printf(ListeningFormat, hs.Addr)
114113
}
115114

@@ -127,6 +126,17 @@ func ListenAndServe(s Server) {
127126
Shutdown(s)
128127
}
129128

129+
// ListenAndServeTLS starts the server in a goroutine and then calls Shutdown
130+
func ListenAndServeTLS(s TLSServer, certFile, keyFile string) {
131+
go func() {
132+
if err := s.ListenAndServeTLS(certFile, keyFile); err != http.ErrServerClosed {
133+
logger.Fatal(err)
134+
}
135+
}()
136+
137+
Shutdown(s)
138+
}
139+
130140
// Shutdown blocks until os.Interrupt or syscall.SIGTERM received, then
131141
// running *http.Server.Shutdown with a context having a timeout
132142
func Shutdown(s Shutdowner) {
@@ -199,3 +209,15 @@ func shutdown(s Shutdowner, logger Logger) {
199209
}
200210
}
201211
}
212+
213+
func getLogger(loggers ...Logger) Logger {
214+
if len(loggers) > 0 {
215+
if logger = loggers[0]; logger != nil {
216+
return logger
217+
}
218+
219+
return log.New(ioutil.Discard, "", 0)
220+
}
221+
222+
return log.New(os.Stdout, "", 0)
223+
}

graceful_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,31 @@ import (
1212
"time"
1313
)
1414

15+
func TestListenAndServeTLS(t *testing.T) {
16+
var buf bytes.Buffer
17+
18+
logger := log.New(&buf, "", 0)
19+
20+
go func() {
21+
time.Sleep(10 * time.Millisecond)
22+
signals <- os.Interrupt
23+
}()
24+
25+
ListenAndServeTLS(&http.Server{
26+
Addr: ":0", Handler: &testHandler{logger},
27+
}, "testdata/server.crt", "testdata/server.key")
28+
29+
s := buf.String()
30+
31+
for _, want := range []string{
32+
"Shutdown in testHandler",
33+
} {
34+
if !strings.Contains(s, want) {
35+
t.Fatalf("log output does not include %q", want)
36+
}
37+
}
38+
}
39+
1540
func TestLogListenAndServe(t *testing.T) {
1641
t.Run("with logger", func(t *testing.T) {
1742
var buf bytes.Buffer

testdata/server.crt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICDTCCAZMCCQChBedS1gduPTAKBggqhkjOPQQDAjBvMQswCQYDVQQGEwJTVjES
3+
MBAGA1UECAwJU3RvY2tob2xtMRIwEAYDVQQHDAlTdG9ja2hvbG0xHTAbBgNVBAoM
4+
FEJvbm5pZXIgQnJvYWRjYXN0aW5nMRkwFwYDVQQDDBBncmFjZWZ1bC5leGFtcGxl
5+
MCAXDTE3MTAxNjA4NDUyM1oYDzIxMTcwOTIyMDg0NTIzWjBvMQswCQYDVQQGEwJT
6+
VjESMBAGA1UECAwJU3RvY2tob2xtMRIwEAYDVQQHDAlTdG9ja2hvbG0xHTAbBgNV
7+
BAoMFEJvbm5pZXIgQnJvYWRjYXN0aW5nMRkwFwYDVQQDDBBncmFjZWZ1bC5leGFt
8+
cGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAENFLl8QvLSQy3mB2lQmqbhZNnOSQz
9+
LnLutoiEi4L691l8VEXE15w8J8WqAJTVnruRLeSnh+yBDnNU3czL6c/g5Xx6405G
10+
arpbiHa2MIKtFieIOkUVx+cy1vIlUne3agr6MAoGCCqGSM49BAMCA2gAMGUCMAlC
11+
ahkvya6AGs0XRAjYJ4SFc7xUEJWFO5rBXTfVHfxJkYm0iqg17CMYE0lDafn9JAIx
12+
AK7QCsyknAcbFqYekcOikgzb5mTJu0lKlMXFV0aoMzzF4PtWnWXEUoZETqEbM53X
13+
3g==
14+
-----END CERTIFICATE-----

testdata/server.key

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDAwDcuspvTdQHjrC7tY
3+
sr5CXznWZ67QTdGwW60NEpNy4gYDyAmDtHzSNYeb46N1W8ChZANiAAQ0UuXxC8tJ
4+
DLeYHaVCapuFk2c5JDMucu62iISLgvr3WXxURcTXnDwnxaoAlNWeu5Et5KeH7IEO
5+
c1TdzMvpz+DlfHrjTkZquluIdrYwgq0WJ4g6RRXH5zLW8iVSd7dqCvo=
6+
-----END PRIVATE KEY-----

0 commit comments

Comments
 (0)