serverErrorHandler is a wrapper around the application's error handler method user for the fasthttp server configuration. It maps a set of fasthttp errors to fiber errors before calling the application's error handler method.
(fctx *fasthttp.RequestCtx, err error)
| 1588 | // user for the fasthttp server configuration. It maps a set of fasthttp errors to fiber |
| 1589 | // errors before calling the application's error handler method. |
| 1590 | func (app *App) serverErrorHandler(fctx *fasthttp.RequestCtx, err error) { |
| 1591 | // Acquire Ctx with fasthttp request from pool |
| 1592 | c := app.AcquireCtx(fctx) |
| 1593 | defer app.ReleaseCtx(c) |
| 1594 | |
| 1595 | var ( |
| 1596 | errNetOP *net.OpError |
| 1597 | netErr net.Error |
| 1598 | ) |
| 1599 | |
| 1600 | errMessage := utils.StatusMessage(StatusBadRequest) |
| 1601 | matchedNetOP := errors.As(err, &errNetOP) |
| 1602 | if err != nil && (!matchedNetOP || errNetOP != nil) { |
| 1603 | errMessage = err.Error() |
| 1604 | } |
| 1605 | matchedNetErr := errors.As(err, &netErr) |
| 1606 | |
| 1607 | switch { |
| 1608 | case err == nil: |
| 1609 | err = NewError(StatusBadRequest, errMessage) |
| 1610 | case matchedNetOP && errNetOP == nil: |
| 1611 | err = ErrBadGateway |
| 1612 | case errors.As(err, new(*fasthttp.ErrSmallBuffer)): |
| 1613 | err = ErrRequestHeaderFieldsTooLarge |
| 1614 | case matchedNetOP && errNetOP.Timeout(): |
| 1615 | err = ErrRequestTimeout |
| 1616 | case matchedNetErr: |
| 1617 | err = ErrBadGateway |
| 1618 | case errors.Is(err, fasthttp.ErrBodyTooLarge): |
| 1619 | err = ErrRequestEntityTooLarge |
| 1620 | case errors.Is(err, fasthttp.ErrGetOnly): |
| 1621 | err = ErrMethodNotAllowed |
| 1622 | case strings.Contains(errMessage, "unsupported http request method"): |
| 1623 | err = ErrNotImplemented |
| 1624 | case strings.Contains(errMessage, "timeout"): |
| 1625 | err = ErrRequestTimeout |
| 1626 | default: |
| 1627 | err = NewError(StatusBadRequest, errMessage) |
| 1628 | } |
| 1629 | |
| 1630 | if c.getMethodInt() != -1 { |
| 1631 | c.setSkipNonUseRoutes(true) |
| 1632 | defer c.setSkipNonUseRoutes(false) |
| 1633 | |
| 1634 | var nextErr error |
| 1635 | if d, isDefault := c.(*DefaultCtx); isDefault { |
| 1636 | _, nextErr = app.next(d) |
| 1637 | } else { |
| 1638 | _, nextErr = app.nextCustom(c) |
| 1639 | } |
| 1640 | |
| 1641 | if nextErr != nil && !errors.Is(nextErr, ErrNotFound) && !errors.Is(nextErr, ErrMethodNotAllowed) { |
| 1642 | log.Errorf("serverErrorHandler: middleware traversal failed: %v", nextErr) |
| 1643 | } |
| 1644 | } |
| 1645 | |
| 1646 | if catch := app.ErrorHandler(c, err); catch != nil { |
| 1647 | log.Errorf("serverErrorHandler: failed to call ErrorHandler: %v", catch) |