/
TemplateDot.go
141 lines (125 loc) · 4.35 KB
/
TemplateDot.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package viot
import(
"net"
"github.com/456vv/vmap/v2"
"github.com/456vv/vweb/v2"
"context"
"bufio"
)
type DotContexter interface{
Context() context.Context // 上下文
WithContext(ctx context.Context) // 替换上下文
}
// TemplateDoter 可以在模本中使用的方法
type TemplateDoter interface{
RootDir(path string) string // 家的根目录
Request() *Request // 用户的请求信息
Header() Header // 标头
ResponseWriter() ResponseWriter // 数据写入响应
Launch() RoundTripper // 发射
Hijack() (net.Conn, *bufio.ReadWriter, error) // 劫持
Session(token string) Sessioner // 用户的会话缓存
Global() Globaler // 全站缓存
Swap() *vmap.Map // 信息交换
Defer(call interface{}, args ... interface{}) error // 退回调用
DotContexter // 上下文
}
//模板点
type TemplateDot struct {
R *Request // 请求
W ResponseWriter // 响应
Site *Site // 站点配置
Writed bool // 表示已经调用写入到客户端。这个是只读的
exchange vmap.Map // 缓存映射
ec vweb.ExitCall // 退回调用函数
ctx context.Context // 上下文
}
//RootDir 家的根目录
// upath string 页面路径
// string 根目录
func (T *TemplateDot) RootDir(upath string) string {
if T.Site != nil && T.Site.RootDir != nil {
return T.Site.RootDir(upath)
}
return "."
}
//Request 用户的请求信息
// *Request 请求
func (T *TemplateDot) Request() *Request {
return T.R
}
//Header 标头
// Header 响应标头
func (T *TemplateDot) Header() Header {
return T.W.Header()
}
//ResponseWriter 数据写入响应,调用这个接口后,模板中的内容就不会显示页客户端去
// ResponseWriter 响应
func (T *TemplateDot) ResponseWriter() ResponseWriter {
T.Writed=true
return T.W
}
//Launch 发射数据到设备
// RoundTripper 转发
func (T *TemplateDot) Launch() RoundTripper {
return T.W.(Launcher).Launch()
}
//劫持连接
// net.Conn 原连接
// *bufio.ReadWriter 读取缓冲
// error 错误
func (T *TemplateDot) Hijack() (net.Conn, *bufio.ReadWriter, error) {
return T.W.(Hijacker).Hijack()
}
//Session 用户的会话缓存
// token string 令牌
// Sessioner 会话缓存
func (T *TemplateDot) Session(token string) Sessioner {
if T.Site == nil || T.Site.Sessions == nil {
return nil
}
return T.Site.Sessions.NewSession(token)
}
//Global 全站缓存
// Globaler 公共缓存
func (T *TemplateDot) Global() Globaler {
if T.Site == nil || T.Site.Global == nil {
return nil
}
return T.Site.Global
}
//Swap 信息交换
// Swaper 映射
func (T *TemplateDot) Swap() *vmap.Map {
return &T.exchange
}
//Defer 在用户会话时间过期后,将被调用。
// call interface{} 函数
// args ... interface{} 参数或更多个函数是函数的参数
// error 错误
// 例:
// .Defer(fmt.Println, "1", "2")
// .Defer(fmt.Printf, "%s", "汉字")
func (T *TemplateDot) Defer(call interface{}, args ... interface{}) error {
return T.ec.Defer(call, args...)
}
//Free 释放Defer
func (T *TemplateDot) Free() {
T.ec.Free()
}
//Context 上下文
// context.Context 上下文
func (T *TemplateDot) Context() context.Context {
if T.ctx != nil {
return T.ctx
}
return context.Background()
}
//WithContext 替换上下文
// ctx context.Context 上下文
func (T *TemplateDot) WithContext(ctx context.Context) {
if ctx == nil {
panic("nil context")
}
T.ctx = ctx
}