@@ -49,7 +49,6 @@ import (
4949 "net/http"
5050 "net/url"
5151 "os"
52- "path"
5352 "path/filepath"
5453 "reflect"
5554 "runtime"
9291 Renderer Renderer
9392 Logger Logger
9493 IPExtractor IPExtractor
94+ ListenerNetwork string
9595 }
9696
9797 // Route contains a handler and information for matching against requests.
@@ -281,6 +281,7 @@ var (
281281 ErrInvalidRedirectCode = errors .New ("invalid redirect status code" )
282282 ErrCookieNotFound = errors .New ("cookie not found" )
283283 ErrInvalidCertOrKeyType = errors .New ("invalid cert or key type, must be string or []byte" )
284+ ErrInvalidListenerNetwork = errors .New ("invalid listener network" )
284285)
285286
286287// Error handlers
@@ -302,9 +303,10 @@ func New() (e *Echo) {
302303 AutoTLSManager : autocert.Manager {
303304 Prompt : autocert .AcceptTOS ,
304305 },
305- Logger : log .New ("echo" ),
306- colorer : color .New (),
307- maxParam : new (int ),
306+ Logger : log .New ("echo" ),
307+ colorer : color .New (),
308+ maxParam : new (int ),
309+ ListenerNetwork : "tcp" ,
308310 }
309311 e .Server .Handler = e
310312 e .TLSServer .Handler = e
@@ -362,10 +364,12 @@ func (e *Echo) DefaultHTTPErrorHandler(err error, c Context) {
362364 // Issue #1426
363365 code := he .Code
364366 message := he .Message
365- if e .Debug {
366- message = err .Error ()
367- } else if m , ok := message .(string ); ok {
368- message = Map {"message" : m }
367+ if m , ok := he .Message .(string ); ok {
368+ if e .Debug {
369+ message = Map {"message" : m , "error" : err .Error ()}
370+ } else {
371+ message = Map {"message" : m }
372+ }
369373 }
370374
371375 // Send response
@@ -481,7 +485,7 @@ func (common) static(prefix, root string, get func(string, HandlerFunc, ...Middl
481485 return err
482486 }
483487
484- name := filepath .Join (root , path .Clean ("/" + p )) // "/"+ for security
488+ name := filepath .Join (root , filepath .Clean ("/" + p )) // "/"+ for security
485489 fi , err := os .Stat (name )
486490 if err != nil {
487491 // The access path does not exist
@@ -570,7 +574,7 @@ func (e *Echo) Reverse(name string, params ...interface{}) string {
570574 for _ , r := range e .router .routes {
571575 if r .Name == name {
572576 for i , l := 0 , len (r .Path ); i < l ; i ++ {
573- if r .Path [i ] == ':' && n < ln {
577+ if ( r .Path [i ] == ':' || r . Path [ i ] == '*' ) && n < ln {
574578 for ; i < l && r .Path [i ] != '/' ; i ++ {
575579 }
576580 uri .WriteString (fmt .Sprintf ("%v" , params [n ]))
@@ -712,7 +716,7 @@ func (e *Echo) StartServer(s *http.Server) (err error) {
712716
713717 if s .TLSConfig == nil {
714718 if e .Listener == nil {
715- e .Listener , err = newListener (s .Addr )
719+ e .Listener , err = newListener (s .Addr , e . ListenerNetwork )
716720 if err != nil {
717721 return err
718722 }
@@ -723,7 +727,7 @@ func (e *Echo) StartServer(s *http.Server) (err error) {
723727 return s .Serve (e .Listener )
724728 }
725729 if e .TLSListener == nil {
726- l , err := newListener (s .Addr )
730+ l , err := newListener (s .Addr , e . ListenerNetwork )
727731 if err != nil {
728732 return err
729733 }
@@ -752,7 +756,7 @@ func (e *Echo) StartH2CServer(address string, h2s *http2.Server) (err error) {
752756 }
753757
754758 if e .Listener == nil {
755- e .Listener , err = newListener (s .Addr )
759+ e .Listener , err = newListener (s .Addr , e . ListenerNetwork )
756760 if err != nil {
757761 return err
758762 }
@@ -873,8 +877,11 @@ func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) {
873877 return
874878}
875879
876- func newListener (address string ) (* tcpKeepAliveListener , error ) {
877- l , err := net .Listen ("tcp" , address )
880+ func newListener (address , network string ) (* tcpKeepAliveListener , error ) {
881+ if network != "tcp" && network != "tcp4" && network != "tcp6" {
882+ return nil , ErrInvalidListenerNetwork
883+ }
884+ l , err := net .Listen (network , address )
878885 if err != nil {
879886 return nil , err
880887 }
0 commit comments