mirror of
https://github.com/Octops/quake-kube.git
synced 2026-04-05 09:10:34 +00:00
59 lines
997 B
Go
59 lines
997 B
Go
package client
|
|
|
|
import (
|
|
"net"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/cockroachdb/cmux"
|
|
)
|
|
|
|
type Server struct {
|
|
Addr string
|
|
Handler http.Handler
|
|
ServerAddr string
|
|
}
|
|
|
|
func (s *Server) Serve(l net.Listener) error {
|
|
m := cmux.New(l)
|
|
websocketL := m.Match(cmux.HTTP1HeaderField("Upgrade", "websocket"))
|
|
httpL := m.Match(cmux.Any())
|
|
|
|
go func() {
|
|
s := &http.Server{
|
|
Addr: s.Addr,
|
|
Handler: s.Handler,
|
|
ReadTimeout: 10 * time.Second,
|
|
WriteTimeout: 10 * time.Second,
|
|
MaxHeaderBytes: 1 << 20,
|
|
}
|
|
if err := s.Serve(httpL); err != cmux.ErrListenerClosed {
|
|
panic(err)
|
|
}
|
|
}()
|
|
|
|
wsproxy, err := NewProxy(s.ServerAddr)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
go func() {
|
|
s := &http.Server{
|
|
Handler: wsproxy,
|
|
}
|
|
if err := s.Serve(websocketL); err != cmux.ErrListenerClosed {
|
|
panic(err)
|
|
}
|
|
}()
|
|
|
|
return m.Serve()
|
|
}
|
|
|
|
func (s *Server) ListenAndServe() error {
|
|
l, err := net.Listen("tcp", s.Addr)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return s.Serve(l)
|
|
}
|