mirror of
https://github.com/kataras/iris.git
synced 2026-01-10 05:25:58 +00:00
omit errors received by the server via configuration 🍪 | requested by https://github.com/kataras/iris/issues/668
relative link: https://github.com/kataras/iris/issues/668 Former-commit-id: 6491abd68b74e18bf4ed0b32406e67597c9b55a9
This commit is contained in:
@@ -37,6 +37,16 @@ func New(errMsg string) Error {
|
||||
}
|
||||
}
|
||||
|
||||
// NewFromErr same as `New` but pointer for nil checks without the need of the `Return()` function.
|
||||
func NewFromErr(err error) *Error {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
errp := New(err.Error())
|
||||
return &errp
|
||||
}
|
||||
|
||||
// Equal returns true if "e" and "e2" are matched, by their IDs.
|
||||
// It will always returns true if the "e2" is a children of "e"
|
||||
// or the error messages are exactly the same, otherwise false.
|
||||
@@ -123,6 +133,17 @@ func (e Error) With(err error) error {
|
||||
return e.Format(err.Error())
|
||||
}
|
||||
|
||||
// Ignore will ignore the "err" and return nil.
|
||||
func (e Error) Ignore(err error) error {
|
||||
if err == nil {
|
||||
return e
|
||||
}
|
||||
if e.Error() == err.Error() {
|
||||
return nil
|
||||
}
|
||||
return e
|
||||
}
|
||||
|
||||
// Panic output the message and after panics.
|
||||
func (e Error) Panic() {
|
||||
_, fn, line, _ := runtime.Caller(1)
|
||||
|
||||
@@ -106,12 +106,12 @@ func (r *Reporter) Describe(format string, err error) {
|
||||
|
||||
// PrintStack prints all the errors to the given "printer".
|
||||
// Returns itself in order to be used as printer and return the full error in the same time.
|
||||
func (r Reporter) PrintStack(printer func(string, ...interface{})) error {
|
||||
func (r *Reporter) PrintStack(printer func(string, ...interface{})) error {
|
||||
return PrintAndReturnErrors(r, printer)
|
||||
}
|
||||
|
||||
// Stack returns the list of the errors in the stack.
|
||||
func (r Reporter) Stack() []Error {
|
||||
func (r *Reporter) Stack() []Error {
|
||||
return r.wrapper.Stack
|
||||
}
|
||||
|
||||
@@ -127,12 +127,12 @@ func (r *Reporter) addStack(stack []Error) {
|
||||
}
|
||||
|
||||
// Error implements the error, returns the full error string.
|
||||
func (r Reporter) Error() string {
|
||||
func (r *Reporter) Error() string {
|
||||
return r.wrapper.Error()
|
||||
}
|
||||
|
||||
// Return returns nil if the error is empty, otherwise returns the full error.
|
||||
func (r Reporter) Return() error {
|
||||
func (r *Reporter) Return() error {
|
||||
if r.Error() == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -26,9 +26,18 @@ type Supervisor struct {
|
||||
|
||||
mu sync.Mutex
|
||||
|
||||
onServe []func(TaskHost)
|
||||
onErr []func(error)
|
||||
onShutdown []func()
|
||||
onServe []func(TaskHost)
|
||||
// IgnoreErrors should contains the errors that should be ignored
|
||||
// on both serve functions return statements and error handlers.
|
||||
//
|
||||
// i.e: http.ErrServerClosed.Error().
|
||||
//
|
||||
// Note that this will match the string value instead of the equality of the type's variables.
|
||||
//
|
||||
// Defaults to empty.
|
||||
IgnoredErrors []string
|
||||
onErr []func(error)
|
||||
onShutdown []func()
|
||||
}
|
||||
|
||||
// New returns a new host supervisor
|
||||
@@ -103,17 +112,31 @@ func (su *Supervisor) RegisterOnError(cb func(error)) {
|
||||
su.mu.Unlock()
|
||||
}
|
||||
|
||||
func (su *Supervisor) notifyErr(err error) {
|
||||
// if err == http.ErrServerClosed {
|
||||
// su.notifyShutdown()
|
||||
// return
|
||||
// }
|
||||
func (su *Supervisor) validateErr(err error) error {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
su.mu.Lock()
|
||||
for _, f := range su.onErr {
|
||||
go f(err)
|
||||
defer su.mu.Unlock()
|
||||
|
||||
for _, e := range su.IgnoredErrors {
|
||||
if err.Error() == e {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (su *Supervisor) notifyErr(err error) {
|
||||
err = su.validateErr(err)
|
||||
if err != nil {
|
||||
su.mu.Lock()
|
||||
for _, f := range su.onErr {
|
||||
go f(err)
|
||||
}
|
||||
su.mu.Unlock()
|
||||
}
|
||||
su.mu.Unlock()
|
||||
}
|
||||
|
||||
// RegisterOnServe registers a function to call on
|
||||
@@ -156,7 +179,7 @@ func (su *Supervisor) supervise(blockFunc func() error) error {
|
||||
}
|
||||
}
|
||||
|
||||
return err // start the server
|
||||
return su.validateErr(err)
|
||||
}
|
||||
|
||||
// Serve accepts incoming connections on the Listener l, creating a
|
||||
@@ -171,7 +194,6 @@ func (su *Supervisor) supervise(blockFunc func() error) error {
|
||||
// Serve always returns a non-nil error. After Shutdown or Close, the
|
||||
// returned error is http.ErrServerClosed.
|
||||
func (su *Supervisor) Serve(l net.Listener) error {
|
||||
|
||||
return su.supervise(func() error { return su.Server.Serve(l) })
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user