mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
完善日志中的内容大小记录;模板引擎新增Config内置变量
This commit is contained in:
@ -19,7 +19,8 @@ import (
|
||||
// 注意该对象并没有实现http.ResponseWriter接口,而是依靠ghttp.ResponseWriter实现。
|
||||
type Response struct {
|
||||
ResponseWriter
|
||||
Server *Server
|
||||
length int // 请求返回的内容长度(byte)
|
||||
Server *Server // 所属Web Server
|
||||
Writer *ResponseWriter // ResponseWriter的别名
|
||||
request *Request // 关联的Request请求对象
|
||||
}
|
||||
@ -43,18 +44,21 @@ func (r *Response) Write(content ... interface{}) {
|
||||
if len(content) == 0 {
|
||||
return
|
||||
}
|
||||
r.mu.Lock()
|
||||
for _, v := range content {
|
||||
switch v.(type) {
|
||||
case []byte:
|
||||
// 如果是二进制数据,那么返回二进制数据
|
||||
r.mu.Lock()
|
||||
r.buffer = append(r.buffer, gconv.Bytes(v)...)
|
||||
r.mu.Unlock()
|
||||
default:
|
||||
// 否则一律按照可显示的字符串进行转换
|
||||
r.mu.Lock()
|
||||
r.buffer = append(r.buffer, gconv.String(v)...)
|
||||
r.mu.Unlock()
|
||||
}
|
||||
}
|
||||
r.mu.Unlock()
|
||||
r.length = len(r.buffer)
|
||||
}
|
||||
|
||||
// 返回信息,支持自定义format格式
|
||||
@ -187,6 +191,7 @@ func (r *Response) BufferLength() int {
|
||||
|
||||
// 手动设置缓冲区内容
|
||||
func (r *Response) SetBuffer(buffer []byte) {
|
||||
r.length = 0
|
||||
r.mu.Lock()
|
||||
r.buffer = buffer
|
||||
r.mu.Unlock()
|
||||
@ -205,3 +210,14 @@ func (r *Response) OutputBuffer() {
|
||||
//r.handleGzip()
|
||||
r.Writer.OutputBuffer()
|
||||
}
|
||||
|
||||
// 获取输出到客户端的数据大小
|
||||
func (r *Response) ContentSize() int {
|
||||
if r.length > 0 {
|
||||
return r.length
|
||||
}
|
||||
if length := r.Header().Get("Content-Length"); length != "" {
|
||||
return gconv.Int(length)
|
||||
}
|
||||
return r.BufferLength()
|
||||
}
|
||||
|
||||
@ -48,7 +48,7 @@ func (r *Response) ParseTpl(tpl string, params map[string]interface{}, funcmap..
|
||||
if len(funcmap) > 0 {
|
||||
fmap = funcmap[0]
|
||||
}
|
||||
return gins.View().Parse(tpl, r.buildInParams(params), r.buildInfuncs(fmap))
|
||||
return gins.View().Parse(tpl, r.buildInVars(params), r.buildInfuncs(fmap))
|
||||
}
|
||||
|
||||
// 解析并返回模板内容
|
||||
@ -57,11 +57,12 @@ func (r *Response) ParseTplContent(content string, params map[string]interface{}
|
||||
if len(funcmap) > 0 {
|
||||
fmap = funcmap[0]
|
||||
}
|
||||
return gins.View().ParseContent(content, r.buildInParams(params), r.buildInfuncs(fmap))
|
||||
return gins.View().ParseContent(content, r.buildInVars(params), r.buildInfuncs(fmap))
|
||||
}
|
||||
|
||||
// 内置变量
|
||||
func (r *Response) buildInParams(params map[string]interface{}) map[string]interface{} {
|
||||
func (r *Response) buildInVars(params map[string]interface{}) map[string]interface{} {
|
||||
params["Config"] = gins.Config().GetMap("")
|
||||
params["Cookie"] = r.request.Cookie.Map()
|
||||
params["Session"] = r.request.Session.Data()
|
||||
return params
|
||||
|
||||
@ -165,6 +165,7 @@ func (s *Server)serveFile(r *Request, path string) {
|
||||
}
|
||||
} else {
|
||||
// 读取文件内容返回, no buffer
|
||||
r.Response.length = int(info.Size())
|
||||
http.ServeContent(r.Response.Writer, &r.Request, info.Name(), info.ModTime(), f)
|
||||
}
|
||||
}
|
||||
|
||||
@ -9,7 +9,6 @@ package ghttp
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"gitee.com/johng/gf/g/util/gconv"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
@ -23,10 +22,10 @@ func (s *Server) handleAccessLog(r *Request) {
|
||||
v(r)
|
||||
return
|
||||
}
|
||||
content := fmt.Sprintf(`"%s %s %s %s" %s %s`,
|
||||
content := fmt.Sprintf(`"%s %s %s %s" %d %d`,
|
||||
r.Method, r.Host, r.URL.String(), r.Proto,
|
||||
gconv.String(r.Response.Status),
|
||||
gconv.String(r.Response.BufferLength()),
|
||||
r.Response.Status,
|
||||
r.Response.ContentSize(),
|
||||
)
|
||||
content += fmt.Sprintf(` %.3f`, float64(r.LeaveTime - r.EnterTime)/1000)
|
||||
content += fmt.Sprintf(`, %s, "%s", "%s"`, r.GetClientIp(), r.Referer(), r.UserAgent())
|
||||
|
||||
Reference in New Issue
Block a user