mirror of
https://github.com/thomiceli/opengist.git
synced 2026-08-07 07:14:49 +00:00
Better handler for committed http responses (#734)
This commit is contained in:
@@ -101,9 +101,7 @@ func DownloadZip(ctx *context.Context) error {
|
|||||||
ctx.Response().Header().Set("Content-Type", "application/zip")
|
ctx.Response().Header().Set("Content-Type", "application/zip")
|
||||||
ctx.Response().Header().Set("Content-Disposition", "attachment; filename="+gist.Identifier()+".zip")
|
ctx.Response().Header().Set("Content-Disposition", "attachment; filename="+gist.Identifier()+".zip")
|
||||||
ctx.Response().Header().Set("Content-Length", strconv.Itoa(len(zipFile.Bytes())))
|
ctx.Response().Header().Set("Content-Length", strconv.Itoa(len(zipFile.Bytes())))
|
||||||
_, err = ctx.Response().Write(zipFile.Bytes())
|
|
||||||
if err != nil {
|
_, _ = ctx.Response().Write(zipFile.Bytes())
|
||||||
return ctx.ErrorRes(500, "Error writing the zip archive", err)
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,44 +93,44 @@ func (s *Server) registerMiddlewares() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) errorHandler(err error, ctx echo.Context) {
|
func (s *Server) errorHandler(err error, ctx echo.Context) {
|
||||||
|
data, _ := ctx.Request().Context().Value(context.DataKeyStr).(echo.Map)
|
||||||
|
if data == nil {
|
||||||
|
data = echo.Map{}
|
||||||
|
}
|
||||||
|
|
||||||
var httpErr *context.HTTPError
|
var httpErr *context.HTTPError
|
||||||
data := ctx.Request().Context().Value(context.DataKeyStr).(echo.Map)
|
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
acceptJson := strings.Contains(ctx.Request().Header.Get("Accept"), "application/json")
|
|
||||||
data["error"] = err
|
data["error"] = err
|
||||||
if acceptJson || data["err_render"] == "json" {
|
} else {
|
||||||
if err := ctx.JSON(httpErr.Code, httpErr); err != nil {
|
if isClientGone(err) {
|
||||||
if errors.Is(err, syscall.EPIPE) || errors.Is(err, syscall.ECONNRESET) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Fatal().Err(err).Send()
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.Error().Err(err).Send()
|
||||||
|
httpErr = &context.HTTPError{Message: err.Error(), Code: http.StatusInternalServerError}
|
||||||
|
data["error"] = httpErr
|
||||||
|
}
|
||||||
|
|
||||||
if err := ctx.Render(httpErr.Code, "error", data); err != nil {
|
if ctx.Response().Committed {
|
||||||
if errors.Is(err, syscall.EPIPE) || errors.Is(err, syscall.ECONNRESET) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Fatal().Err(err).Send()
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if errors.Is(err, syscall.EPIPE) || errors.Is(err, syscall.ECONNRESET) {
|
acceptJson := strings.Contains(ctx.Request().Header.Get("Accept"), "application/json")
|
||||||
return
|
var renderErr error
|
||||||
|
if acceptJson || data["err_render"] == "json" {
|
||||||
|
renderErr = ctx.JSON(httpErr.Code, httpErr)
|
||||||
|
} else {
|
||||||
|
renderErr = ctx.Render(httpErr.Code, "error", data)
|
||||||
}
|
}
|
||||||
log.Error().Err(err).Send()
|
|
||||||
httpErr = &context.HTTPError{Message: err.Error(), Code: http.StatusInternalServerError}
|
if renderErr != nil && !isClientGone(renderErr) {
|
||||||
data["error"] = httpErr
|
log.Error().Err(renderErr).Send()
|
||||||
if err := ctx.Render(500, "error", data); err != nil {
|
|
||||||
if errors.Is(err, syscall.EPIPE) || errors.Is(err, syscall.ECONNRESET) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Fatal().Err(err).Send()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isClientGone(err error) bool {
|
||||||
|
return errors.Is(err, syscall.EPIPE) || errors.Is(err, syscall.ECONNRESET)
|
||||||
|
}
|
||||||
|
|
||||||
func dataInit(next Handler) Handler {
|
func dataInit(next Handler) Handler {
|
||||||
return func(ctx *context.Context) error {
|
return func(ctx *context.Context) error {
|
||||||
ctx.SetData("loadStartTime", time.Now())
|
ctx.SetData("loadStartTime", time.Now())
|
||||||
|
|||||||
Reference in New Issue
Block a user