/
http2.go
63 lines (54 loc) · 1.34 KB
/
http2.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
package http
import (
"net"
"net/http"
"time"
"golang.org/x/net/http2"
"golang.org/x/net/http2/h2c"
"mosn.io/mosn/pkg/log"
"mosn.io/mosn/pkg/protocol"
"mosn.io/mosn/test/lib"
"mosn.io/mosn/test/lib/types"
)
func init() {
lib.RegisterCreateServer("Http2", NewHTTP2Server)
lib.RegisterCreateClient("Http2", NewHttp2Client)
}
type MockHttp2Server struct {
*MockHttpServer
}
func NewHTTP2Server(config interface{}) types.MockServer {
s := NewHTTPServer(config)
return &MockHttp2Server{
MockHttpServer: s.(*MockHttpServer),
}
}
func (s *MockHttp2Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.Proto != "HTTP/2.0" {
w.WriteHeader(http.StatusHTTPVersionNotSupported)
return
}
s.MockHttpServer.ServeHTTP(w, r)
}
func (s *MockHttp2Server) Start() {
s.mutex.Lock()
defer s.mutex.Unlock()
if s.listener != nil {
return
}
ln, err := net.Listen("tcp", s.addr)
if err != nil {
log.DefaultLogger.Fatalf("listen %s failed", s.addr)
}
s.listener = NewStatsListener(ln, s.stats)
h2s := &http2.Server{IdleTimeout: 1 * time.Minute}
handler := http.HandlerFunc(s.ServeHTTP)
s.server.Handler = h2c.NewHandler(handler, h2s)
go s.server.Serve(s.listener)
}
func NewHttp2Client(config interface{}) types.MockClient {
client := NewHttpClient(config)
rc := client.(*MockHttpClient)
rc.protocolName = protocol.HTTP2
return rc
}