2022-06-16 06:33:23 +03:00
// Copyright 2022 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2022-06-16 06:33:23 +03:00
package repo
import (
"bytes"
"io"
"net/http"
"path"
"code.gitea.io/gitea/modules/charset"
"code.gitea.io/gitea/modules/git"
2024-03-27 16:14:34 +03:00
"code.gitea.io/gitea/modules/log"
2022-06-16 06:33:23 +03:00
"code.gitea.io/gitea/modules/markup"
"code.gitea.io/gitea/modules/typesniffer"
"code.gitea.io/gitea/modules/util"
2024-02-27 10:12:22 +03:00
"code.gitea.io/gitea/services/context"
2022-06-16 06:33:23 +03:00
)
// RenderFile renders a file by repos path
func RenderFile ( ctx * context . Context ) {
blob , err := ctx . Repo . Commit . GetBlobByPath ( ctx . Repo . TreePath )
if err != nil {
if git . IsErrNotExist ( err ) {
ctx . NotFound ( "GetBlobByPath" , err )
} else {
ctx . ServerError ( "GetBlobByPath" , err )
}
return
}
dataRc , err := blob . DataAsync ( )
if err != nil {
ctx . ServerError ( "DataAsync" , err )
return
}
defer dataRc . Close ( )
buf := make ( [ ] byte , 1024 )
n , _ := util . ReadAtMost ( dataRc , buf )
buf = buf [ : n ]
st := typesniffer . DetectContentType ( buf )
isTextFile := st . IsText ( )
2024-01-27 21:02:51 +03:00
rd := charset . ToUTF8WithFallbackReader ( io . MultiReader ( bytes . NewReader ( buf ) , dataRc ) , charset . ConvertOpts { } )
2024-03-27 16:14:34 +03:00
ctx . Resp . Header ( ) . Add ( "Content-Security-Policy" , "frame-src 'self'; sandbox allow-scripts" )
2022-06-16 06:33:23 +03:00
if markupType := markup . Type ( blob . Name ( ) ) ; markupType == "" {
if isTextFile {
2024-03-27 16:14:34 +03:00
_ , _ = io . Copy ( ctx . Resp , rd )
} else {
http . Error ( ctx . Resp , "Unsupported file type render" , http . StatusInternalServerError )
2022-06-16 06:33:23 +03:00
}
return
}
err = markup . Render ( & markup . RenderContext {
2024-01-15 11:49:24 +03:00
Ctx : ctx ,
RelativePath : ctx . Repo . TreePath ,
Links : markup . Links {
Base : ctx . Repo . RepoLink ,
BranchPath : ctx . Repo . BranchNameSubURL ( ) ,
TreePath : path . Dir ( ctx . Repo . TreePath ) ,
} ,
2023-10-11 07:24:07 +03:00
Metas : ctx . Repo . Repository . ComposeDocumentMetas ( ctx ) ,
2022-06-16 06:33:23 +03:00
GitRepo : ctx . Repo . GitRepo ,
InStandalonePage : true ,
} , rd , ctx . Resp )
if err != nil {
2024-03-27 16:14:34 +03:00
log . Error ( "Failed to render file %q: %v" , ctx . Repo . TreePath , err )
http . Error ( ctx . Resp , "Failed to render file" , http . StatusInternalServerError )
2022-06-16 06:33:23 +03:00
return
}
}