func()

in internal/serving/disk/reader.go [44:79]


func (reader *Reader) tryRedirects(h serving.Handler) bool {
	defer slowlogs.Recorder(h.Request.Context(), "reader.tryRedirects")()

	ctx := h.Request.Context()

	root, served := reader.root(h)
	if root == nil {
		return served
	}

	r := redirects.ParseRedirects(ctx, root)

	requestURL := cloneURL(h.Request.URL)
	// Taking value from h.Request.Host as h.Request.URL.Host is not populated
	requestURL.Host = h.Request.Host
	rewrittenURL, status, err := r.Rewrite(requestURL)
	if err != nil {
		if !errors.Is(err, redirects.ErrNoRedirect) {
			// We assume that rewrite failure is not fatal
			// and we only capture the error

			errortracking.CaptureErrWithReqAndStackTrace(err, h.Request)
		}
		return false
	}

	if status == http.StatusOK {
		h.SubPath = strings.TrimPrefix(rewrittenURL.Path, h.LookupPath.Prefix)
		return reader.tryFile(h)
	}

	copySchemeAndHost(requestURL, rewrittenURL)

	http.Redirect(h.Writer, h.Request, rewrittenURL.String(), status)
	return true
}