Skip to content

Replace ServeStream with ServeContent #20903

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Aug 25, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 1 addition & 17 deletions modules/context/context.go
Original file line number Diff line number Diff line change
@@ -358,14 +358,7 @@ func (ctx *Context) SetServeHeaders(filename string) {
}

// ServeContent serves content to http request
func (ctx *Context) ServeContent(name string, r io.ReadSeeker, params ...interface{}) {
modTime := time.Now()
for _, p := range params {
switch v := p.(type) {
case time.Time:
modTime = v
}
}
func (ctx *Context) ServeContent(name string, r io.ReadSeeker, modTime time.Time) {
ctx.SetServeHeaders(name)
http.ServeContent(ctx.Resp, ctx.Req, name, modTime, r)
}
@@ -382,15 +375,6 @@ func (ctx *Context) ServeFile(file string, names ...string) {
http.ServeFile(ctx.Resp, ctx.Req, file)
}

// ServeStream serves file via io stream
func (ctx *Context) ServeStream(rd io.Reader, name string) {
ctx.SetServeHeaders(name)
_, err := io.Copy(ctx.Resp, rd)
if err != nil {
ctx.ServerError("Download file failed", err)
}
}

// UploadStream returns the request body or the first form file
// Only form files need to get closed.
func (ctx *Context) UploadStream() (rd io.ReadCloser, needToClose bool, err error) {
5 changes: 5 additions & 0 deletions modules/timeutil/timestamp.go
Original file line number Diff line number Diff line change
@@ -54,6 +54,11 @@ func (ts TimeStamp) AsTime() (tm time.Time) {
return ts.AsTimeInLocation(setting.DefaultUILocation)
}

// AsLocalTime convert timestamp as time.Time in local location
func (ts TimeStamp) AsLocalTime() time.Time {
return time.Unix(int64(ts), 0)
}

// AsTimeInLocation convert timestamp as time.Time in Local locale
func (ts TimeStamp) AsTimeInLocation(loc *time.Location) (tm time.Time) {
tm = time.Unix(int64(ts), 0).In(loc)
2 changes: 1 addition & 1 deletion routers/api/packages/composer/api.go
Original file line number Diff line number Diff line change
@@ -99,7 +99,7 @@ func createPackageMetadataResponse(registryURL string, pds []*packages_model.Pac
Name: pd.Package.Name,
Version: pd.Version.Version,
Type: packageType,
Created: time.Unix(int64(pd.Version.CreatedUnix), 0),
Created: pd.Version.CreatedUnix.AsLocalTime(),
Metadata: pd.Metadata.(*composer_module.Metadata),
Dist: Dist{
Type: "zip",
2 changes: 1 addition & 1 deletion routers/api/packages/composer/composer.go
Original file line number Diff line number Diff line change
@@ -184,7 +184,7 @@ func DownloadPackageFile(ctx *context.Context) {
}
defer s.Close()

ctx.ServeStream(s, pf.Name)
ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime())
}

// UploadPackage creates a new package
8 changes: 4 additions & 4 deletions routers/api/packages/conan/conan.go
Original file line number Diff line number Diff line change
@@ -475,7 +475,7 @@ func downloadFile(ctx *context.Context, fileFilter stringSet, fileKey string) {
}
defer s.Close()

ctx.ServeStream(s, pf.Name)
ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime())
}

// DeleteRecipeV1 deletes the requested recipe(s)
@@ -723,7 +723,7 @@ func listRevisions(ctx *context.Context, revisions []*conan_model.PropertyValue)

revs := make([]*revisionInfo, 0, len(revisions))
for _, rev := range revisions {
revs = append(revs, &revisionInfo{Revision: rev.Value, Time: time.Unix(int64(rev.CreatedUnix), 0)})
revs = append(revs, &revisionInfo{Revision: rev.Value, Time: rev.CreatedUnix.AsLocalTime()})
}

jsonResponse(ctx, http.StatusOK, &RevisionList{revs})
@@ -743,7 +743,7 @@ func LatestRecipeRevision(ctx *context.Context) {
return
}

jsonResponse(ctx, http.StatusOK, &revisionInfo{Revision: revision.Value, Time: time.Unix(int64(revision.CreatedUnix), 0)})
jsonResponse(ctx, http.StatusOK, &revisionInfo{Revision: revision.Value, Time: revision.CreatedUnix.AsLocalTime()})
}

// LatestPackageRevision gets the latest package revision
@@ -760,7 +760,7 @@ func LatestPackageRevision(ctx *context.Context) {
return
}

jsonResponse(ctx, http.StatusOK, &revisionInfo{Revision: revision.Value, Time: time.Unix(int64(revision.CreatedUnix), 0)})
jsonResponse(ctx, http.StatusOK, &revisionInfo{Revision: revision.Value, Time: revision.CreatedUnix.AsLocalTime()})
}

// ListRecipeRevisionFiles gets a list of all recipe revision files
2 changes: 1 addition & 1 deletion routers/api/packages/generic/generic.go
Original file line number Diff line number Diff line change
@@ -53,7 +53,7 @@ func DownloadPackageFile(ctx *context.Context) {
}
defer s.Close()

ctx.ServeStream(s, pf.Name)
ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime())
}

// UploadPackage uploads the specific generic package.
2 changes: 1 addition & 1 deletion routers/api/packages/helm/helm.go
Original file line number Diff line number Diff line change
@@ -138,7 +138,7 @@ func DownloadPackageFile(ctx *context.Context) {
}
defer s.Close()

ctx.ServeStream(s, pf.Name)
ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime())
}

// UploadPackage creates a new package
2 changes: 1 addition & 1 deletion routers/api/packages/maven/maven.go
Original file line number Diff line number Diff line change
@@ -177,7 +177,7 @@ func servePackageFile(ctx *context.Context, params parameters) {
}
}

ctx.ServeStream(s, pf.Name)
ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime())
}

// UploadPackageFile adds a file to the package. If the package does not exist, it gets created.
2 changes: 1 addition & 1 deletion routers/api/packages/npm/npm.go
Original file line number Diff line number Diff line change
@@ -103,7 +103,7 @@ func DownloadPackageFile(ctx *context.Context) {
}
defer s.Close()

ctx.ServeStream(s, pf.Name)
ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime())
}

// UploadPackage creates a new package
2 changes: 1 addition & 1 deletion routers/api/packages/nuget/api.go
Original file line number Diff line number Diff line change
@@ -176,7 +176,7 @@ func createRegistrationLeafResponse(l *linkBuilder, pd *packages_model.PackageDe
return &RegistrationLeafResponse{
Type: []string{"Package", "http://schema.nuget.org/catalog#Permalink"},
Listed: true,
Published: time.Unix(int64(pd.Version.CreatedUnix), 0),
Published: pd.Version.CreatedUnix.AsLocalTime(),
RegistrationLeafURL: l.GetRegistrationLeafURL(pd.Package.Name, pd.Version.Version),
PackageContentURL: l.GetPackageDownloadURL(pd.Package.Name, pd.Version.Version),
RegistrationIndexURL: l.GetRegistrationIndexURL(pd.Package.Name),
6 changes: 3 additions & 3 deletions routers/api/packages/nuget/nuget.go
Original file line number Diff line number Diff line change
@@ -179,7 +179,7 @@ func DownloadPackageFile(ctx *context.Context) {
}
defer s.Close()

ctx.ServeStream(s, pf.Name)
ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime())
}

// UploadPackage creates a new package with the metadata contained in the uploaded nupgk file
@@ -378,7 +378,7 @@ func DownloadSymbolFile(ctx *context.Context) {
return
}

s, _, err := packages_service.GetPackageFileStream(ctx, pfs[0])
s, pf, err := packages_service.GetPackageFileStream(ctx, pfs[0])
if err != nil {
if err == packages_model.ErrPackageNotExist || err == packages_model.ErrPackageFileNotExist {
apiError(ctx, http.StatusNotFound, err)
@@ -389,7 +389,7 @@ func DownloadSymbolFile(ctx *context.Context) {
}
defer s.Close()

ctx.ServeStream(s, pfs[0].Name)
ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime())
}

// DeletePackage hard deletes the package
4 changes: 2 additions & 2 deletions routers/api/packages/pub/pub.go
Original file line number Diff line number Diff line change
@@ -69,7 +69,7 @@ func packageDescriptorToMetadata(baseURL string, pd *packages_model.PackageDescr
return &versionMetadata{
Version: pd.Version.Version,
ArchiveURL: fmt.Sprintf("%s/files/%s.tar.gz", baseURL, url.PathEscape(pd.Version.Version)),
Published: time.Unix(int64(pd.Version.CreatedUnix), 0),
Published: pd.Version.CreatedUnix.AsLocalTime(),
Pubspec: pd.Metadata.(*pub_module.Metadata).Pubspec,
}
}
@@ -271,5 +271,5 @@ func DownloadPackageFile(ctx *context.Context) {
}
defer s.Close()

ctx.ServeStream(s, pf.Name)
ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime())
}
2 changes: 1 addition & 1 deletion routers/api/packages/pypi/pypi.go
Original file line number Diff line number Diff line change
@@ -90,7 +90,7 @@ func DownloadPackageFile(ctx *context.Context) {
}
defer s.Close()

ctx.ServeStream(s, pf.Name)
ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime())
}

// UploadPackageFile adds a file to the package. If the package does not exist, it gets created.
2 changes: 1 addition & 1 deletion routers/api/packages/rubygems/rubygems.go
Original file line number Diff line number Diff line change
@@ -188,7 +188,7 @@ func DownloadPackageFile(ctx *context.Context) {
}
defer s.Close()

ctx.ServeStream(s, pf.Name)
ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime())
}

// UploadPackageFile adds a file to the package. If the package does not exist, it gets created.
3 changes: 2 additions & 1 deletion routers/web/repo/repo.go
Original file line number Diff line number Diff line change
@@ -468,7 +468,8 @@ func download(ctx *context.Context, archiveName string, archiver *repo_model.Rep
return
}
defer fr.Close()
ctx.ServeStream(fr, downloadName)

ctx.ServeContent(downloadName, fr, archiver.CreatedUnix.AsLocalTime())
}

// InitiateDownload will enqueue an archival request, as needed. It may submit
2 changes: 1 addition & 1 deletion routers/web/user/package.go
Original file line number Diff line number Diff line change
@@ -393,5 +393,5 @@ func DownloadPackageFile(ctx *context.Context) {
}
defer s.Close()

ctx.ServeStream(s, pf.Name)
ctx.ServeContent(pf.Name, s, pf.CreatedUnix.AsLocalTime())
}
8 changes: 4 additions & 4 deletions services/packages/packages.go
Original file line number Diff line number Diff line change
@@ -402,7 +402,7 @@ func Cleanup(unused context.Context, olderThan time.Duration) error {
}

// GetFileStreamByPackageNameAndVersion returns the content of the specific package file
func GetFileStreamByPackageNameAndVersion(ctx context.Context, pvi *PackageInfo, pfi *PackageFileInfo) (io.ReadCloser, *packages_model.PackageFile, error) {
func GetFileStreamByPackageNameAndVersion(ctx context.Context, pvi *PackageInfo, pfi *PackageFileInfo) (io.ReadSeekCloser, *packages_model.PackageFile, error) {
log.Trace("Getting package file stream: %v, %v, %s, %s, %s, %s", pvi.Owner.ID, pvi.PackageType, pvi.Name, pvi.Version, pfi.Filename, pfi.CompositeKey)

pv, err := packages_model.GetVersionByNameAndVersion(ctx, pvi.Owner.ID, pvi.PackageType, pvi.Name, pvi.Version)
@@ -418,7 +418,7 @@ func GetFileStreamByPackageNameAndVersion(ctx context.Context, pvi *PackageInfo,
}

// GetFileStreamByPackageVersionAndFileID returns the content of the specific package file
func GetFileStreamByPackageVersionAndFileID(ctx context.Context, owner *user_model.User, versionID, fileID int64) (io.ReadCloser, *packages_model.PackageFile, error) {
func GetFileStreamByPackageVersionAndFileID(ctx context.Context, owner *user_model.User, versionID, fileID int64) (io.ReadSeekCloser, *packages_model.PackageFile, error) {
log.Trace("Getting package file stream: %v, %v, %v", owner.ID, versionID, fileID)

pv, err := packages_model.GetVersionByID(ctx, versionID)
@@ -449,7 +449,7 @@ func GetFileStreamByPackageVersionAndFileID(ctx context.Context, owner *user_mod
}

// GetFileStreamByPackageVersion returns the content of the specific package file
func GetFileStreamByPackageVersion(ctx context.Context, pv *packages_model.PackageVersion, pfi *PackageFileInfo) (io.ReadCloser, *packages_model.PackageFile, error) {
func GetFileStreamByPackageVersion(ctx context.Context, pv *packages_model.PackageVersion, pfi *PackageFileInfo) (io.ReadSeekCloser, *packages_model.PackageFile, error) {
pf, err := packages_model.GetFileForVersionByName(ctx, pv.ID, pfi.Filename, pfi.CompositeKey)
if err != nil {
return nil, nil, err
@@ -459,7 +459,7 @@ func GetFileStreamByPackageVersion(ctx context.Context, pv *packages_model.Packa
}

// GetPackageFileStream returns the content of the specific package file
func GetPackageFileStream(ctx context.Context, pf *packages_model.PackageFile) (io.ReadCloser, *packages_model.PackageFile, error) {
func GetPackageFileStream(ctx context.Context, pf *packages_model.PackageFile) (io.ReadSeekCloser, *packages_model.PackageFile, error) {
pb, err := packages_model.GetBlobByID(ctx, pf.BlobID)
if err != nil {
return nil, nil, err