Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
B
beego
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
beego
Commits
7452151b
Commit
7452151b
authored
May 01, 2017
by
astaxie
Committed by
GitHub
May 01, 2017
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2611 from astaxie/develop
1.8.2
parents
522b3a4a
e76423e6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
44 changed files
with
237 additions
and
173 deletions
+237
-173
.travis.yml
.travis.yml
+5
-0
admin.go
admin.go
+27
-22
beego.go
beego.go
+1
-1
env.go
config/env/env.go
+2
-0
ini.go
config/ini.go
+4
-1
acceptencoder.go
context/acceptencoder.go
+1
-0
output.go
context/output.go
+1
-1
server.go
grace/server.go
+2
-2
hooks.go
hooks.go
+3
-3
README.md
httplib/README.md
+1
-1
httplib.go
httplib/httplib.go
+2
-2
alils.go
logs/alils/alils.go
+20
-26
log.pb.go
logs/alils/log.pb.go
+0
-0
log_config.go
logs/alils/log_config.go
+3
-0
log_project.go
logs/alils/log_project.go
+5
-4
log_store.go
logs/alils/log_store.go
+11
-9
machine_group.go
logs/alils/machine_group.go
+10
-6
request.go
logs/alils/request.go
+2
-2
color_windows.go
logs/color_windows.go
+1
-1
file.go
logs/file.go
+7
-5
log.go
logs/log.go
+3
-2
logger.go
logs/logger.go
+15
-2
db.go
orm/db.go
+4
-5
db_alias.go
orm/db_alias.go
+3
-3
db_mysql.go
orm/db_mysql.go
+1
-2
orm.go
orm/orm.go
+1
-1
orm_raw.go
orm/orm_raw.go
+1
-1
orm_test.go
orm/orm_test.go
+11
-3
policy.go
policy.go
+2
-2
sess_couchbase.go
session/couchbase/sess_couchbase.go
+3
-1
ledis_session.go
session/ledis/ledis_session.go
+1
-4
sess_redis.go
session/redis/sess_redis.go
+3
-7
sess_file.go
session/sess_file.go
+8
-1
sess_test.go
session/sess_test.go
+1
-2
session.go
session/session.go
+23
-22
sess_ssdb.go
session/ssdb/sess_ssdb.go
+29
-11
swagger.go
swagger/swagger.go
+1
-1
template.go
template.go
+3
-1
template_test.go
template_test.go
+2
-2
templatefunc.go
templatefunc.go
+3
-3
templatefunc_test.go
templatefunc_test.go
+8
-8
file.go
utils/file.go
+1
-1
file_test.go
utils/file_test.go
+1
-1
util_test.go
validation/util_test.go
+1
-1
No files found.
.travis.yml
View file @
7452151b
...
...
@@ -35,6 +35,8 @@ install:
-
go get github.com/gogo/protobuf/proto
-
go get -u honnef.co/go/tools/cmd/gosimple
-
go get -u github.com/mdempsky/unconvert
-
go get -u github.com/gordonklaus/ineffassign
-
go get -u github.com/golang/lint/golint
before_script
:
-
psql --version
-
sh -c "if [ '$ORM_DRIVER' = 'postgres' ]; then psql -c 'create database orm_test;' -U postgres; fi"
...
...
@@ -51,5 +53,8 @@ script:
-
go test -v ./...
-
gosimple -ignore "$(cat .gosimpleignore)" $(go list ./... | grep -v /vendor/)
-
unconvert $(go list ./... | grep -v /vendor/)
-
ineffassign .
-
find . ! \( -path './vendor' -prune \) -type f -name '*.go' -print0 | xargs -0 gofmt -l -s
-
golint ./...
addons
:
postgresql
:
"
9.4"
admin.go
View file @
7452151b
...
...
@@ -105,29 +105,12 @@ func listConf(rw http.ResponseWriter, r *http.Request) {
tmpl
.
Execute
(
rw
,
data
)
case
"router"
:
var
(
content
=
map
[
string
]
interface
{}{
"Fields"
:
[]
string
{
"Router Pattern"
,
"Methods"
,
"Controller"
,
},
}
methods
=
[]
string
{}
methodsData
=
make
(
map
[
string
]
interface
{})
)
for
method
,
t
:=
range
BeeApp
.
Handlers
.
routers
{
resultList
:=
new
([][]
string
)
printTree
(
resultList
,
t
)
methods
=
append
(
methods
,
method
)
methodsData
[
method
]
=
resultList
content
:=
PrintTree
()
content
[
"Fields"
]
=
[]
string
{
"Router Pattern"
,
"Methods"
,
"Controller"
,
}
content
[
"Data"
]
=
methodsData
content
[
"Methods"
]
=
methods
data
[
"Content"
]
=
content
data
[
"Title"
]
=
"Routers"
execTpl
(
rw
,
data
,
routerAndFilterTpl
,
defaultScriptsTpl
)
...
...
@@ -200,6 +183,28 @@ func list(root string, p interface{}, m map[string]interface{}) {
}
}
// PrintTree prints all registered routers.
func
PrintTree
()
map
[
string
]
interface
{}
{
var
(
content
=
map
[
string
]
interface
{}{}
methods
=
[]
string
{}
methodsData
=
make
(
map
[
string
]
interface
{})
)
for
method
,
t
:=
range
BeeApp
.
Handlers
.
routers
{
resultList
:=
new
([][]
string
)
printTree
(
resultList
,
t
)
methods
=
append
(
methods
,
method
)
methodsData
[
method
]
=
resultList
}
content
[
"Data"
]
=
methodsData
content
[
"Methods"
]
=
methods
return
content
}
func
printTree
(
resultList
*
[][]
string
,
t
*
Tree
)
{
for
_
,
tr
:=
range
t
.
fixrouters
{
printTree
(
resultList
,
tr
)
...
...
beego.go
View file @
7452151b
...
...
@@ -23,7 +23,7 @@ import (
const
(
// VERSION represent beego web framework version.
VERSION
=
"1.8.
1
"
VERSION
=
"1.8.
2
"
// DEV is for develop
DEV
=
"dev"
...
...
config/env/env.go
View file @
7452151b
...
...
@@ -12,6 +12,8 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Package env is used to parse environment.
package
env
import
(
...
...
config/ini.go
View file @
7452151b
...
...
@@ -325,7 +325,10 @@ func (c *IniConfigContainer) SaveConfigFile(filename string) (err error) {
// Get section or key comments. Fixed #1607
getCommentStr
:=
func
(
section
,
key
string
)
string
{
comment
,
ok
:=
""
,
false
var
(
comment
string
ok
bool
)
if
len
(
key
)
==
0
{
comment
,
ok
=
c
.
sectionComment
[
section
]
}
else
{
...
...
context/acceptencoder.go
View file @
7452151b
...
...
@@ -39,6 +39,7 @@ var (
getMethodOnly
bool
)
// InitGzip init the gzipcompress
func
InitGzip
(
minLength
,
compressLevel
int
,
methods
[]
string
)
{
if
minLength
>=
0
{
gzipMinLength
=
minLength
...
...
context/output.go
View file @
7452151b
...
...
@@ -105,7 +105,7 @@ func (output *BeegoOutput) Cookie(name string, value string, others ...interface
switch
{
case
maxAge
>
0
:
fmt
.
Fprintf
(
&
b
,
"; Expires=%s; Max-Age=%d"
,
time
.
Now
()
.
Add
(
time
.
Duration
(
maxAge
)
*
time
.
Second
)
.
UTC
()
.
Format
(
time
.
RFC1123
),
maxAge
)
case
maxAge
<
=
0
:
case
maxAge
<
0
:
fmt
.
Fprintf
(
&
b
,
"; Max-Age=0"
)
}
}
...
...
grace/server.go
View file @
7452151b
...
...
@@ -291,7 +291,7 @@ func (srv *Server) fork() (err error) {
// RegisterSignalHook registers a function to be run PreSignal or PostSignal for a given signal.
func
(
srv
*
Server
)
RegisterSignalHook
(
ppFlag
int
,
sig
os
.
Signal
,
f
func
())
(
err
error
)
{
if
ppFlag
!=
PreSignal
&&
ppFlag
!=
PostSignal
{
err
=
fmt
.
Errorf
(
"Invalid ppFlag argument. Must be either grace.PreSignal or grace.PostSignal
.
"
)
err
=
fmt
.
Errorf
(
"Invalid ppFlag argument. Must be either grace.PreSignal or grace.PostSignal"
)
return
}
for
_
,
s
:=
range
hookableSignals
{
...
...
@@ -300,6 +300,6 @@ func (srv *Server) RegisterSignalHook(ppFlag int, sig os.Signal, f func()) (err
return
}
}
err
=
fmt
.
Errorf
(
"Signal '%v' is not supported
.
"
,
sig
)
err
=
fmt
.
Errorf
(
"Signal '%v' is not supported"
,
sig
)
return
}
hooks.go
View file @
7452151b
...
...
@@ -55,9 +55,9 @@ func registerSession() error {
conf
.
ProviderConfig
=
filepath
.
ToSlash
(
BConfig
.
WebConfig
.
Session
.
SessionProviderConfig
)
conf
.
DisableHTTPOnly
=
BConfig
.
WebConfig
.
Session
.
SessionDisableHTTPOnly
conf
.
Domain
=
BConfig
.
WebConfig
.
Session
.
SessionDomain
conf
.
EnableSidInH
ttp
Header
=
BConfig
.
WebConfig
.
Session
.
SessionEnableSidInHTTPHeader
conf
.
SessionNameInH
ttp
Header
=
BConfig
.
WebConfig
.
Session
.
SessionNameInHTTPHeader
conf
.
EnableSidInU
rl
Query
=
BConfig
.
WebConfig
.
Session
.
SessionEnableSidInURLQuery
conf
.
EnableSidInH
TTP
Header
=
BConfig
.
WebConfig
.
Session
.
SessionEnableSidInHTTPHeader
conf
.
SessionNameInH
TTP
Header
=
BConfig
.
WebConfig
.
Session
.
SessionNameInHTTPHeader
conf
.
EnableSidInU
RL
Query
=
BConfig
.
WebConfig
.
Session
.
SessionEnableSidInURLQuery
}
else
{
if
err
=
json
.
Unmarshal
([]
byte
(
sessionConfig
),
conf
);
err
!=
nil
{
return
err
...
...
httplib/README.md
View file @
7452151b
...
...
@@ -32,7 +32,7 @@ The default timeout is `60` seconds, function prototype:
SetTimeout(connectTimeout, readWriteTimeout time.Duration)
Ex
ma
ple:
Ex
am
ple:
// GET
httplib.Get("http://beego.me/").SetTimeout(100 * time.Second, 30 * time.Second)
...
...
httplib/httplib.go
View file @
7452151b
...
...
@@ -520,9 +520,9 @@ func (b *BeegoHTTPRequest) Bytes() ([]byte, error) {
return
nil
,
err
}
b
.
body
,
err
=
ioutil
.
ReadAll
(
reader
)
}
else
{
b
.
body
,
err
=
ioutil
.
ReadAll
(
resp
.
Body
)
return
b
.
body
,
err
}
b
.
body
,
err
=
ioutil
.
ReadAll
(
resp
.
Body
)
return
b
.
body
,
err
}
...
...
logs/alils/alils.go
View file @
7452151b
...
...
@@ -2,19 +2,23 @@ package alils
import
(
"encoding/json"
"github.com/astaxie/beego/logs"
"github.com/gogo/protobuf/proto"
"strings"
"sync"
"time"
"github.com/astaxie/beego/logs"
"github.com/gogo/protobuf/proto"
)
const
(
CacheSize
int
=
64
// CacheSize set the flush size
CacheSize
int
=
64
// Delimiter define the topic delimiter
Delimiter
string
=
"##"
)
type
AliLSConfig
struct
{
// Config is the Config for Ali Log
type
Config
struct
{
Project
string
`json:"project"`
Endpoint
string
`json:"endpoint"`
KeyID
string
`json:"key_id"`
...
...
@@ -34,18 +38,17 @@ type aliLSWriter struct {
withMap
bool
groupMap
map
[
string
]
*
LogGroup
lock
*
sync
.
Mutex
AliLS
Config
Config
}
//
创建提供Logger接口的日志服务
//
NewAliLS create a new Logger
func
NewAliLS
()
logs
.
Logger
{
alils
:=
new
(
aliLSWriter
)
alils
.
Level
=
logs
.
LevelTrace
return
alils
}
// 读取配置
// 初始化必要的数据结构
// Init parse config and init struct
func
(
c
*
aliLSWriter
)
Init
(
jsonConfig
string
)
(
err
error
)
{
json
.
Unmarshal
([]
byte
(
jsonConfig
),
c
)
...
...
@@ -54,28 +57,26 @@ func (c *aliLSWriter) Init(jsonConfig string) (err error) {
c
.
FlushWhen
=
CacheSize
}
// 初始化Project
prj
:=
&
LogProject
{
Name
:
c
.
Project
,
Endpoint
:
c
.
Endpoint
,
AccessKeyI
d
:
c
.
KeyID
,
AccessKeyI
D
:
c
.
KeyID
,
AccessKeySecret
:
c
.
KeySecret
,
}
// 获取logstore
c
.
store
,
err
=
prj
.
GetLogStore
(
c
.
LogStore
)
if
err
!=
nil
{
return
err
}
//
创建默认
Log Group
//
Create default
Log Group
c
.
group
=
append
(
c
.
group
,
&
LogGroup
{
Topic
:
proto
.
String
(
""
),
Source
:
proto
.
String
(
c
.
Source
),
Logs
:
make
([]
*
Log
,
0
,
c
.
FlushWhen
),
})
//
创建其它
Log Group
//
Create other
Log Group
c
.
groupMap
=
make
(
map
[
string
]
*
LogGroup
)
for
_
,
topic
:=
range
c
.
Topics
{
...
...
@@ -113,7 +114,7 @@ func (c *aliLSWriter) WriteMsg(when time.Time, msg string, level int) (err error
var
lg
*
LogGroup
if
c
.
withMap
{
//
解析出Topic,并匹配
LogGroup
//
Topic,
LogGroup
strs
:=
strings
.
SplitN
(
msg
,
Delimiter
,
2
)
if
len
(
strs
)
==
2
{
pos
:=
strings
.
LastIndex
(
strs
[
0
],
" "
)
...
...
@@ -122,27 +123,24 @@ func (c *aliLSWriter) WriteMsg(when time.Time, msg string, level int) (err error
lg
=
c
.
groupMap
[
topic
]
}
//
默认发到空
Topic
//
send to empty
Topic
if
lg
==
nil
{
topic
=
""
content
=
msg
lg
=
c
.
group
[
0
]
}
}
else
{
topic
=
""
content
=
msg
lg
=
c
.
group
[
0
]
}
// 生成日志
c1
:=
&
Log_Content
{
c1
:=
&
LogContent
{
Key
:
proto
.
String
(
"msg"
),
Value
:
proto
.
String
(
content
),
}
l
:=
&
Log
{
Time
:
proto
.
Uint32
(
uint32
(
when
.
Unix
())),
// 填写日志时间
Contents
:
[]
*
Log
_
Content
{
Time
:
proto
.
Uint32
(
uint32
(
when
.
Unix
())),
Contents
:
[]
*
LogContent
{
c1
,
},
}
...
...
@@ -151,7 +149,6 @@ func (c *aliLSWriter) WriteMsg(when time.Time, msg string, level int) (err error
lg
.
Logs
=
append
(
lg
.
Logs
,
l
)
c
.
lock
.
Unlock
()
// 满足条件则Flush
if
len
(
lg
.
Logs
)
>=
c
.
FlushWhen
{
c
.
flush
(
lg
)
}
...
...
@@ -162,7 +159,7 @@ func (c *aliLSWriter) WriteMsg(when time.Time, msg string, level int) (err error
// Flush implementing method. empty.
func
(
c
*
aliLSWriter
)
Flush
()
{
// flush
所有
group
// flush
all
group
for
_
,
lg
:=
range
c
.
group
{
c
.
flush
(
lg
)
}
...
...
@@ -176,9 +173,6 @@ func (c *aliLSWriter) flush(lg *LogGroup) {
c
.
lock
.
Lock
()
defer
c
.
lock
.
Unlock
()
// 把以上的LogGroup推送到SLS服务器,
// SLS服务器会根据该logstore的shard个数自动进行负载均衡。
err
:=
c
.
store
.
PutLogs
(
lg
)
if
err
!=
nil
{
return
...
...
logs/alils/log.pb.go
View file @
7452151b
This diff is collapsed.
Click to expand it.
logs/alils/log_config.go
View file @
7452151b
package
alils
// InputDetail define log detail
type
InputDetail
struct
{
LogType
string
`json:"logType"`
LogPath
string
`json:"logPath"`
...
...
@@ -14,11 +15,13 @@ type InputDetail struct {
TopicFormat
string
`json:"topicFormat"`
}
// OutputDetail define the output detail
type
OutputDetail
struct
{
Endpoint
string
`json:"endpoint"`
LogStoreName
string
`json:"logstoreName"`
}
// LogConfig define Log Config
type
LogConfig
struct
{
Name
string
`json:"configName"`
InputType
string
`json:"inputType"`
...
...
logs/alils/log_project.go
View file @
7452151b
/*
Package
s
ls implements the SDK(v0.5.0) of Simple Log Service(abbr. SLS).
Package
ali
ls implements the SDK(v0.5.0) of Simple Log Service(abbr. SLS).
For more description about SLS, please read this article:
http://gitlab.alibaba-inc.com/sls/doc.
...
...
@@ -20,19 +20,20 @@ type errorMessage struct {
Message
string
`json:"errorMessage"`
}
// LogProject Define the Ali Project detail
type
LogProject
struct
{
Name
string
// Project name
Endpoint
string
// IP or hostname of SLS endpoint
AccessKeyI
d
string
AccessKeyI
D
string
AccessKeySecret
string
}
// NewLogProject creates a new SLS project.
func
NewLogProject
(
name
,
endpoint
,
accessKeyId
,
accessKeySecret
string
)
(
p
*
LogProject
,
err
error
)
{
func
NewLogProject
(
name
,
endpoint
,
AccessKeyID
,
accessKeySecret
string
)
(
p
*
LogProject
,
err
error
)
{
p
=
&
LogProject
{
Name
:
name
,
Endpoint
:
endpoint
,
AccessKeyI
d
:
accessKeyId
,
AccessKeyI
D
:
AccessKeyID
,
AccessKeySecret
:
accessKeySecret
,
}
return
p
,
nil
...
...
logs/alils/log_store.go
View file @
7452151b
...
...
@@ -12,6 +12,7 @@ import (
"github.com/gogo/protobuf/proto"
)
// LogStore Store the logs
type
LogStore
struct
{
Name
string
`json:"logstoreName"`
TTL
int
...
...
@@ -23,6 +24,7 @@ type LogStore struct {
project
*
LogProject
}
// Shard define the Log Shard
type
Shard
struct
{
ShardID
int
`json:"shardID"`
}
...
...
@@ -116,16 +118,16 @@ func (s *LogStore) PutLogs(lg *LogGroup) (err error) {
return
}
// GetCursor gets log cursor of one shard specified by shardI
d
.
// GetCursor gets log cursor of one shard specified by shardI
D
.
// The from can be in three form: a) unix timestamp in seccond, b) "begin", c) "end".
// For more detail please read: http://gitlab.alibaba-inc.com/sls/doc/blob/master/api/shard.md#logstore
func
(
s
*
LogStore
)
GetCursor
(
shardI
d
int
,
from
string
)
(
cursor
string
,
err
error
)
{
func
(
s
*
LogStore
)
GetCursor
(
shardI
D
int
,
from
string
)
(
cursor
string
,
err
error
)
{
h
:=
map
[
string
]
string
{
"x-sls-bodyrawsize"
:
"0"
,
}
uri
:=
fmt
.
Sprintf
(
"/logstores/%v/shards/%v?type=cursor&from=%v"
,
s
.
Name
,
shardI
d
,
from
)
s
.
Name
,
shardI
D
,
from
)
r
,
err
:=
request
(
s
.
project
,
"GET"
,
uri
,
h
,
nil
)
if
err
!=
nil
{
...
...
@@ -163,10 +165,10 @@ func (s *LogStore) GetCursor(shardId int, from string) (cursor string, err error
return
}
// GetLogsBytes gets logs binary data from shard specified by shardI
d
according cursor.
// GetLogsBytes gets logs binary data from shard specified by shardI
D
according cursor.
// The logGroupMaxCount is the max number of logGroup could be returned.
// The nextCursor is the next curosr can be used to read logs at next time.
func
(
s
*
LogStore
)
GetLogsBytes
(
shardI
d
int
,
cursor
string
,
func
(
s
*
LogStore
)
GetLogsBytes
(
shardI
D
int
,
cursor
string
,
logGroupMaxCount
int
)
(
out
[]
byte
,
nextCursor
string
,
err
error
)
{
h
:=
map
[
string
]
string
{
...
...
@@ -176,7 +178,7 @@ func (s *LogStore) GetLogsBytes(shardId int, cursor string,
}
uri
:=
fmt
.
Sprintf
(
"/logstores/%v/shards/%v?type=logs&cursor=%v&count=%v"
,
s
.
Name
,
shardI
d
,
cursor
,
logGroupMaxCount
)
s
.
Name
,
shardI
D
,
cursor
,
logGroupMaxCount
)
r
,
err
:=
request
(
s
.
project
,
"GET"
,
uri
,
h
,
nil
)
if
err
!=
nil
{
...
...
@@ -249,13 +251,13 @@ func LogsBytesDecode(data []byte) (gl *LogGroupList, err error) {
return
}
// GetLogs gets logs from shard specified by shardI
d
according cursor.
// GetLogs gets logs from shard specified by shardI
D
according cursor.
// The logGroupMaxCount is the max number of logGroup could be returned.
// The nextCursor is the next curosr can be used to read logs at next time.
func
(
s
*
LogStore
)
GetLogs
(
shardI
d
int
,
cursor
string
,
func
(
s
*
LogStore
)
GetLogs
(
shardI
D
int
,
cursor
string
,
logGroupMaxCount
int
)
(
gl
*
LogGroupList
,
nextCursor
string
,
err
error
)
{
out
,
nextCursor
,
err
:=
s
.
GetLogsBytes
(
shardI
d
,
cursor
,
logGroupMaxCount
)
out
,
nextCursor
,
err
:=
s
.
GetLogsBytes
(
shardI
D
,
cursor
,
logGroupMaxCount
)
if
err
!=
nil
{
return
}
...
...
logs/alils/machine_group.go
View file @
7452151b
...
...
@@ -8,18 +8,20 @@ import (
"net/http/httputil"
)
type
MachinGroupAttribute
struct
{
// MachineGroupAttribute define the Attribute
type
MachineGroupAttribute
struct
{
ExternalName
string
`json:"externalName"`
TopicName
string
`json:"groupTopic"`
}
// MachineGroup define the machine Group
type
MachineGroup
struct
{
Name
string
`json:"groupName"`
Type
string
`json:"groupType"`
MachineI
d
Type
string
`json:"machineIdentifyType"`
MachineI
d
List
[]
string
`json:"machineList"`
MachineI
D
Type
string
`json:"machineIdentifyType"`
MachineI
D
List
[]
string
`json:"machineList"`
Attribute
MachinGroupAttribute
`json:"groupAttribute"`
Attribute
Machin
e
GroupAttribute
`json:"groupAttribute"`
CreateTime
uint32
LastModifyTime
uint32
...
...
@@ -27,12 +29,14 @@ type MachineGroup struct {
project
*
LogProject
}
// Machine define the Machine
type
Machine
struct
{
IP
string
UniqueI
d
string
`json:"machine-uniqueid"`
UserdefinedI
d
string
`json:"userdefined-id"`
UniqueI
D
string
`json:"machine-uniqueid"`
UserdefinedI
D
string
`json:"userdefined-id"`
}
// MachineList define the Machine List
type
MachineList
struct
{
Total
int
Machines
[]
*
Machine
...
...
logs/alils/request.go
View file @
7452151b
...
...
@@ -33,12 +33,12 @@ func request(project *LogProject, method, uri string, headers map[string]string,
}
// Calc Authorization
// Authorization = "SLS <AccessKeyI
d
>:<Signature>"
// Authorization = "SLS <AccessKeyI
D
>:<Signature>"
digest
,
err
:=
signature
(
project
,
method
,
uri
,
headers
)
if
err
!=
nil
{
return
}
auth
:=
fmt
.
Sprintf
(
"SLS %v:%v"
,
project
.
AccessKeyI
d
,
digest
)
auth
:=
fmt
.
Sprintf
(
"SLS %v:%v"
,
project
.
AccessKeyI
D
,
digest
)
headers
[
"Authorization"
]
=
auth
// Initialize http request
...
...
logs/color_windows.go
View file @
7452151b
...
...
@@ -361,7 +361,7 @@ func isParameterChar(b byte) bool {
}
func
(
cw
*
ansiColorWriter
)
Write
(
p
[]
byte
)
(
int
,
error
)
{
r
,
nw
,
first
,
last
:=
0
,
0
,
0
,
0
var
r
,
nw
,
first
,
last
int
if
cw
.
mode
!=
DiscardNonColorEscSeq
{
cw
.
state
=
outsideCsiCode
cw
.
resetBuffer
()
...
...
logs/file.go
View file @
7452151b
...
...
@@ -170,7 +170,7 @@ func (w *fileLogWriter) initFd() error {
fd
:=
w
.
fileWriter
fInfo
,
err
:=
fd
.
Stat
()
if
err
!=
nil
{
return
fmt
.
Errorf
(
"get stat err: %s
\n
"
,
err
)
return
fmt
.
Errorf
(
"get stat err: %s"
,
err
)
}
w
.
maxSizeCurSize
=
int
(
fInfo
.
Size
())
w
.
dailyOpenTime
=
time
.
Now
()
...
...
@@ -259,7 +259,7 @@ func (w *fileLogWriter) doRotate(logTime time.Time) error {
}
// return error if the last file checked still existed
if
err
==
nil
{
return
fmt
.
Errorf
(
"Rotate: Cannot find free log number to rename %s
\n
"
,
w
.
Filename
)
return
fmt
.
Errorf
(
"Rotate: Cannot find free log number to rename %s"
,
w
.
Filename
)
}
// close fileWriter before rename
...
...
@@ -268,6 +268,9 @@ func (w *fileLogWriter) doRotate(logTime time.Time) error {
// Rename the file to its new found name
// even if occurs error,we MUST guarantee to restart new logger
err
=
os
.
Rename
(
w
.
Filename
,
fName
)
if
err
!=
nil
{
goto
RESTART_LOGGER
}
err
=
os
.
Chmod
(
fName
,
os
.
FileMode
(
0440
))
// re-start logger
RESTART_LOGGER
:
...
...
@@ -276,13 +279,12 @@ RESTART_LOGGER:
go
w
.
deleteOldLog
()
if
startLoggerErr
!=
nil
{
return
fmt
.
Errorf
(
"Rotate StartLogger: %s
\n
"
,
startLoggerErr
)
return
fmt
.
Errorf
(
"Rotate StartLogger: %s"
,
startLoggerErr
)
}
if
err
!=
nil
{
return
fmt
.
Errorf
(
"Rotate: %s
\n
"
,
err
)
return
fmt
.
Errorf
(
"Rotate: %s"
,
err
)
}
return
nil
}
func
(
w
*
fileLogWriter
)
deleteOldLog
()
{
...
...
logs/log.go
View file @
7452151b
...
...
@@ -492,9 +492,9 @@ func (bl *BeeLogger) flush() {
}
// beeLogger references the used application logger.
var
beeLogger
*
BeeLogger
=
NewLogger
()
var
beeLogger
=
NewLogger
()
// GetLogger returns the default BeeLogger
// Get
Bee
Logger returns the default BeeLogger
func
GetBeeLogger
()
*
BeeLogger
{
return
beeLogger
}
...
...
@@ -534,6 +534,7 @@ func Reset() {
beeLogger
.
Reset
()
}
// Async set the beelogger with Async mode and hold msglen messages
func
Async
(
msgLen
...
int64
)
*
BeeLogger
{
return
beeLogger
.
Async
(
msgLen
...
)
}
...
...
logs/logger.go
View file @
7452151b
...
...
@@ -139,6 +139,11 @@ var (
reset
=
string
([]
byte
{
27
,
91
,
48
,
109
})
)
// ColorByStatus return color by http code
// 2xx return Green
// 3xx return White
// 4xx return Yellow
// 5xx return Red
func
ColorByStatus
(
cond
bool
,
code
int
)
string
{
switch
{
case
code
>=
200
&&
code
<
300
:
...
...
@@ -152,6 +157,14 @@ func ColorByStatus(cond bool, code int) string {
}
}
// ColorByMethod return color by http code
// GET return Blue
// POST return Cyan
// PUT return Yellow
// DELETE return Red
// PATCH return Green
// HEAD return Magenta
// OPTIONS return WHITE
func
ColorByMethod
(
cond
bool
,
method
string
)
string
{
switch
method
{
case
"GET"
:
...
...
@@ -173,10 +186,10 @@ func ColorByMethod(cond bool, method string) string {
}
}
// Guard Mutex to guarantee atomic
ity
of W32Debug(string) function
// Guard Mutex to guarantee atomic of W32Debug(string) function
var
mu
sync
.
Mutex
// Helper method to output colored logs in Windows terminals
//
W32Debug
Helper method to output colored logs in Windows terminals
func
W32Debug
(
msg
string
)
{
mu
.
Lock
()
defer
mu
.
Unlock
()
...
...
orm/db.go
View file @
7452151b
...
...
@@ -507,10 +507,9 @@ func (d *dbBase) InsertOrUpdate(q dbQuerier, mi *modelInfo, ind reflect.Value, a
case
DRPostgres
:
if
len
(
args
)
==
0
{
return
0
,
fmt
.
Errorf
(
"`%s` use InsertOrUpdate must have a conflict column"
,
a
.
DriverName
)
}
else
{
args0
=
strings
.
ToLower
(
args
[
0
])
iouStr
=
fmt
.
Sprintf
(
"ON CONFLICT (%s) DO UPDATE SET"
,
args0
)
}
args0
=
strings
.
ToLower
(
args
[
0
])
iouStr
=
fmt
.
Sprintf
(
"ON CONFLICT (%s) DO UPDATE SET"
,
args0
)
default
:
return
0
,
fmt
.
Errorf
(
"`%s` nonsupport InsertOrUpdate in beego"
,
a
.
DriverName
)
}
...
...
@@ -1110,7 +1109,7 @@ func (d *dbBase) Count(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condition
// generate sql with replacing operator string placeholders and replaced values.
func
(
d
*
dbBase
)
GenerateOperatorSQL
(
mi
*
modelInfo
,
fi
*
fieldInfo
,
operator
string
,
args
[]
interface
{},
tz
*
time
.
Location
)
(
string
,
[]
interface
{})
{
sql
:=
""
var
sql
string
params
:=
getFlatParams
(
fi
,
args
,
tz
)
if
len
(
params
)
==
0
{
...
...
@@ -1733,7 +1732,7 @@ func (d *dbBase) TableQuote() string {
return
"`"
}
// replace value placeholer in parametered sql string.
// replace value placehol
d
er in parametered sql string.
func
(
d
*
dbBase
)
ReplaceMarks
(
query
*
string
)
{
// default use `?` as mark, do nothing
}
...
...
orm/db_alias.go
View file @
7452151b
...
...
@@ -250,7 +250,7 @@ func RegisterDriver(driverName string, typ DriverType) error {
drivers
[
driverName
]
=
typ
}
else
{
if
t
!=
typ
{
return
fmt
.
Errorf
(
"driverName `%s` db driver already registered and is other type
\n
"
,
driverName
)
return
fmt
.
Errorf
(
"driverName `%s` db driver already registered and is other type"
,
driverName
)
}
}
return
nil
...
...
@@ -261,7 +261,7 @@ func SetDataBaseTZ(aliasName string, tz *time.Location) error {
if
al
,
ok
:=
dataBaseCache
.
get
(
aliasName
);
ok
{
al
.
TZ
=
tz
}
else
{
return
fmt
.
Errorf
(
"DataBase alias name `%s` not registered
\n
"
,
aliasName
)
return
fmt
.
Errorf
(
"DataBase alias name `%s` not registered"
,
aliasName
)
}
return
nil
}
...
...
@@ -296,5 +296,5 @@ func GetDB(aliasNames ...string) (*sql.DB, error) {
if
ok
{
return
al
.
DB
,
nil
}
return
nil
,
fmt
.
Errorf
(
"DataBase of alias name `%s` not found
\n
"
,
name
)
return
nil
,
fmt
.
Errorf
(
"DataBase of alias name `%s` not found"
,
name
)
}
orm/db_mysql.go
View file @
7452151b
...
...
@@ -103,8 +103,7 @@ func (d *dbBaseMysql) IndexExists(db dbQuerier, table string, name string) bool
// If no will insert
// Add "`" for mysql sql building
func
(
d
*
dbBaseMysql
)
InsertOrUpdate
(
q
dbQuerier
,
mi
*
modelInfo
,
ind
reflect
.
Value
,
a
*
alias
,
args
...
string
)
(
int64
,
error
)
{
iouStr
:=
""
var
iouStr
string
argsMap
:=
map
[
string
]
string
{}
iouStr
=
"ON DUPLICATE KEY UPDATE"
...
...
orm/orm.go
View file @
7452151b
...
...
@@ -420,7 +420,7 @@ func (o *orm) getRelQs(md interface{}, mi *modelInfo, fi *fieldInfo) *querySet {
// table name can be string or struct.
// e.g. QueryTable("user"), QueryTable(&user{}) or QueryTable((*User)(nil)),
func
(
o
*
orm
)
QueryTable
(
ptrStructOrTableName
interface
{})
(
qs
QuerySeter
)
{
name
:=
""
var
name
string
if
table
,
ok
:=
ptrStructOrTableName
.
(
string
);
ok
{
name
=
snakeString
(
table
)
if
mi
,
ok
:=
modelCache
.
get
(
name
);
ok
{
...
...
orm/orm_raw.go
View file @
7452151b
...
...
@@ -671,7 +671,7 @@ func (o *rawSet) queryRowsTo(container interface{}, keyCol, valueCol string) (in
ind
*
reflect
.
Value
)
typ
:=
0
var
typ
int
switch
container
.
(
type
)
{
case
*
Params
:
typ
=
1
...
...
orm/orm_test.go
View file @
7452151b
...
...
@@ -135,7 +135,7 @@ func getCaller(skip int) string {
if
i
:=
strings
.
LastIndex
(
funName
,
"."
);
i
>
-
1
{
funName
=
funName
[
i
+
1
:
]
}
return
fmt
.
Sprintf
(
"%s:%
d:
\n
%s"
,
fn
,
line
,
strings
.
Join
(
codes
,
"
\n
"
))
return
fmt
.
Sprintf
(
"%s:%
s:%d:
\n
%s"
,
fn
,
funName
,
line
,
strings
.
Join
(
codes
,
"
\n
"
))
}
func
throwFail
(
t
*
testing
.
T
,
err
error
,
args
...
interface
{})
{
...
...
@@ -1014,6 +1014,8 @@ func TestAll(t *testing.T) {
var
users3
[]
*
User
qs
=
dORM
.
QueryTable
(
"user"
)
num
,
err
=
qs
.
Filter
(
"user_name"
,
"nothing"
)
.
All
(
&
users3
)
throwFailNow
(
t
,
err
)
throwFailNow
(
t
,
AssertIs
(
num
,
0
))
throwFailNow
(
t
,
AssertIs
(
users3
==
nil
,
false
))
}
...
...
@@ -1138,6 +1140,7 @@ func TestRelatedSel(t *testing.T) {
}
err
=
qs
.
Filter
(
"user_name"
,
"nobody"
)
.
RelatedSel
(
"profile"
)
.
One
(
&
user
)
throwFail
(
t
,
err
)
throwFail
(
t
,
AssertIs
(
num
,
1
))
throwFail
(
t
,
AssertIs
(
user
.
Profile
,
nil
))
...
...
@@ -1246,20 +1249,24 @@ func TestLoadRelated(t *testing.T) {
num
,
err
=
dORM
.
LoadRelated
(
&
user
,
"Posts"
,
true
)
throwFailNow
(
t
,
err
)
throwFailNow
(
t
,
AssertIs
(
num
,
2
))
throwFailNow
(
t
,
AssertIs
(
len
(
user
.
Posts
),
2
))
throwFailNow
(
t
,
AssertIs
(
user
.
Posts
[
0
]
.
User
.
UserName
,
"astaxie"
))
num
,
err
=
dORM
.
LoadRelated
(
&
user
,
"Posts"
,
true
,
1
)
throwFailNow
(
t
,
err
)
throwFailNow
(
t
,
AssertIs
(
num
,
1
))
throwFailNow
(
t
,
AssertIs
(
len
(
user
.
Posts
),
1
))
num
,
err
=
dORM
.
LoadRelated
(
&
user
,
"Posts"
,
true
,
0
,
0
,
"-Id"
)
throwFailNow
(
t
,
err
)
throwFailNow
(
t
,
AssertIs
(
num
,
2
))
throwFailNow
(
t
,
AssertIs
(
len
(
user
.
Posts
),
2
))
throwFailNow
(
t
,
AssertIs
(
user
.
Posts
[
0
]
.
Title
,
"Formatting"
))
num
,
err
=
dORM
.
LoadRelated
(
&
user
,
"Posts"
,
true
,
1
,
1
,
"Id"
)
throwFailNow
(
t
,
err
)
throwFailNow
(
t
,
AssertIs
(
num
,
1
))
throwFailNow
(
t
,
AssertIs
(
len
(
user
.
Posts
),
1
))
throwFailNow
(
t
,
AssertIs
(
user
.
Posts
[
0
]
.
Title
,
"Formatting"
))
...
...
@@ -1976,6 +1983,7 @@ func TestReadOrCreate(t *testing.T) {
created
,
pk
,
err
:=
dORM
.
ReadOrCreate
(
u
,
"UserName"
)
throwFail
(
t
,
err
)
throwFail
(
t
,
AssertIs
(
created
,
true
))
throwFail
(
t
,
AssertIs
(
u
.
ID
,
pk
))
throwFail
(
t
,
AssertIs
(
u
.
UserName
,
"Kyle"
))
throwFail
(
t
,
AssertIs
(
u
.
Email
,
"kylemcc@gmail.com"
))
throwFail
(
t
,
AssertIs
(
u
.
Password
,
"other_pass"
))
...
...
@@ -2130,13 +2138,13 @@ func TestUintPk(t *testing.T) {
Name
:
name
,
}
created
,
pk
,
err
:=
dORM
.
ReadOrCreate
(
u
,
"ID"
)
created
,
_
,
err
:=
dORM
.
ReadOrCreate
(
u
,
"ID"
)
throwFail
(
t
,
err
)
throwFail
(
t
,
AssertIs
(
created
,
true
))
throwFail
(
t
,
AssertIs
(
u
.
Name
,
name
))
nu
:=
&
UintPk
{
ID
:
8
}
created
,
pk
,
err
=
dORM
.
ReadOrCreate
(
nu
,
"ID"
)
created
,
pk
,
err
:
=
dORM
.
ReadOrCreate
(
nu
,
"ID"
)
throwFail
(
t
,
err
)
throwFail
(
t
,
AssertIs
(
created
,
false
))
throwFail
(
t
,
AssertIs
(
nu
.
ID
,
u
.
ID
))
...
...
policy.go
View file @
7452151b
...
...
@@ -23,7 +23,7 @@ import (
// PolicyFunc defines a policy function which is invoked before the controller handler is executed.
type
PolicyFunc
func
(
*
context
.
Context
)
// Find
Router
Find Router info for URL
// Find
Policy
Find Router info for URL
func
(
p
*
ControllerRegister
)
FindPolicy
(
cont
*
context
.
Context
)
[]
PolicyFunc
{
var
urlPath
=
cont
.
Input
.
URL
()
if
!
BConfig
.
RouterCaseSensitive
{
...
...
@@ -71,7 +71,7 @@ func (p *ControllerRegister) addToPolicy(method, pattern string, r ...PolicyFunc
}
}
// Register new policy in beego
//
Policy
Register new policy in beego
func
Policy
(
pattern
,
method
string
,
policy
...
PolicyFunc
)
{
BeeApp
.
Handlers
.
addToPolicy
(
method
,
pattern
,
policy
...
)
}
...
...
session/couchbase/sess_couchbase.go
View file @
7452151b
...
...
@@ -162,7 +162,9 @@ func (cp *Provider) SessionRead(sid string) (session.Store, error) {
)
err
=
cp
.
b
.
Get
(
sid
,
&
doc
)
if
doc
==
nil
{
if
err
!=
nil
{
return
nil
,
err
}
else
if
doc
==
nil
{
kv
=
make
(
map
[
interface
{}]
interface
{})
}
else
{
kv
,
err
=
session
.
DecodeGob
(
doc
)
...
...
session/ledis/ledis_session.go
View file @
7452151b
...
...
@@ -113,13 +113,10 @@ func (lp *Provider) SessionInit(maxlifetime int64, savePath string) error {
func
(
lp
*
Provider
)
SessionRead
(
sid
string
)
(
session
.
Store
,
error
)
{
var
(
kv
map
[
interface
{}]
interface
{}
kvs
[]
byte
err
error
)
if
kvs
,
err
=
c
.
Get
([]
byte
(
sid
));
err
!=
nil
{
return
nil
,
err
}
kvs
,
_
:=
c
.
Get
([]
byte
(
sid
))
if
len
(
kvs
)
==
0
{
kv
=
make
(
map
[
interface
{}]
interface
{})
...
...
session/redis/sess_redis.go
View file @
7452151b
...
...
@@ -176,16 +176,12 @@ func (rp *Provider) SessionRead(sid string) (session.Store, error) {
c
:=
rp
.
poollist
.
Get
()
defer
c
.
Close
()
var
(
kv
map
[
interface
{}]
interface
{}
kvs
string
err
error
)
var
kv
map
[
interface
{}]
interface
{}
if
kvs
,
err
=
redis
.
String
(
c
.
Do
(
"GET"
,
sid
));
err
!=
nil
{
kvs
,
err
:=
redis
.
String
(
c
.
Do
(
"GET"
,
sid
))
if
err
!=
redis
.
ErrNil
{
return
nil
,
err
}
if
len
(
kvs
)
==
0
{
kv
=
make
(
map
[
interface
{}]
interface
{})
}
else
{
...
...
session/sess_file.go
View file @
7452151b
...
...
@@ -87,9 +87,16 @@ func (fs *FileSessionStore) SessionRelease(w http.ResponseWriter) {
var
f
*
os
.
File
if
err
==
nil
{
f
,
err
=
os
.
OpenFile
(
path
.
Join
(
filepder
.
savePath
,
string
(
fs
.
sid
[
0
]),
string
(
fs
.
sid
[
1
]),
fs
.
sid
),
os
.
O_RDWR
,
0777
)
if
err
!=
nil
{
SLogger
.
Println
(
err
)
return
}
}
else
if
os
.
IsNotExist
(
err
)
{
f
,
err
=
os
.
Create
(
path
.
Join
(
filepder
.
savePath
,
string
(
fs
.
sid
[
0
]),
string
(
fs
.
sid
[
1
]),
fs
.
sid
))
if
err
!=
nil
{
SLogger
.
Println
(
err
)
return
}
}
else
{
return
}
...
...
session/sess_test.go
View file @
7452151b
...
...
@@ -74,8 +74,7 @@ func TestCookieEncodeDecode(t *testing.T) {
if
err
!=
nil
{
t
.
Fatal
(
"encodeCookie:"
,
err
)
}
dst
:=
make
(
map
[
interface
{}]
interface
{})
dst
,
err
=
decodeCookie
(
block
,
hashKey
,
securityName
,
str
,
3600
)
dst
,
err
:=
decodeCookie
(
block
,
hashKey
,
securityName
,
str
,
3600
)
if
err
!=
nil
{
t
.
Fatal
(
"decodeCookie"
,
err
)
}
...
...
session/session.go
View file @
7452151b
...
...
@@ -81,6 +81,7 @@ func Register(name string, provide Provider) {
provides
[
name
]
=
provide
}
// ManagerConfig define the session config
type
ManagerConfig
struct
{
CookieName
string
`json:"cookieName"`
EnableSetCookie
bool
`json:"enableSetCookie,omitempty"`
...
...
@@ -92,9 +93,9 @@ type ManagerConfig struct {
ProviderConfig
string
`json:"providerConfig"`
Domain
string
`json:"domain"`
SessionIDLength
int64
`json:"sessionIDLength"`
EnableSidInH
ttpHeader
bool
`json:"enableSidInHttp
Header"`
SessionNameInH
ttpHeader
string
`json:"sessionNameInHttp
Header"`
EnableSidInU
rlQuery
bool
`json:"enableSidInUrl
Query"`
EnableSidInH
TTPHeader
bool
`json:"EnableSidInHTTP
Header"`
SessionNameInH
TTPHeader
string
`json:"SessionNameInHTTP
Header"`
EnableSidInU
RLQuery
bool
`json:"EnableSidInURL
Query"`
}
// Manager contains Provider and its configuration.
...
...
@@ -125,14 +126,14 @@ func NewManager(provideName string, cf *ManagerConfig) (*Manager, error) {
cf
.
Maxlifetime
=
cf
.
Gclifetime
}
if
cf
.
EnableSidInH
ttp
Header
{
if
cf
.
SessionNameInH
ttp
Header
==
""
{
panic
(
errors
.
New
(
"SessionNameInH
ttp
Header is empty"
))
if
cf
.
EnableSidInH
TTP
Header
{
if
cf
.
SessionNameInH
TTP
Header
==
""
{
panic
(
errors
.
New
(
"SessionNameInH
TTP
Header is empty"
))
}
strMimeHeader
:=
textproto
.
CanonicalMIMEHeaderKey
(
cf
.
SessionNameInH
ttp
Header
)
if
cf
.
SessionNameInH
ttp
Header
!=
strMimeHeader
{
strErrMsg
:=
"SessionNameInH
ttpHeader ("
+
cf
.
SessionNameInHttp
Header
+
") has the wrong format, it should be like this : "
+
strMimeHeader
strMimeHeader
:=
textproto
.
CanonicalMIMEHeaderKey
(
cf
.
SessionNameInH
TTP
Header
)
if
cf
.
SessionNameInH
TTP
Header
!=
strMimeHeader
{
strErrMsg
:=
"SessionNameInH
TTPHeader ("
+
cf
.
SessionNameInHTTP
Header
+
") has the wrong format, it should be like this : "
+
strMimeHeader
panic
(
errors
.
New
(
strErrMsg
))
}
}
...
...
@@ -163,7 +164,7 @@ func (manager *Manager) getSid(r *http.Request) (string, error) {
cookie
,
errs
:=
r
.
Cookie
(
manager
.
config
.
CookieName
)
if
errs
!=
nil
||
cookie
.
Value
==
""
{
var
sid
string
if
manager
.
config
.
EnableSidInU
rl
Query
{
if
manager
.
config
.
EnableSidInU
RL
Query
{
errs
:=
r
.
ParseForm
()
if
errs
!=
nil
{
return
""
,
errs
...
...
@@ -173,8 +174,8 @@ func (manager *Manager) getSid(r *http.Request) (string, error) {
}
// if not found in Cookie / param, then read it from request headers
if
manager
.
config
.
EnableSidInH
ttp
Header
&&
sid
==
""
{
sids
,
isFound
:=
r
.
Header
[
manager
.
config
.
SessionNameInH
ttp
Header
]
if
manager
.
config
.
EnableSidInH
TTP
Header
&&
sid
==
""
{
sids
,
isFound
:=
r
.
Header
[
manager
.
config
.
SessionNameInH
TTP
Header
]
if
isFound
&&
len
(
sids
)
!=
0
{
return
sids
[
0
],
nil
}
...
...
@@ -226,9 +227,9 @@ func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (se
}
r
.
AddCookie
(
cookie
)
if
manager
.
config
.
EnableSidInH
ttp
Header
{
r
.
Header
.
Set
(
manager
.
config
.
SessionNameInH
ttp
Header
,
sid
)
w
.
Header
()
.
Set
(
manager
.
config
.
SessionNameInH
ttp
Header
,
sid
)
if
manager
.
config
.
EnableSidInH
TTP
Header
{
r
.
Header
.
Set
(
manager
.
config
.
SessionNameInH
TTP
Header
,
sid
)
w
.
Header
()
.
Set
(
manager
.
config
.
SessionNameInH
TTP
Header
,
sid
)
}
return
...
...
@@ -236,9 +237,9 @@ func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (se
// SessionDestroy Destroy session by its id in http request cookie.
func
(
manager
*
Manager
)
SessionDestroy
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
if
manager
.
config
.
EnableSidInH
ttp
Header
{
r
.
Header
.
Del
(
manager
.
config
.
SessionNameInH
ttp
Header
)
w
.
Header
()
.
Del
(
manager
.
config
.
SessionNameInH
ttp
Header
)
if
manager
.
config
.
EnableSidInH
TTP
Header
{
r
.
Header
.
Del
(
manager
.
config
.
SessionNameInH
TTP
Header
)
w
.
Header
()
.
Del
(
manager
.
config
.
SessionNameInH
TTP
Header
)
}
cookie
,
err
:=
r
.
Cookie
(
manager
.
config
.
CookieName
)
...
...
@@ -306,9 +307,9 @@ func (manager *Manager) SessionRegenerateID(w http.ResponseWriter, r *http.Reque
}
r
.
AddCookie
(
cookie
)
if
manager
.
config
.
EnableSidInH
ttp
Header
{
r
.
Header
.
Set
(
manager
.
config
.
SessionNameInH
ttp
Header
,
sid
)
w
.
Header
()
.
Set
(
manager
.
config
.
SessionNameInH
ttp
Header
,
sid
)
if
manager
.
config
.
EnableSidInH
TTP
Header
{
r
.
Header
.
Set
(
manager
.
config
.
SessionNameInH
TTP
Header
,
sid
)
w
.
Header
()
.
Set
(
manager
.
config
.
SessionNameInH
TTP
Header
,
sid
)
}
return
...
...
@@ -328,7 +329,7 @@ func (manager *Manager) sessionID() (string, error) {
b
:=
make
([]
byte
,
manager
.
config
.
SessionIDLength
)
n
,
err
:=
rand
.
Read
(
b
)
if
n
!=
len
(
b
)
||
err
!=
nil
{
return
""
,
fmt
.
Errorf
(
"Could not successfully read from the system CSPRNG
.
"
)
return
""
,
fmt
.
Errorf
(
"Could not successfully read from the system CSPRNG"
)
}
return
hex
.
EncodeToString
(
b
),
nil
}
...
...
session/ssdb/sess_ssdb.go
View file @
7452151b
...
...
@@ -11,16 +11,17 @@ import (
"github.com/ssdb/gossdb/ssdb"
)
var
ssdbProvider
=
&
Ssdb
Provider
{}
var
ssdbProvider
=
&
Provider
{}
type
SsdbProvider
struct
{
// Provider holds ssdb client and configs
type
Provider
struct
{
client
*
ssdb
.
Client
host
string
port
int
maxLifetime
int64
}
func
(
p
*
Ssdb
Provider
)
connectInit
()
error
{
func
(
p
*
Provider
)
connectInit
()
error
{
var
err
error
if
p
.
host
==
""
||
p
.
port
==
0
{
return
errors
.
New
(
"SessionInit First"
)
...
...
@@ -29,7 +30,8 @@ func (p *SsdbProvider) connectInit() error {
return
err
}
func
(
p
*
SsdbProvider
)
SessionInit
(
maxLifetime
int64
,
savePath
string
)
error
{
// SessionInit init the ssdb with the config
func
(
p
*
Provider
)
SessionInit
(
maxLifetime
int64
,
savePath
string
)
error
{
p
.
maxLifetime
=
maxLifetime
address
:=
strings
.
Split
(
savePath
,
":"
)
p
.
host
=
address
[
0
]
...
...
@@ -41,7 +43,8 @@ func (p *SsdbProvider) SessionInit(maxLifetime int64, savePath string) error {
return
p
.
connectInit
()
}
func
(
p
*
SsdbProvider
)
SessionRead
(
sid
string
)
(
session
.
Store
,
error
)
{
// SessionRead return a ssdb client session Store
func
(
p
*
Provider
)
SessionRead
(
sid
string
)
(
session
.
Store
,
error
)
{
if
p
.
client
==
nil
{
if
err
:=
p
.
connectInit
();
err
!=
nil
{
return
nil
,
err
...
...
@@ -64,7 +67,8 @@ func (p *SsdbProvider) SessionRead(sid string) (session.Store, error) {
return
rs
,
nil
}
func
(
p
*
SsdbProvider
)
SessionExist
(
sid
string
)
bool
{
// SessionExist judged whether sid is exist in session
func
(
p
*
Provider
)
SessionExist
(
sid
string
)
bool
{
if
p
.
client
==
nil
{
if
err
:=
p
.
connectInit
();
err
!=
nil
{
panic
(
err
)
...
...
@@ -80,7 +84,8 @@ func (p *SsdbProvider) SessionExist(sid string) bool {
return
true
}
func
(
p
*
SsdbProvider
)
SessionRegenerate
(
oldsid
,
sid
string
)
(
session
.
Store
,
error
)
{
// SessionRegenerate regenerate session with new sid and delete oldsid
func
(
p
*
Provider
)
SessionRegenerate
(
oldsid
,
sid
string
)
(
session
.
Store
,
error
)
{
//conn.Do("setx", key, v, ttl)
if
p
.
client
==
nil
{
if
err
:=
p
.
connectInit
();
err
!=
nil
{
...
...
@@ -112,7 +117,8 @@ func (p *SsdbProvider) SessionRegenerate(oldsid, sid string) (session.Store, err
return
rs
,
nil
}
func
(
p
*
SsdbProvider
)
SessionDestroy
(
sid
string
)
error
{
// SessionDestroy destroy the sid
func
(
p
*
Provider
)
SessionDestroy
(
sid
string
)
error
{
if
p
.
client
==
nil
{
if
err
:=
p
.
connectInit
();
err
!=
nil
{
return
err
...
...
@@ -122,13 +128,16 @@ func (p *SsdbProvider) SessionDestroy(sid string) error {
return
err
}
func
(
p
*
SsdbProvider
)
SessionGC
()
{
// SessionGC not implemented
func
(
p
*
Provider
)
SessionGC
()
{
}
func
(
p
*
SsdbProvider
)
SessionAll
()
int
{
// SessionAll not implemented
func
(
p
*
Provider
)
SessionAll
()
int
{
return
0
}
// SessionStore holds the session information which stored in ssdb
type
SessionStore
struct
{
sid
string
lock
sync
.
RWMutex
...
...
@@ -137,12 +146,15 @@ type SessionStore struct {
client
*
ssdb
.
Client
}
// Set the key and value
func
(
s
*
SessionStore
)
Set
(
key
,
value
interface
{})
error
{
s
.
lock
.
Lock
()
defer
s
.
lock
.
Unlock
()
s
.
values
[
key
]
=
value
return
nil
}
// Get return the value by the key
func
(
s
*
SessionStore
)
Get
(
key
interface
{})
interface
{}
{
s
.
lock
.
Lock
()
defer
s
.
lock
.
Unlock
()
...
...
@@ -152,30 +164,36 @@ func (s *SessionStore) Get(key interface{}) interface{} {
return
nil
}
// Delete the key in session store
func
(
s
*
SessionStore
)
Delete
(
key
interface
{})
error
{
s
.
lock
.
Lock
()
defer
s
.
lock
.
Unlock
()
delete
(
s
.
values
,
key
)
return
nil
}
// Flush delete all keys and values
func
(
s
*
SessionStore
)
Flush
()
error
{
s
.
lock
.
Lock
()
defer
s
.
lock
.
Unlock
()
s
.
values
=
make
(
map
[
interface
{}]
interface
{})
return
nil
}
// SessionID return the sessionID
func
(
s
*
SessionStore
)
SessionID
()
string
{
return
s
.
sid
}
// SessionRelease Store the keyvalues into ssdb
func
(
s
*
SessionStore
)
SessionRelease
(
w
http
.
ResponseWriter
)
{
b
,
err
:=
session
.
EncodeGob
(
s
.
values
)
if
err
!=
nil
{
return
}
s
.
client
.
Do
(
"setx"
,
s
.
sid
,
string
(
b
),
s
.
maxLifetime
)
}
func
init
()
{
session
.
Register
(
"ssdb"
,
ssdbProvider
)
}
swagger/swagger.go
View file @
7452151b
...
...
@@ -100,7 +100,7 @@ type Parameter struct {
Default
interface
{}
`json:"default,omitempty" yaml:"default,omitempty"`
}
// A limited subset of JSON-Schema's items object. It is used by parameter definitions that are not located in "body".
//
ParameterItems
A limited subset of JSON-Schema's items object. It is used by parameter definitions that are not located in "body".
// http://swagger.io/specification/#itemsObject
type
ParameterItems
struct
{
Type
string
`json:"type,omitempty" yaml:"type,omitempty"`
...
...
template.go
View file @
7452151b
...
...
@@ -307,8 +307,9 @@ func _getTemplate(t0 *template.Template, root string, subMods [][]string, others
}
//second check define
for
_
,
otherFile
:=
range
others
{
var
data
[]
byte
fileAbsPath
:=
filepath
.
Join
(
root
,
otherFile
)
data
,
err
:
=
ioutil
.
ReadFile
(
fileAbsPath
)
data
,
err
=
ioutil
.
ReadFile
(
fileAbsPath
)
if
err
!=
nil
{
continue
}
...
...
@@ -364,6 +365,7 @@ func DelStaticPath(url string) *App {
return
BeeApp
}
// AddTemplateEngine add a new templatePreProcessor which support extension
func
AddTemplateEngine
(
extension
string
,
fn
templatePreProcessor
)
*
App
{
AddTemplateExt
(
extension
)
beeTemplateEngines
[
extension
]
=
fn
...
...
template_test.go
View file @
7452151b
...
...
@@ -159,7 +159,7 @@ var add = `{{ template "layout_blog.tpl" . }}
<script src="/static/js/current.js"></script>
{{ end}}`
var
layout
_b
log
=
`<!DOCTYPE html>
var
layout
B
log
=
`<!DOCTYPE html>
<html>
<head>
<title>Lin Li</title>
...
...
@@ -231,7 +231,7 @@ func TestTemplateLayout(t *testing.T) {
if
k
==
0
{
f
.
WriteString
(
add
)
}
else
if
k
==
1
{
f
.
WriteString
(
layout
_b
log
)
f
.
WriteString
(
layout
B
log
)
}
f
.
Close
()
}
...
...
templatefunc.go
View file @
7452151b
...
...
@@ -507,9 +507,9 @@ func parseFormTag(fieldT reflect.StructField) (label, name, fType string, id str
class
=
fieldT
.
Tag
.
Get
(
"class"
)
required
=
false
required
_f
ield
:=
fieldT
.
Tag
.
Get
(
"required"
)
if
required
_field
!=
"-"
&&
required_f
ield
!=
""
{
required
,
_
=
strconv
.
ParseBool
(
required
_f
ield
)
required
F
ield
:=
fieldT
.
Tag
.
Get
(
"required"
)
if
required
Field
!=
"-"
&&
requiredF
ield
!=
""
{
required
,
_
=
strconv
.
ParseBool
(
required
F
ield
)
}
switch
len
(
tags
)
{
...
...
templatefunc_test.go
View file @
7452151b
...
...
@@ -254,43 +254,43 @@ func TestParseFormTag(t *testing.T) {
objT
:=
reflect
.
TypeOf
(
&
user
{})
.
Elem
()
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
:=
parseFormTag
(
objT
.
Field
(
0
))
label
,
name
,
fType
,
_
,
_
,
ignored
,
_
:=
parseFormTag
(
objT
.
Field
(
0
))
if
!
(
name
==
"name"
&&
label
==
"年龄:"
&&
fType
==
"text"
&&
!
ignored
)
{
t
.
Errorf
(
"Form Tag with name, label and type was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
1
))
label
,
name
,
fType
,
_
,
_
,
ignored
,
_
=
parseFormTag
(
objT
.
Field
(
1
))
if
!
(
name
==
"NoName"
&&
label
==
"年龄:"
&&
fType
==
"hidden"
&&
!
ignored
)
{
t
.
Errorf
(
"Form Tag with label and type but without name was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
2
))
label
,
name
,
fType
,
_
,
_
,
ignored
,
_
=
parseFormTag
(
objT
.
Field
(
2
))
if
!
(
name
==
"OnlyLabel"
&&
label
==
"年龄:"
&&
fType
==
"text"
&&
!
ignored
)
{
t
.
Errorf
(
"Form Tag containing only label was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
3
))
label
,
name
,
fType
,
id
,
class
,
ignored
,
_
:
=
parseFormTag
(
objT
.
Field
(
3
))
if
!
(
name
==
"name"
&&
label
==
"OnlyName: "
&&
fType
==
"text"
&&
!
ignored
&&
id
==
"name"
&&
class
==
"form-name"
)
{
t
.
Errorf
(
"Form Tag containing only name was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
4
))
_
,
_
,
_
,
_
,
_
,
ignored
,
_
=
parseFormTag
(
objT
.
Field
(
4
))
if
!
ignored
{
t
.
Errorf
(
"Form Tag that should be ignored was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
5
))
_
,
name
,
_
,
_
,
_
,
_
,
required
:
=
parseFormTag
(
objT
.
Field
(
5
))
if
!
(
name
==
"name"
&&
required
)
{
t
.
Errorf
(
"Form Tag containing only name and required was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
6
))
_
,
name
,
_
,
_
,
_
,
_
,
required
=
parseFormTag
(
objT
.
Field
(
6
))
if
!
(
name
==
"name"
&&
!
required
)
{
t
.
Errorf
(
"Form Tag containing only name and ignore required was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
7
))
_
,
name
,
_
,
_
,
_
,
_
,
required
=
parseFormTag
(
objT
.
Field
(
7
))
if
!
(
name
==
"name"
&&
!
required
)
{
t
.
Errorf
(
"Form Tag containing only name and not required was not correctly parsed."
)
}
...
...
utils/file.go
View file @
7452151b
...
...
@@ -72,7 +72,7 @@ func GrepFile(patten string, filename string) (lines []string, err error) {
lines
=
make
([]
string
,
0
)
reader
:=
bufio
.
NewReader
(
fd
)
prefix
:=
""
isLongLine
:=
false
var
isLongLine
bool
for
{
byteLine
,
isPrefix
,
er
:=
reader
.
ReadLine
()
if
er
!=
nil
&&
er
!=
io
.
EOF
{
...
...
utils/file_test.go
View file @
7452151b
...
...
@@ -54,7 +54,7 @@ func TestSearchFile(t *testing.T) {
_
,
err
=
SearchFile
(
noExistedFile
,
"."
)
if
err
==
nil
{
t
.
Errorf
(
"err shouldn
o
t be nil, got path: %s"
,
SelfDir
())
t
.
Errorf
(
"err shouldnt be nil, got path: %s"
,
SelfDir
())
}
}
...
...
validation/util_test.go
View file @
7452151b
...
...
@@ -42,7 +42,7 @@ func TestGetValidFuncs(t *testing.T) {
}
f
,
_
=
tf
.
FieldByName
(
"Tag"
)
if
vfs
,
err
=
getValidFuncs
(
f
);
err
.
Error
()
!=
"doesn't exsits Maxx valid function"
{
if
_
,
err
=
getValidFuncs
(
f
);
err
.
Error
()
!=
"doesn't exsits Maxx valid function"
{
t
.
Fatal
(
err
)
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment