@ -232,7 +232,7 @@ func (ctx *Context) NotFound(logMsg string, logErr error) {
func ( ctx * Context ) notFoundInternal ( logMsg string , logErr error ) {
func ( ctx * Context ) notFoundInternal ( logMsg string , logErr error ) {
if logErr != nil {
if logErr != nil {
log . ErrorWithSkip ( 2 , "%s: %v" , logMsg , logErr )
log . Log ( 2 , log . DEBUG , "%s: %v" , logMsg , logErr )
if ! setting . IsProd {
if ! setting . IsProd {
ctx . Data [ "ErrorMsg" ] = logErr
ctx . Data [ "ErrorMsg" ] = logErr
}
}
@ -248,7 +248,7 @@ func (ctx *Context) notFoundInternal(logMsg string, logErr error) {
}
}
if ! showHTML {
if ! showHTML {
ctx . PlainText ( http . StatusNotFound , "Not found.\n" )
ctx . plainTextInternal ( 3 , http . StatusNotFound , [ ] byte ( "Not found.\n" ) )
return
return
}
}
@ -286,21 +286,27 @@ func (ctx *Context) NotFoundOrServerError(logMsg string, errCheck func(error) bo
}
}
// PlainTextBytes renders bytes as plain text
// PlainTextBytes renders bytes as plain text
func ( ctx * Context ) PlainTextBytes ( status int , bs [ ] byte ) {
func ( ctx * Context ) plainTextInternal ( skip , status int , bs [ ] byte ) {
if ( status / 100 == 4 ) || ( status / 100 == 5 ) {
statusPrefix := status / 100
log . Error ( "PlainTextBytes: %s" , string ( bs ) )
if statusPrefix == 4 || statusPrefix == 5 {
log . Log ( skip , log . TRACE , "plainTextInternal (status=%d): %s" , status , string ( bs ) )
}
}
ctx . Resp . WriteHeader ( status )
ctx . Resp . WriteHeader ( status )
ctx . Resp . Header ( ) . Set ( "Content-Type" , "text/plain;charset=utf-8" )
ctx . Resp . Header ( ) . Set ( "Content-Type" , "text/plain;charset=utf-8" )
ctx . Resp . Header ( ) . Set ( "X-Content-Type-Options" , "nosniff" )
ctx . Resp . Header ( ) . Set ( "X-Content-Type-Options" , "nosniff" )
if _ , err := ctx . Resp . Write ( bs ) ; err != nil {
if _ , err := ctx . Resp . Write ( bs ) ; err != nil {
log . Error ( "Write bytes failed: %v" , err )
log . ErrorWithSkip ( skip , "plainTextInternal (status=%d): write bytes failed: %v" , status , err )
}
}
}
// PlainTextBytes renders bytes as plain text
func ( ctx * Context ) PlainTextBytes ( status int , bs [ ] byte ) {
ctx . plainTextInternal ( 2 , status , bs )
}
}
// PlainText renders content as plain text
// PlainText renders content as plain text
func ( ctx * Context ) PlainText ( status int , text string ) {
func ( ctx * Context ) PlainText ( status int , text string ) {
ctx . PlainTextBytes ( status , [ ] byte ( text ) )
ctx . plainTextInternal ( 2 , status , [ ] byte ( text ) )
}
}
// RespHeader returns the response header
// RespHeader returns the response header