Skip to content

Commit 940a27a

Browse files
authored
fix: use http protocols and remove deprecated (#197)
1 parent 9825a55 commit 940a27a

6 files changed

Lines changed: 28 additions & 390 deletions

File tree

http/server.go

Lines changed: 0 additions & 113 deletions
This file was deleted.

http/server/server.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,14 @@ import (
88
"log"
99
"net"
1010
"net/http"
11+
"slices"
1112
"sync"
1213
"time"
1314

1415
"github.com/hamba/logger/v2"
1516
lctx "github.com/hamba/logger/v2/ctx"
1617
"github.com/hamba/pkg/v2/http/healthz"
1718
"github.com/hamba/statter/v2"
18-
"golang.org/x/net/http2"
19-
"golang.org/x/net/http2/h2c"
2019
)
2120

2221
var testHookServerServe func(net.Listener)
@@ -128,20 +127,25 @@ func (s *GenericServer[T]) runServer(
128127
if err != nil {
129128
return nil, nil, err
130129
}
130+
var tlsCfg *tls.Config
131131
if s.TLSConfig != nil {
132-
ln = tls.NewListener(ln, s.TLSConfig)
132+
tlsCfg = s.TLSConfig.Clone()
133+
if !slices.Contains(tlsCfg.NextProtos, "h2") {
134+
tlsCfg.NextProtos = append([]string{"h2"}, tlsCfg.NextProtos...)
135+
}
136+
ln = tls.NewListener(ln, tlsCfg)
133137
}
134138

135139
if testHookServerServe != nil {
136140
testHookServerServe(ln)
137141
}
138142

139-
// If there is no TLS, setup h2c.
143+
protos := &http.Protocols{}
144+
protos.SetHTTP1(true)
145+
protos.SetHTTP2(true)
140146
if s.TLSConfig == nil {
141-
h2s := &http2.Server{
142-
IdleTimeout: s.IdleTimeout,
143-
}
144-
h = h2c.NewHandler(h, h2s)
147+
// If there is no TLS, setup unencrypted HTTP/2 (h2c).
148+
protos.SetUnencryptedHTTP2(true)
145149
}
146150

147151
srv := &http.Server{
@@ -150,12 +154,13 @@ func (s *GenericServer[T]) runServer(
150154
return ctx
151155
},
152156
Handler: h,
153-
TLSConfig: s.TLSConfig,
157+
TLSConfig: tlsCfg,
154158
ReadHeaderTimeout: withDefault(s.ReadHeaderTimeout, time.Second),
155159
ReadTimeout: withDefault(s.ReadTimeout, 10*time.Second),
156160
WriteTimeout: withDefault(s.WriteTimeout, 10*time.Second),
157161
IdleTimeout: withDefault(s.IdleTimeout, 120*time.Second),
158162
ErrorLog: log.New(s.Log.Writer(logger.Error), "", 0),
163+
Protocols: protos,
159164
}
160165

161166
serverShutdownCh := make(chan struct{})
@@ -197,7 +202,7 @@ func (s *GenericServer[T]) shutdownTimeout() time.Duration {
197202
func withDefault[T comparable](val, def T) T {
198203
var defT T
199204
if val == defT {
200-
return val
205+
return def
201206
}
202-
return def
207+
return val
203208
}

http/server/server_test.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package server
33
import (
44
"context"
55
"crypto/tls"
6+
"crypto/x509"
67
"io"
78
"net"
89
"net/http"
@@ -108,7 +109,7 @@ func TestGenericServer_RunWithTLS(t *testing.T) {
108109
go func() {
109110
defer close(shutdownCh)
110111

111-
err := srv.Run(ctx)
112+
err = srv.Run(ctx)
112113

113114
assert.NoError(t, err)
114115
}()
@@ -386,11 +387,20 @@ func TestGenericServer_RunHandlesUnexpectedListenerClose(t *testing.T) {
386387
func requireDoRequest(t *testing.T, path string) (int, string) {
387388
t.Helper()
388389

390+
certPool := x509.NewCertPool()
391+
ok := certPool.AppendCertsFromPEM(localhostCert)
392+
require.True(t, ok, "failed to append cert to pool")
393+
394+
protos := &http.Protocols{}
395+
protos.SetHTTP2(true)
396+
protos.SetUnencryptedHTTP2(true)
397+
389398
client := &http.Client{
390399
Transport: &http.Transport{
391400
TLSClientConfig: &tls.Config{
392-
InsecureSkipVerify: true,
401+
RootCAs: certPool,
393402
},
403+
Protocols: protos,
394404
},
395405
}
396406

0 commit comments

Comments
 (0)