完善日志中的内容大小记录;模板引擎新增Config内置变量

This commit is contained in:
John
2018-09-04 23:40:16 +08:00
parent 46b16374d7
commit f5ca1ab1a9
4 changed files with 27 additions and 10 deletions

View File

@ -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()
}

View File

@ -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

View File

@ -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)
}
}

View File

@ -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())