mirror of
https://github.com/labstack/echo.git
synced 2024-12-24 20:14:31 +02:00
Adding Echo#ListenerNetwork as configuration
Now Echo could be configured to Listen on tcp supported networks of net.Listen Go standard library (tcp, tcp4, tcp6)
This commit is contained in:
parent
095af21449
commit
4727bc6e99
16
echo.go
16
echo.go
@ -92,6 +92,7 @@ type (
|
|||||||
Renderer Renderer
|
Renderer Renderer
|
||||||
Logger Logger
|
Logger Logger
|
||||||
IPExtractor IPExtractor
|
IPExtractor IPExtractor
|
||||||
|
ListenerNetwork string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Route contains a handler and information for matching against requests.
|
// Route contains a handler and information for matching against requests.
|
||||||
@ -281,6 +282,7 @@ var (
|
|||||||
ErrInvalidRedirectCode = errors.New("invalid redirect status code")
|
ErrInvalidRedirectCode = errors.New("invalid redirect status code")
|
||||||
ErrCookieNotFound = errors.New("cookie not found")
|
ErrCookieNotFound = errors.New("cookie not found")
|
||||||
ErrInvalidCertOrKeyType = errors.New("invalid cert or key type, must be string or []byte")
|
ErrInvalidCertOrKeyType = errors.New("invalid cert or key type, must be string or []byte")
|
||||||
|
ErrInvalidListenerNetwork = errors.New("invalid listener network")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Error handlers
|
// Error handlers
|
||||||
@ -305,6 +307,7 @@ func New() (e *Echo) {
|
|||||||
Logger: log.New("echo"),
|
Logger: log.New("echo"),
|
||||||
colorer: color.New(),
|
colorer: color.New(),
|
||||||
maxParam: new(int),
|
maxParam: new(int),
|
||||||
|
ListenerNetwork: "tcp",
|
||||||
}
|
}
|
||||||
e.Server.Handler = e
|
e.Server.Handler = e
|
||||||
e.TLSServer.Handler = e
|
e.TLSServer.Handler = e
|
||||||
@ -712,7 +715,7 @@ func (e *Echo) StartServer(s *http.Server) (err error) {
|
|||||||
|
|
||||||
if s.TLSConfig == nil {
|
if s.TLSConfig == nil {
|
||||||
if e.Listener == nil {
|
if e.Listener == nil {
|
||||||
e.Listener, err = newListener(s.Addr)
|
e.Listener, err = newListener(s.Addr, e.ListenerNetwork)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -723,7 +726,7 @@ func (e *Echo) StartServer(s *http.Server) (err error) {
|
|||||||
return s.Serve(e.Listener)
|
return s.Serve(e.Listener)
|
||||||
}
|
}
|
||||||
if e.TLSListener == nil {
|
if e.TLSListener == nil {
|
||||||
l, err := newListener(s.Addr)
|
l, err := newListener(s.Addr, e.ListenerNetwork)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -752,7 +755,7 @@ func (e *Echo) StartH2CServer(address string, h2s *http2.Server) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if e.Listener == nil {
|
if e.Listener == nil {
|
||||||
e.Listener, err = newListener(s.Addr)
|
e.Listener, err = newListener(s.Addr, e.ListenerNetwork)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -873,8 +876,11 @@ func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func newListener(address string) (*tcpKeepAliveListener, error) {
|
func newListener(address, network string) (*tcpKeepAliveListener, error) {
|
||||||
l, err := net.Listen("tcp", address)
|
if network != "tcp" && network != "tcp4" && network != "tcp6" {
|
||||||
|
return nil, ErrInvalidListenerNetwork
|
||||||
|
}
|
||||||
|
l, err := net.Listen(network, address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
64
echo_test.go
64
echo_test.go
@ -4,6 +4,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
stdContext "context"
|
stdContext "context"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
@ -609,3 +610,66 @@ func TestEchoShutdown(t *testing.T) {
|
|||||||
err := <-errCh
|
err := <-errCh
|
||||||
assert.Equal(t, err.Error(), "http: Server closed")
|
assert.Equal(t, err.Error(), "http: Server closed")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var listenerNetworkTests = []struct {
|
||||||
|
test string
|
||||||
|
network string
|
||||||
|
address string
|
||||||
|
}{
|
||||||
|
{"tcp ipv4 address", "tcp", "127.0.0.1:1323"},
|
||||||
|
{"tcp ipv6 address", "tcp", "[::1]:1323"},
|
||||||
|
{"tcp4 ipv4 address", "tcp4", "127.0.0.1:1323"},
|
||||||
|
{"tcp6 ipv6 address", "tcp6", "[::1]:1323"},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEchoListenerNetwork(t *testing.T) {
|
||||||
|
for _, tt := range listenerNetworkTests {
|
||||||
|
t.Run(tt.test, func(t *testing.T) {
|
||||||
|
e := New()
|
||||||
|
e.ListenerNetwork = tt.network
|
||||||
|
|
||||||
|
// HandlerFunc
|
||||||
|
e.GET("/ok", func(c Context) error {
|
||||||
|
return c.String(http.StatusOK, "OK")
|
||||||
|
})
|
||||||
|
|
||||||
|
errCh := make(chan error)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
errCh <- e.Start(tt.address)
|
||||||
|
}()
|
||||||
|
|
||||||
|
time.Sleep(200 * time.Millisecond)
|
||||||
|
|
||||||
|
if resp, err := http.Get(fmt.Sprintf("http://%s/ok", tt.address)); err == nil {
|
||||||
|
defer resp.Body.Close()
|
||||||
|
assert.Equal(t, http.StatusOK, resp.StatusCode)
|
||||||
|
|
||||||
|
if body, err := ioutil.ReadAll(resp.Body); err == nil {
|
||||||
|
assert.Equal(t, "OK", string(body))
|
||||||
|
} else {
|
||||||
|
assert.Fail(t, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
assert.Fail(t, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := e.Close(); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEchoListenerNetworkInvalid(t *testing.T) {
|
||||||
|
e := New()
|
||||||
|
e.ListenerNetwork = "unix"
|
||||||
|
|
||||||
|
// HandlerFunc
|
||||||
|
e.GET("/ok", func(c Context) error {
|
||||||
|
return c.String(http.StatusOK, "OK")
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.Equal(t, ErrInvalidListenerNetwork, e.Start(":1323"))
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user