2014-04-15 20:27:29 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package repo
import (
2014-07-26 10:28:04 +04:00
"io"
"path"
2014-04-15 20:27:29 +04:00
2014-07-26 10:28:04 +04:00
"github.com/gogits/gogs/modules/base"
2014-11-17 05:32:26 +03:00
"github.com/gogits/gogs/modules/git"
2014-04-15 20:27:29 +04:00
"github.com/gogits/gogs/modules/middleware"
)
2014-11-17 05:32:26 +03:00
func ServeBlob ( ctx * middleware . Context , blob * git . Blob ) error {
2014-07-26 10:28:04 +04:00
dataRc , err := blob . Data ( )
if err != nil {
2014-11-17 05:32:26 +03:00
return err
2014-07-26 10:28:04 +04:00
}
buf := make ( [ ] byte , 1024 )
n , _ := dataRc . Read ( buf )
if n > 0 {
buf = buf [ : n ]
}
contentType , isTextFile := base . IsTextFile ( buf )
_ , isImageFile := base . IsImageFile ( buf )
ctx . Resp . Header ( ) . Set ( "Content-Type" , contentType )
if ! isTextFile && ! isImageFile {
2014-11-07 06:06:41 +03:00
ctx . Resp . Header ( ) . Set ( "Content-Disposition" , "attachment; filename=" + path . Base ( ctx . Repo . TreeName ) )
2014-07-26 10:28:04 +04:00
ctx . Resp . Header ( ) . Set ( "Content-Transfer-Encoding" , "binary" )
}
ctx . Resp . Write ( buf )
io . Copy ( ctx . Resp , dataRc )
2014-11-17 05:32:26 +03:00
return nil
}
func SingleDownload ( ctx * middleware . Context ) {
blob , err := ctx . Repo . Commit . GetBlobByPath ( ctx . Repo . TreeName )
if err != nil {
if err == git . ErrNotExist {
ctx . Handle ( 404 , "GetBlobByPath" , nil )
} else {
ctx . Handle ( 500 , "GetBlobByPath" , err )
}
return
}
if err = ServeBlob ( ctx , blob ) ; err != nil {
ctx . Handle ( 500 , "ServeBlob" , err )
}
2014-04-15 20:27:29 +04:00
}