mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-13 08:29:26 +03:00
c890454769
Fixes #24723 Direct serving of content aka HTTP redirect is not mentioned in any of the package registry specs but lots of official registries do that so it should be supported by the usual clients.
63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
// Copyright 2021 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package helper
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
|
|
packages_model "code.gitea.io/gitea/models/packages"
|
|
"code.gitea.io/gitea/modules/context"
|
|
"code.gitea.io/gitea/modules/log"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
)
|
|
|
|
// LogAndProcessError logs an error and calls a custom callback with the processed error message.
|
|
// If the error is an InternalServerError the message is stripped if the user is not an admin.
|
|
func LogAndProcessError(ctx *context.Context, status int, obj interface{}, cb func(string)) {
|
|
var message string
|
|
if err, ok := obj.(error); ok {
|
|
message = err.Error()
|
|
} else if obj != nil {
|
|
message = fmt.Sprintf("%s", obj)
|
|
}
|
|
if status == http.StatusInternalServerError {
|
|
log.ErrorWithSkip(1, message)
|
|
|
|
if setting.IsProd && (ctx.Doer == nil || !ctx.Doer.IsAdmin) {
|
|
message = ""
|
|
}
|
|
} else {
|
|
log.Debug(message)
|
|
}
|
|
|
|
if cb != nil {
|
|
cb(message)
|
|
}
|
|
}
|
|
|
|
// Serves the content of the package file
|
|
// If the url is set it will redirect the request, otherwise the content is copied to the response.
|
|
func ServePackageFile(ctx *context.Context, s io.ReadSeekCloser, u *url.URL, pf *packages_model.PackageFile, forceOpts ...*context.ServeHeaderOptions) {
|
|
if u != nil {
|
|
ctx.Redirect(u.String())
|
|
return
|
|
}
|
|
|
|
defer s.Close()
|
|
|
|
var opts *context.ServeHeaderOptions
|
|
if len(forceOpts) > 0 {
|
|
opts = forceOpts[0]
|
|
} else {
|
|
opts = &context.ServeHeaderOptions{
|
|
Filename: pf.Name,
|
|
LastModified: pf.CreatedUnix.AsLocalTime(),
|
|
}
|
|
}
|
|
|
|
ctx.ServeContent(s, opts)
|
|
}
|