templates: Propagate httpError to HTTP response

Now possible with Go 1.17.
See https://github.com/golang/go/issues/34201.
This commit is contained in:
Matthew Holt 2021-09-15 09:55:57 -06:00
parent a437206643
commit 2392478bd3
No known key found for this signature in database
GPG key ID: 2A349DD577D586A5
2 changed files with 9 additions and 3 deletions

View file

@ -16,6 +16,7 @@ package templates
import (
"bytes"
"errors"
"fmt"
"net/http"
"strconv"
@ -312,6 +313,12 @@ func (t *Templates) executeTemplate(rr caddyhttp.ResponseRecorder, r *http.Reque
err := ctx.executeTemplateInBuffer(r.URL.Path, rr.Buffer())
if err != nil {
// templates may return a custom HTTP error to be propagated to the client,
// otherwise for any other error we assume the template is broken
var handlerErr caddyhttp.HandlerError
if errors.As(err, &handlerErr) {
return handlerErr
}
return caddyhttp.Error(http.StatusInternalServerError, err)
}

View file

@ -350,9 +350,8 @@ func (c TemplateContext) funcFileExists(filename string) (bool, error) {
return false, nil
}
// funcHTTPError returns a structured HTTP handler error. EXPERIMENTAL.
// TODO: Requires https://github.com/golang/go/issues/34201 to be fixed (Go 1.17).
// Example usage might be: `{{if not (fileExists $includeFile)}}{{httpError 404}}{{end}}`
// funcHTTPError returns a structured HTTP handler error. EXPERIMENTAL; SUBJECT TO CHANGE.
// Example usage: `{{if not (fileExists $includeFile)}}{{httpError 404}}{{end}}`
func (c TemplateContext) funcHTTPError(statusCode int) (bool, error) {
return false, caddyhttp.Error(statusCode, nil)
}