2014-04-16 00:27:29 +08: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 02:28:04 -04:00
"io"
"path"
2014-04-16 00:27:29 +08:00
2015-12-15 17:25:45 -05:00
"github.com/gogits/git-module"
2015-12-09 20:46:05 -05:00
2014-07-26 02:28:04 -04:00
"github.com/gogits/gogs/modules/base"
2016-03-11 11:56:52 -05:00
"github.com/gogits/gogs/modules/context"
2014-04-16 00:27:29 +08:00
)
2016-03-11 11:56:52 -05:00
func ServeData ( ctx * context . Context , name string , reader io . Reader ) error {
2014-07-26 02:28:04 -04:00
buf := make ( [ ] byte , 1024 )
2015-08-12 04:49:51 +08:00
n , _ := reader . Read ( buf )
2014-07-26 02:28:04 -04:00
if n > 0 {
buf = buf [ : n ]
}
2015-01-31 15:27:57 -05:00
_ , isTextFile := base . IsTextFile ( buf )
2015-12-09 20:46:05 -05:00
if ! isTextFile {
2015-07-28 19:50:35 +03:00
_ , isImageFile := base . IsImageFile ( buf )
if ! isImageFile {
2016-03-25 22:11:58 -04:00
ctx . Resp . Header ( ) . Set ( "Content-Disposition" , "attachment; filename=\"" + path . Base ( ctx . Repo . TreeName ) + "\"" )
2015-07-28 19:50:35 +03:00
ctx . Resp . Header ( ) . Set ( "Content-Transfer-Encoding" , "binary" )
}
2016-08-05 18:34:13 -07:00
} else if ! ctx . QueryBool ( "render" ) {
2016-04-21 01:38:11 +02:00
ctx . Resp . Header ( ) . Set ( "Content-Type" , "text/plain; charset=utf-8" )
2014-07-26 02:28:04 -04:00
}
ctx . Resp . Write ( buf )
2015-08-12 04:49:51 +08:00
_ , err := io . Copy ( ctx . Resp , reader )
2015-01-31 15:27:57 -05:00
return err
2014-11-16 21:32:26 -05:00
}
2016-03-11 11:56:52 -05:00
func ServeBlob ( ctx * context . Context , blob * git . Blob ) error {
2015-08-12 04:49:51 +08:00
dataRc , err := blob . Data ( )
if err != nil {
return err
}
return ServeData ( ctx , ctx . Repo . TreeName , dataRc )
}
2016-03-11 11:56:52 -05:00
func SingleDownload ( ctx * context . Context ) {
2014-11-16 21:32:26 -05:00
blob , err := ctx . Repo . Commit . GetBlobByPath ( ctx . Repo . TreeName )
if err != nil {
2015-12-09 20:46:05 -05:00
if git . IsErrNotExist ( err ) {
2014-11-16 21:32:26 -05:00
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-16 00:27:29 +08:00
}