Files
inp2025/middlewares/errorHandler.go
2025-11-10 10:02:55 +08:00

58 lines
969 B
Go

package middlewares
import (
"inp2025/tcp"
"io"
"net/http"
"go.uber.org/zap"
)
type Error struct {
StatusCode int `json:"code"`
Message string `json:"message"`
OriginError error `json:"-"`
}
func (e Error) Error() string {
return e.Message
}
func NewError(err error) Error {
return Error{
StatusCode: http.StatusInternalServerError,
Message: "Internal server error with unknown reason",
OriginError: err,
}
}
func ErrorHandler(next tcp.Handler) tcp.Handler {
return func(w tcp.ResponseWriter, req *tcp.Request) error {
originErr := next(w, req)
var err Error
switch originErr := originErr.(type) {
case nil:
return nil
case Error:
err = originErr
default:
err = NewError(originErr)
}
if err.OriginError == nil {
zap.L().Warn(err.Message)
} else {
zap.L().Error(err.Message,
zap.Error(err.OriginError))
}
w.WriteHeader(err.StatusCode)
io.WriteString(w, err.Message)
return err
}
}