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