切换导航条
此项目
正在载入...
登录
mmm-go
/
partnermg
·
提交
转到一个项目
GitLab
转到群组
项目
活动
文件
提交
管道
0
构建
0
图表
里程碑
问题
0
合并请求
0
成员
标记
维基
派生
网络
创建新的问题
下载为
邮件补丁
差异文件
浏览文件
作者
唐旭辉
5 years ago
提交
ec1d9e69704fcd8b5634d2044e436d533ec44b91
1 个父辈
ea0544d6
master
...
dev
feature/multi-miniprogram
master20210315
master20210622
test
v0.8.0-dev
0.9.2
0.9.1
0.9.0
0.8.0
0.7.0
0.5.0
0.5.0-1
0.4.0
0.3.0
0.3.0-1
更新vendor依赖
隐藏空白字符变更
内嵌
并排对比
正在显示
36 个修改的文件
包含
4170 行增加
和
123 行删除
go.mod
pkg/domain/partner_info.go
pkg/infrastructure/service_gateway/httplib_service_gateway.go
pkg/lib/jwt.go
pkg/port/beego/controllers/admin_login_controller.go
vendor/github.com/astaxie/beego/.travis.yml
vendor/github.com/astaxie/beego/README.md
vendor/github.com/astaxie/beego/admin.go
vendor/github.com/astaxie/beego/app.go
vendor/github.com/astaxie/beego/beego.go
vendor/github.com/astaxie/beego/build_info.go
vendor/github.com/astaxie/beego/config.go
vendor/github.com/astaxie/beego/config/json.go
vendor/github.com/astaxie/beego/context/input.go
vendor/github.com/astaxie/beego/go.mod
vendor/github.com/astaxie/beego/grace/server.go
vendor/github.com/astaxie/beego/httplib/README.md
vendor/github.com/astaxie/beego/httplib/httplib.go
vendor/github.com/astaxie/beego/logs/file.go
vendor/github.com/astaxie/beego/logs/log.go
vendor/github.com/astaxie/beego/parser.go
vendor/github.com/astaxie/beego/router.go
vendor/github.com/astaxie/beego/session/sess_cookie.go
vendor/github.com/astaxie/beego/session/sess_file.go
vendor/github.com/astaxie/beego/staticfile.go
vendor/github.com/astaxie/beego/toolbox/statistics.go
vendor/github.com/astaxie/beego/toolbox/task.go
vendor/github.com/beorn7/perks/LICENSE
vendor/github.com/beorn7/perks/quantile/exampledata.txt
vendor/github.com/beorn7/perks/quantile/stream.go
vendor/github.com/cespare/xxhash/v2/.travis.yml
vendor/github.com/cespare/xxhash/v2/LICENSE.txt
vendor/github.com/cespare/xxhash/v2/README.md
vendor/github.com/cespare/xxhash/v2/go.mod
vendor/github.com/cespare/xxhash/v2/xxhash.go
vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go
要显示太多修改。
重新载入完整差异
差异文件
邮件补丁
为保证性能只显示
36 of 36+
个文件。
go.mod
查看文件 @
ec1d9e6
...
...
@@ -5,7 +5,7 @@ go 1.14
require (
github.com/GeeTeam/gt3-golang-sdk v0.0.0-20200116043922-446ca8a507d2
github.com/ajg/form v1.5.1 // indirect
github.com/astaxie/beego v1.12.
1
github.com/astaxie/beego v1.12.
2
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect
github.com/fatih/structs v1.1.0 // indirect
...
...
@@ -21,7 +21,6 @@ require (
github.com/onsi/ginkgo v1.13.0
github.com/onsi/gomega v1.10.1
github.com/sergi/go-diff v1.1.0 // indirect
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect
github.com/shopspring/decimal v1.2.0
github.com/smartystreets/goconvey v1.6.4 // indirect
github.com/valyala/fasthttp v1.14.0 // indirect
...
...
pkg/domain/partner_info.go
查看文件 @
ec1d9e6
package
domain
import
"time"
import
(
"fmt"
"time"
)
// 状态(1:启用或者0:禁用)
const
(
...
...
@@ -8,16 +11,24 @@ const (
PARTNER_STATUS_YES
int
=
1
)
//合伙类别 (1.事业合伙人 2.业务合伙人 3.研发合伙人)
//合伙类别 (1.事业合伙人 2.业务合伙人 4.研发合伙人)
//按二进制位区分:001 = 1; 010 = 2; 100=4
const
(
PARTNER_CATEGORY_1
int
=
1
PARTNER_CATEGORY_2
int
=
2
PARTNER_CATEGORY_3
int
=
3
PARTNER_CATEGORY_3
int
=
4
)
//partnerCategoryMap 合伙类别键值对 (只读,请勿在运行时修改)
var
partnerCategoryMap
=
map
[
int
]
string
{
PARTNER_CATEGORY_1
:
"事业合伙人"
,
PARTNER_CATEGORY_2
:
"业务合伙人"
,
PARTNER_CATEGORY_3
:
"研发合伙人"
,
}
type
PartnerInfo
struct
{
Partner
Partner
`json:"partner"`
//合伙类别
(1.事业合伙人 2.业务合伙人 3.研发合伙人)
//合伙类别
PartnerCategory
int
`json:"partnerCategory"`
// 登录密码
Password
string
`json:"password"`
...
...
@@ -35,6 +46,29 @@ type PartnerInfo struct {
Salesman
[]
Salesman
`json:"salesman"`
}
func
(
p
*
PartnerInfo
)
GetPartnerCategory
()
map
[
int
]
string
{
categoryMap
:=
map
[
int
]
string
{}
for
k
,
v
:=
range
partnerCategoryMap
{
//合伙类别 按二进制位区分
if
(
p
.
PartnerCategory
&
k
)
>
0
{
categoryMap
[
k
]
=
v
}
}
return
categoryMap
}
func
(
p
*
PartnerInfo
)
SetPartnerCategory
(
category
[]
int
)
error
{
n
:=
0
for
_
,
v
:=
range
category
{
if
_
,
ok
:=
partnerCategoryMap
[
v
];
!
ok
{
return
fmt
.
Errorf
(
"未知的合伙人类型:%d"
,
v
)
}
n
+=
v
}
p
.
PartnerCategory
=
n
return
nil
}
type
PartnerFindOneQuery
struct
{
UserId
int64
AccountEqual
string
...
...
pkg/infrastructure/service_gateway/httplib_service_gateway.go
0 → 100644
查看文件 @
ec1d9e6
package
service_gateway
import
(
"encoding/json"
"fmt"
"strconv"
"strings"
"time"
"github.com/astaxie/beego/httplib"
)
type
httplibBaseServiceGateway
struct
{
baseURL
string
connectTimeout
time
.
Duration
readWriteTimeout
time
.
Duration
}
func
(
serviceGateway
*
httplibBaseServiceGateway
)
createRequest
(
url
string
,
method
string
)
*
httplib
.
BeegoHTTPRequest
{
var
request
*
httplib
.
BeegoHTTPRequest
switch
method
{
case
"get"
:
request
=
httplib
.
Get
(
url
)
break
case
"post"
:
request
=
httplib
.
Post
(
url
)
break
case
"put"
:
request
=
httplib
.
Put
(
url
)
break
case
"delete"
:
request
=
httplib
.
Delete
(
url
)
break
case
"head"
:
request
=
httplib
.
Head
(
url
)
break
default
:
request
=
httplib
.
Get
(
url
)
}
return
request
.
SetTimeout
(
serviceGateway
.
connectTimeout
,
serviceGateway
.
readWriteTimeout
)
}
func
(
serviceGateway
*
httplibBaseServiceGateway
)
responseHandle
(
response
map
[
string
]
interface
{})
(
map
[
string
]
interface
{},
error
)
{
data
:=
make
(
map
[
string
]
interface
{})
var
err
error
if
code
,
ok
:=
response
[
"code"
];
ok
{
code
:=
code
.
(
float64
)
if
code
==
0
{
data
=
response
[
"data"
]
.
(
map
[
string
]
interface
{})
}
else
{
msg
:=
response
[
"msg"
]
.
(
string
)
err
=
fmt
.
Errorf
(
strings
.
Join
([]
string
{
strconv
.
FormatFloat
(
code
,
'f'
,
-
1
,
64
),
msg
},
" "
))
}
}
else
{
jsonBytes
,
marshalErr
:=
json
.
Marshal
(
response
)
if
marshalErr
!=
nil
{
err
=
marshalErr
}
err
=
fmt
.
Errorf
(
"无法解析的网关服务数据返回格式:%s"
,
string
(
jsonBytes
))
}
return
data
,
err
}
...
...
pkg/lib/jwt.go
查看文件 @
ec1d9e6
...
...
@@ -15,12 +15,12 @@ var (
//MyToken ...
type
MyToken
struct
{
jwt
.
StandardClaims
UID
int64
`json:"uid"`
//管理员的id
UID
int64
`json:"uid"`
//管理员的id
CompanyId
int64
`json:"companyId"`
//公司id
}
func
NewMyToken
(
id
int64
)
*
MyToken
{
return
&
MyToken
{
UID
:
id
}
func
NewMyToken
(
id
int64
,
companyId
int64
)
*
MyToken
{
return
&
MyToken
{
UID
:
id
,
CompanyId
:
companyId
}
}
//CreateJWTToken ...
...
...
pkg/port/beego/controllers/admin_login_controller.go
查看文件 @
ec1d9e6
...
...
@@ -68,7 +68,8 @@ func (c *AdminLoginController) Login() {
if
!
adminuser
.
IsUsable
{
c
.
ResponseError
(
errors
.
New
(
"用户被禁用"
))
}
newJwt
:=
lib
.
NewMyToken
(
adminuser
.
Id
)
//TODO
newJwt
:=
lib
.
NewMyToken
(
adminuser
.
Id
,
0
)
newToken
,
err
:=
newJwt
.
CreateJWTToken
()
if
err
!=
nil
{
logs
.
Error
(
"生成jwt数据失败:%s"
,
err
)
...
...
vendor/github.com/astaxie/beego/.travis.yml
查看文件 @
ec1d9e6
...
...
@@ -36,8 +36,7 @@ install:
-
go get github.com/beego/goyaml2
-
go get gopkg.in/yaml.v2
-
go get github.com/belogik/goes
-
go get github.com/siddontang/ledisdb/config
-
go get github.com/siddontang/ledisdb/ledis
-
go get github.com/ledisdb/ledisdb
-
go get github.com/ssdb/gossdb/ssdb
-
go get github.com/cloudflare/golz4
-
go get github.com/gogo/protobuf/proto
...
...
@@ -49,7 +48,7 @@ install:
-
go get -u honnef.co/go/tools/cmd/staticcheck
-
go get -u github.com/mdempsky/unconvert
-
go get -u github.com/gordonklaus/ineffassign
-
go get -u g
ithub.com/golang
/lint/golint
-
go get -u g
olang.org/x
/lint/golint
-
go get -u github.com/go-redis/redis
before_script
:
-
psql --version
...
...
vendor/github.com/astaxie/beego/README.md
查看文件 @
ec1d9e6
...
...
@@ -33,6 +33,8 @@ Congratulations! You've just built your first **beego** app.
###### Please see [Documentation](http://beego.me/docs) for more.
###### [beego-example](https://github.com/beego-dev/beego-example)
## Features
*
RESTful support
...
...
vendor/github.com/astaxie/beego/admin.go
查看文件 @
ec1d9e6
...
...
@@ -24,6 +24,8 @@ import (
"text/template"
"time"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/astaxie/beego/grace"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/toolbox"
...
...
@@ -55,12 +57,14 @@ func init() {
beeAdminApp
=
&
adminApp
{
routers
:
make
(
map
[
string
]
http
.
HandlerFunc
),
}
// keep in mind that all data should be html escaped to avoid XSS attack
beeAdminApp
.
Route
(
"/"
,
adminIndex
)
beeAdminApp
.
Route
(
"/qps"
,
qpsIndex
)
beeAdminApp
.
Route
(
"/prof"
,
profIndex
)
beeAdminApp
.
Route
(
"/healthcheck"
,
healthcheck
)
beeAdminApp
.
Route
(
"/task"
,
taskStatus
)
beeAdminApp
.
Route
(
"/listconf"
,
listConf
)
beeAdminApp
.
Route
(
"/metrics"
,
promhttp
.
Handler
()
.
ServeHTTP
)
FilterMonitorFunc
=
func
(
string
,
string
,
time
.
Duration
,
string
,
int
)
bool
{
return
true
}
}
...
...
@@ -105,8 +109,8 @@ func listConf(rw http.ResponseWriter, r *http.Request) {
case
"conf"
:
m
:=
make
(
M
)
list
(
"BConfig"
,
BConfig
,
m
)
m
[
"AppConfigPath"
]
=
appConfigPath
m
[
"AppConfigProvider"
]
=
appConfigProvider
m
[
"AppConfigPath"
]
=
template
.
HTMLEscapeString
(
appConfigPath
)
m
[
"AppConfigProvider"
]
=
template
.
HTMLEscapeString
(
appConfigProvider
)
tmpl
:=
template
.
Must
(
template
.
New
(
"dashboard"
)
.
Parse
(
dashboardTpl
))
tmpl
=
template
.
Must
(
tmpl
.
Parse
(
configTpl
))
tmpl
=
template
.
Must
(
tmpl
.
Parse
(
defaultScriptsTpl
))
...
...
@@ -151,8 +155,9 @@ func listConf(rw http.ResponseWriter, r *http.Request) {
resultList
:=
new
([][]
string
)
for
_
,
f
:=
range
bf
{
var
result
=
[]
string
{
f
.
pattern
,
utils
.
GetFuncName
(
f
.
filterFunc
),
// void xss
template
.
HTMLEscapeString
(
f
.
pattern
),
template
.
HTMLEscapeString
(
utils
.
GetFuncName
(
f
.
filterFunc
)),
}
*
resultList
=
append
(
*
resultList
,
result
)
}
...
...
@@ -207,8 +212,8 @@ func PrintTree() M {
printTree
(
resultList
,
t
)
methods
=
append
(
methods
,
method
)
methodsData
[
method
]
=
resultList
methods
=
append
(
methods
,
template
.
HTMLEscapeString
(
method
))
methodsData
[
template
.
HTMLEscapeString
(
method
)]
=
resultList
}
content
[
"Data"
]
=
methodsData
...
...
@@ -227,21 +232,21 @@ func printTree(resultList *[][]string, t *Tree) {
if
v
,
ok
:=
l
.
runObject
.
(
*
ControllerInfo
);
ok
{
if
v
.
routerType
==
routerTypeBeego
{
var
result
=
[]
string
{
v
.
pattern
,
fmt
.
Sprintf
(
"%s"
,
v
.
methods
),
v
.
controllerType
.
String
(),
template
.
HTMLEscapeString
(
v
.
pattern
),
template
.
HTMLEscapeString
(
fmt
.
Sprintf
(
"%s"
,
v
.
methods
)),
template
.
HTMLEscapeString
(
v
.
controllerType
.
String
()),
}
*
resultList
=
append
(
*
resultList
,
result
)
}
else
if
v
.
routerType
==
routerTypeRESTFul
{
var
result
=
[]
string
{
v
.
pattern
,
fmt
.
Sprintf
(
"%s"
,
v
.
methods
),
template
.
HTMLEscapeString
(
v
.
pattern
),
template
.
HTMLEscapeString
(
fmt
.
Sprintf
(
"%s"
,
v
.
methods
)),
""
,
}
*
resultList
=
append
(
*
resultList
,
result
)
}
else
if
v
.
routerType
==
routerTypeHandler
{
var
result
=
[]
string
{
v
.
pattern
,
template
.
HTMLEscapeString
(
v
.
pattern
)
,
""
,
""
,
}
...
...
@@ -266,7 +271,7 @@ func profIndex(rw http.ResponseWriter, r *http.Request) {
result
bytes
.
Buffer
)
toolbox
.
ProcessInput
(
command
,
&
result
)
data
[
"Content"
]
=
result
.
String
(
)
data
[
"Content"
]
=
template
.
HTMLEscapeString
(
result
.
String
()
)
if
format
==
"json"
&&
command
==
"gc summary"
{
dataJSON
,
err
:=
json
.
Marshal
(
data
)
...
...
@@ -280,7 +285,7 @@ func profIndex(rw http.ResponseWriter, r *http.Request) {
return
}
data
[
"Title"
]
=
command
data
[
"Title"
]
=
template
.
HTMLEscapeString
(
command
)
defaultTpl
:=
defaultScriptsTpl
if
command
==
"gc summary"
{
defaultTpl
=
gcAjaxTpl
...
...
@@ -304,13 +309,13 @@ func healthcheck(rw http.ResponseWriter, _ *http.Request) {
if
err
:=
h
.
Check
();
err
!=
nil
{
result
=
[]
string
{
"error"
,
name
,
err
.
Error
(),
template
.
HTMLEscapeString
(
name
),
template
.
HTMLEscapeString
(
err
.
Error
()),
}
}
else
{
result
=
[]
string
{
"success"
,
name
,
template
.
HTMLEscapeString
(
name
)
,
"OK"
,
}
}
...
...
@@ -334,11 +339,11 @@ func taskStatus(rw http.ResponseWriter, req *http.Request) {
if
taskname
!=
""
{
if
t
,
ok
:=
toolbox
.
AdminTaskList
[
taskname
];
ok
{
if
err
:=
t
.
Run
();
err
!=
nil
{
data
[
"Message"
]
=
[]
string
{
"error"
,
fmt
.
Sprintf
(
"%s"
,
err
)}
data
[
"Message"
]
=
[]
string
{
"error"
,
template
.
HTMLEscapeString
(
fmt
.
Sprintf
(
"%s"
,
err
)
)}
}
data
[
"Message"
]
=
[]
string
{
"success"
,
fmt
.
Sprintf
(
"%s run success,Now the Status is <br>%s"
,
taskname
,
t
.
GetStatus
(
))}
data
[
"Message"
]
=
[]
string
{
"success"
,
template
.
HTMLEscapeString
(
fmt
.
Sprintf
(
"%s run success,Now the Status is <br>%s"
,
taskname
,
t
.
GetStatus
()
))}
}
else
{
data
[
"Message"
]
=
[]
string
{
"warning"
,
fmt
.
Sprintf
(
"there's no task which named: %s"
,
taskname
)}
data
[
"Message"
]
=
[]
string
{
"warning"
,
template
.
HTMLEscapeString
(
fmt
.
Sprintf
(
"there's no task which named: %s"
,
taskname
)
)}
}
}
...
...
@@ -354,10 +359,10 @@ func taskStatus(rw http.ResponseWriter, req *http.Request) {
}
for
tname
,
tk
:=
range
toolbox
.
AdminTaskList
{
result
:=
[]
string
{
tname
,
tk
.
GetSpec
(),
tk
.
GetStatus
(),
tk
.
GetPrev
()
.
String
(),
template
.
HTMLEscapeString
(
tname
),
template
.
HTMLEscapeString
(
tk
.
GetSpec
()),
template
.
HTMLEscapeString
(
tk
.
GetStatus
()),
template
.
HTMLEscapeString
(
tk
.
GetPrev
()
.
String
()),
}
*
resultList
=
append
(
*
resultList
,
result
)
}
...
...
vendor/github.com/astaxie/beego/app.go
查看文件 @
ec1d9e6
...
...
@@ -123,14 +123,13 @@ func (app *App) Run(mws ...MiddleWare) {
httpsAddr
=
fmt
.
Sprintf
(
"%s:%d"
,
BConfig
.
Listen
.
HTTPSAddr
,
BConfig
.
Listen
.
HTTPSPort
)
app
.
Server
.
Addr
=
httpsAddr
}
server
:=
grace
.
NewServer
(
httpsAddr
,
app
.
Handlers
)
server
:=
grace
.
NewServer
(
httpsAddr
,
app
.
Server
.
Handler
)
server
.
Server
.
ReadTimeout
=
app
.
Server
.
ReadTimeout
server
.
Server
.
WriteTimeout
=
app
.
Server
.
WriteTimeout
if
BConfig
.
Listen
.
EnableMutualHTTPS
{
if
err
:=
server
.
ListenAndServeMutualTLS
(
BConfig
.
Listen
.
HTTPSCertFile
,
BConfig
.
Listen
.
HTTPSKeyFile
,
BConfig
.
Listen
.
TrustCaFile
);
err
!=
nil
{
logs
.
Critical
(
"ListenAndServeTLS: "
,
err
,
fmt
.
Sprintf
(
"%d"
,
os
.
Getpid
()))
time
.
Sleep
(
100
*
time
.
Microsecond
)
endRunning
<-
true
}
}
else
{
if
BConfig
.
Listen
.
AutoTLS
{
...
...
@@ -145,14 +144,14 @@ func (app *App) Run(mws ...MiddleWare) {
if
err
:=
server
.
ListenAndServeTLS
(
BConfig
.
Listen
.
HTTPSCertFile
,
BConfig
.
Listen
.
HTTPSKeyFile
);
err
!=
nil
{
logs
.
Critical
(
"ListenAndServeTLS: "
,
err
,
fmt
.
Sprintf
(
"%d"
,
os
.
Getpid
()))
time
.
Sleep
(
100
*
time
.
Microsecond
)
endRunning
<-
true
}
}
endRunning
<-
true
}()
}
if
BConfig
.
Listen
.
EnableHTTP
{
go
func
()
{
server
:=
grace
.
NewServer
(
addr
,
app
.
Handlers
)
server
:=
grace
.
NewServer
(
addr
,
app
.
Server
.
Handler
)
server
.
Server
.
ReadTimeout
=
app
.
Server
.
ReadTimeout
server
.
Server
.
WriteTimeout
=
app
.
Server
.
WriteTimeout
if
BConfig
.
Listen
.
ListenTCP4
{
...
...
@@ -161,8 +160,8 @@ func (app *App) Run(mws ...MiddleWare) {
if
err
:=
server
.
ListenAndServe
();
err
!=
nil
{
logs
.
Critical
(
"ListenAndServe: "
,
err
,
fmt
.
Sprintf
(
"%d"
,
os
.
Getpid
()))
time
.
Sleep
(
100
*
time
.
Microsecond
)
endRunning
<-
true
}
endRunning
<-
true
}()
}
<-
endRunning
...
...
vendor/github.com/astaxie/beego/beego.go
查看文件 @
ec1d9e6
...
...
@@ -23,7 +23,7 @@ import (
const
(
// VERSION represent beego web framework version.
VERSION
=
"1.12.
1
"
VERSION
=
"1.12.
2
"
// DEV is for develop
DEV
=
"dev"
...
...
vendor/github.com/astaxie/beego/build_info.go
0 → 100644
查看文件 @
ec1d9e6
// Copyright 2020 astaxie
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// 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
beego
var
(
BuildVersion
string
BuildGitRevision
string
BuildStatus
string
BuildTag
string
BuildTime
string
GoVersion
string
GitBranch
string
)
...
...
vendor/github.com/astaxie/beego/config.go
查看文件 @
ec1d9e6
...
...
@@ -81,6 +81,8 @@ type WebConfig struct {
DirectoryIndex
bool
StaticDir
map
[
string
]
string
StaticExtensionsToGzip
[]
string
StaticCacheFileSize
int
StaticCacheFileNum
int
TemplateLeft
string
TemplateRight
string
ViewsPath
string
...
...
@@ -129,6 +131,8 @@ var (
appConfigPath
string
// appConfigProvider is the provider for the config, default is ini
appConfigProvider
=
"ini"
// WorkPath is the absolute path to project root directory
WorkPath
string
)
func
init
()
{
...
...
@@ -137,7 +141,7 @@ func init() {
if
AppPath
,
err
=
filepath
.
Abs
(
filepath
.
Dir
(
os
.
Args
[
0
]));
err
!=
nil
{
panic
(
err
)
}
workPath
,
err
:
=
os
.
Getwd
()
WorkPath
,
err
=
os
.
Getwd
()
if
err
!=
nil
{
panic
(
err
)
}
...
...
@@ -145,7 +149,7 @@ func init() {
if
os
.
Getenv
(
"BEEGO_RUNMODE"
)
!=
""
{
filename
=
os
.
Getenv
(
"BEEGO_RUNMODE"
)
+
".app.conf"
}
appConfigPath
=
filepath
.
Join
(
w
orkPath
,
"conf"
,
filename
)
appConfigPath
=
filepath
.
Join
(
W
orkPath
,
"conf"
,
filename
)
if
!
utils
.
FileExists
(
appConfigPath
)
{
appConfigPath
=
filepath
.
Join
(
AppPath
,
"conf"
,
filename
)
if
!
utils
.
FileExists
(
appConfigPath
)
{
...
...
@@ -236,6 +240,8 @@ func newBConfig() *Config {
DirectoryIndex
:
false
,
StaticDir
:
map
[
string
]
string
{
"/static"
:
"static"
},
StaticExtensionsToGzip
:
[]
string
{
".css"
,
".js"
},
StaticCacheFileSize
:
1024
*
100
,
StaticCacheFileNum
:
1000
,
TemplateLeft
:
"{{"
,
TemplateRight
:
"}}"
,
ViewsPath
:
"views"
,
...
...
@@ -317,6 +323,14 @@ func assignConfig(ac config.Configer) error {
}
}
if
sfs
,
err
:=
ac
.
Int
(
"StaticCacheFileSize"
);
err
==
nil
{
BConfig
.
WebConfig
.
StaticCacheFileSize
=
sfs
}
if
sfn
,
err
:=
ac
.
Int
(
"StaticCacheFileNum"
);
err
==
nil
{
BConfig
.
WebConfig
.
StaticCacheFileNum
=
sfn
}
if
lo
:=
ac
.
String
(
"LogOutputs"
);
lo
!=
""
{
// if lo is not nil or empty
// means user has set his own LogOutputs
...
...
@@ -408,9 +422,9 @@ func newAppConfig(appConfigProvider, appConfigPath string) (*beegoAppConfig, err
func
(
b
*
beegoAppConfig
)
Set
(
key
,
val
string
)
error
{
if
err
:=
b
.
innerConfig
.
Set
(
BConfig
.
RunMode
+
"::"
+
key
,
val
);
err
!=
nil
{
return
err
return
b
.
innerConfig
.
Set
(
key
,
val
)
}
return
b
.
innerConfig
.
Set
(
key
,
val
)
return
nil
}
func
(
b
*
beegoAppConfig
)
String
(
key
string
)
string
{
...
...
vendor/github.com/astaxie/beego/config/json.go
查看文件 @
ec1d9e6
...
...
@@ -20,6 +20,7 @@ import (
"fmt"
"io/ioutil"
"os"
"strconv"
"strings"
"sync"
)
...
...
@@ -94,8 +95,10 @@ func (c *JSONConfigContainer) Int(key string) (int, error) {
if
val
!=
nil
{
if
v
,
ok
:=
val
.
(
float64
);
ok
{
return
int
(
v
),
nil
}
else
if
v
,
ok
:=
val
.
(
string
);
ok
{
return
strconv
.
Atoi
(
v
)
}
return
0
,
errors
.
New
(
"not
int
value"
)
return
0
,
errors
.
New
(
"not
valid
value"
)
}
return
0
,
errors
.
New
(
"not exist key:"
+
key
)
}
...
...
vendor/github.com/astaxie/beego/context/input.go
查看文件 @
ec1d9e6
...
...
@@ -71,7 +71,9 @@ func (input *BeegoInput) Reset(ctx *Context) {
input
.
CruSession
=
nil
input
.
pnames
=
input
.
pnames
[
:
0
]
input
.
pvalues
=
input
.
pvalues
[
:
0
]
input
.
dataLock
.
Lock
()
input
.
data
=
nil
input
.
dataLock
.
Unlock
()
input
.
RequestBody
=
[]
byte
{}
}
...
...
@@ -87,7 +89,7 @@ func (input *BeegoInput) URI() string {
// URL returns request url path (without query string, fragment).
func
(
input
*
BeegoInput
)
URL
()
string
{
return
input
.
Context
.
Request
.
URL
.
Path
return
input
.
Context
.
Request
.
URL
.
EscapedPath
()
}
// Site returns base site url as scheme://domain type.
...
...
@@ -282,6 +284,11 @@ func (input *BeegoInput) ParamsLen() int {
func
(
input
*
BeegoInput
)
Param
(
key
string
)
string
{
for
i
,
v
:=
range
input
.
pnames
{
if
v
==
key
&&
i
<=
len
(
input
.
pvalues
)
{
// we cannot use url.PathEscape(input.pvalues[i])
// for example, if the value is /a/b
// after url.PathEscape(input.pvalues[i]), the value is %2Fa%2Fb
// However, the value is used in ControllerRegister.ServeHTTP
// and split by "/", so function crash...
return
input
.
pvalues
[
i
]
}
}
...
...
vendor/github.com/astaxie/beego/go.mod
查看文件 @
ec1d9e6
...
...
@@ -2,37 +2,35 @@ module github.com/astaxie/beego
require (
github.com/Knetic/govaluate v3.0.0+incompatible // indirect
github.com/OwnLocal/goes v1.0.0
github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd
github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542
github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737
github.com/casbin/casbin v1.7.0
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58
github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb
github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c // indirect
github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d
github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808 // indirect
github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a // indirect
github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76 // indirect
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 // indirect
github.com/elastic/go-elasticsearch/v6 v6.8.5
github.com/elazarl/go-bindata-assetfs v1.0.0
github.com/go-redis/redis v6.14.2+incompatible
github.com/go-sql-driver/mysql v1.
4.1
github.com/go-sql-driver/mysql v1.
5.0
github.com/gogo/protobuf v1.1.1
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect
github.com/gomodule/redigo v2.0.0+incompatible
github.com/hashicorp/golang-lru v0.5.4
github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6
github.com/lib/pq v1.0.0
github.com/mattn/go-sqlite3 v
1.10.0
github.com/mattn/go-sqlite3 v
2.0.3+incompatible
github.com/pelletier/go-toml v1.2.0 // indirect
github.com/p
kg/errors v0.8.0 // indirect
github.com/p
rometheus/client_golang v1.7.0
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644
github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 // indirect
github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373
github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d // indirect
github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec
github.com/stretchr/testify v1.4.0
github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c // indirect
github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b // indirect
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
golang.org/x/tools v0.0.0-20200117065230-39095c1d176c
gopkg.in/yaml.v2 v2.2.
1
gopkg.in/yaml.v2 v2.2.
8
)
replace golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 => github.com/golang/crypto v0.0.0-20181127143415-eb0de9b17e85
...
...
vendor/github.com/astaxie/beego/grace/server.go
查看文件 @
ec1d9e6
...
...
@@ -46,7 +46,10 @@ func (srv *Server) Serve() (err error) {
log
.
Println
(
syscall
.
Getpid
(),
srv
.
ln
.
Addr
(),
"Listener closed."
)
// wait for Shutdown to return
return
<-
srv
.
terminalChan
if
shutdownErr
:=
<-
srv
.
terminalChan
;
shutdownErr
!=
nil
{
return
shutdownErr
}
return
}
// ListenAndServe listens on the TCP network address srv.Addr and then calls Serve
...
...
@@ -180,7 +183,7 @@ func (srv *Server) ListenAndServeMutualTLS(certFile, keyFile, trustFile string)
log
.
Println
(
err
)
return
err
}
err
=
process
.
Kill
(
)
err
=
process
.
Signal
(
syscall
.
SIGTERM
)
if
err
!=
nil
{
return
err
}
...
...
vendor/github.com/astaxie/beego/httplib/README.md
0 → 100644
查看文件 @
ec1d9e6
# httplib
httplib is an libs help you to curl remote url.
# How to use?
## GET
you can use Get to crawl data.
import "github.com/astaxie/beego/httplib"
str, err := httplib.Get("http://beego.me/").String()
if err != nil {
// error
}
fmt.Println(str)
## POST
POST data to remote url
req := httplib.Post("http://beego.me/")
req.Param("username","astaxie")
req.Param("password","123456")
str, err := req.String()
if err != nil {
// error
}
fmt.Println(str)
## Set timeout
The default timeout is
`60`
seconds, function prototype:
SetTimeout(connectTimeout, readWriteTimeout time.Duration)
Example:
// GET
httplib.Get("http://beego.me/").SetTimeout(100 * time.Second, 30 * time.Second)
// POST
httplib.Post("http://beego.me/").SetTimeout(100 * time.Second, 30 * time.Second)
## Debug
If you want to debug the request info, set the debug on
httplib.Get("http://beego.me/").Debug(true)
## Set HTTP Basic Auth
str, err := Get("http://beego.me/").SetBasicAuth("user", "passwd").String()
if err != nil {
// error
}
fmt.Println(str)
## Set HTTPS
If request url is https, You can set the client support TSL:
httplib.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
More info about the
`tls.Config`
please visit http://golang.org/pkg/crypto/tls/#Config
## Set HTTP Version
some servers need to specify the protocol version of HTTP
httplib.Get("http://beego.me/").SetProtocolVersion("HTTP/1.1")
## Set Cookie
some http request need setcookie. So set it like this:
cookie := &http.Cookie{}
cookie.Name = "username"
cookie.Value = "astaxie"
httplib.Get("http://beego.me/").SetCookie(cookie)
## Upload file
httplib support mutil file upload, use
`req.PostFile()`
req := httplib.Post("http://beego.me/")
req.Param("username","astaxie")
req.PostFile("uploadfile1", "httplib.pdf")
str, err := req.String()
if err != nil {
// error
}
fmt.Println(str)
See godoc for further documentation and examples.
*
[
godoc.org/github.com/astaxie/beego/httplib
](
https://godoc.org/github.com/astaxie/beego/httplib
)
...
...
vendor/github.com/astaxie/beego/httplib/httplib.go
0 → 100644
查看文件 @
ec1d9e6
// Copyright 2014 beego Author. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// 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 httplib is used as http.Client
// Usage:
//
// import "github.com/astaxie/beego/httplib"
//
// b := httplib.Post("http://beego.me/")
// b.Param("username","astaxie")
// b.Param("password","123456")
// b.PostFile("uploadfile1", "httplib.pdf")
// b.PostFile("uploadfile2", "httplib.txt")
// str, err := b.String()
// if err != nil {
// t.Fatal(err)
// }
// fmt.Println(str)
//
// more docs http://beego.me/docs/module/httplib.md
package
httplib
import
(
"bytes"
"compress/gzip"
"crypto/tls"
"encoding/json"
"encoding/xml"
"io"
"io/ioutil"
"log"
"mime/multipart"
"net"
"net/http"
"net/http/cookiejar"
"net/http/httputil"
"net/url"
"os"
"path"
"strings"
"sync"
"time"
"gopkg.in/yaml.v2"
)
var
defaultSetting
=
BeegoHTTPSettings
{
UserAgent
:
"beegoServer"
,
ConnectTimeout
:
60
*
time
.
Second
,
ReadWriteTimeout
:
60
*
time
.
Second
,
Gzip
:
true
,
DumpBody
:
true
,
}
var
defaultCookieJar
http
.
CookieJar
var
settingMutex
sync
.
Mutex
// createDefaultCookie creates a global cookiejar to store cookies.
func
createDefaultCookie
()
{
settingMutex
.
Lock
()
defer
settingMutex
.
Unlock
()
defaultCookieJar
,
_
=
cookiejar
.
New
(
nil
)
}
// SetDefaultSetting Overwrite default settings
func
SetDefaultSetting
(
setting
BeegoHTTPSettings
)
{
settingMutex
.
Lock
()
defer
settingMutex
.
Unlock
()
defaultSetting
=
setting
}
// NewBeegoRequest return *BeegoHttpRequest with specific method
func
NewBeegoRequest
(
rawurl
,
method
string
)
*
BeegoHTTPRequest
{
var
resp
http
.
Response
u
,
err
:=
url
.
Parse
(
rawurl
)
if
err
!=
nil
{
log
.
Println
(
"Httplib:"
,
err
)
}
req
:=
http
.
Request
{
URL
:
u
,
Method
:
method
,
Header
:
make
(
http
.
Header
),
Proto
:
"HTTP/1.1"
,
ProtoMajor
:
1
,
ProtoMinor
:
1
,
}
return
&
BeegoHTTPRequest
{
url
:
rawurl
,
req
:
&
req
,
params
:
map
[
string
][]
string
{},
files
:
map
[
string
]
string
{},
setting
:
defaultSetting
,
resp
:
&
resp
,
}
}
// Get returns *BeegoHttpRequest with GET method.
func
Get
(
url
string
)
*
BeegoHTTPRequest
{
return
NewBeegoRequest
(
url
,
"GET"
)
}
// Post returns *BeegoHttpRequest with POST method.
func
Post
(
url
string
)
*
BeegoHTTPRequest
{
return
NewBeegoRequest
(
url
,
"POST"
)
}
// Put returns *BeegoHttpRequest with PUT method.
func
Put
(
url
string
)
*
BeegoHTTPRequest
{
return
NewBeegoRequest
(
url
,
"PUT"
)
}
// Delete returns *BeegoHttpRequest DELETE method.
func
Delete
(
url
string
)
*
BeegoHTTPRequest
{
return
NewBeegoRequest
(
url
,
"DELETE"
)
}
// Head returns *BeegoHttpRequest with HEAD method.
func
Head
(
url
string
)
*
BeegoHTTPRequest
{
return
NewBeegoRequest
(
url
,
"HEAD"
)
}
// BeegoHTTPSettings is the http.Client setting
type
BeegoHTTPSettings
struct
{
ShowDebug
bool
UserAgent
string
ConnectTimeout
time
.
Duration
ReadWriteTimeout
time
.
Duration
TLSClientConfig
*
tls
.
Config
Proxy
func
(
*
http
.
Request
)
(
*
url
.
URL
,
error
)
Transport
http
.
RoundTripper
CheckRedirect
func
(
req
*
http
.
Request
,
via
[]
*
http
.
Request
)
error
EnableCookie
bool
Gzip
bool
DumpBody
bool
Retries
int
// if set to -1 means will retry forever
}
// BeegoHTTPRequest provides more useful methods for requesting one url than http.Request.
type
BeegoHTTPRequest
struct
{
url
string
req
*
http
.
Request
params
map
[
string
][]
string
files
map
[
string
]
string
setting
BeegoHTTPSettings
resp
*
http
.
Response
body
[]
byte
dump
[]
byte
}
// GetRequest return the request object
func
(
b
*
BeegoHTTPRequest
)
GetRequest
()
*
http
.
Request
{
return
b
.
req
}
// Setting Change request settings
func
(
b
*
BeegoHTTPRequest
)
Setting
(
setting
BeegoHTTPSettings
)
*
BeegoHTTPRequest
{
b
.
setting
=
setting
return
b
}
// SetBasicAuth sets the request's Authorization header to use HTTP Basic Authentication with the provided username and password.
func
(
b
*
BeegoHTTPRequest
)
SetBasicAuth
(
username
,
password
string
)
*
BeegoHTTPRequest
{
b
.
req
.
SetBasicAuth
(
username
,
password
)
return
b
}
// SetEnableCookie sets enable/disable cookiejar
func
(
b
*
BeegoHTTPRequest
)
SetEnableCookie
(
enable
bool
)
*
BeegoHTTPRequest
{
b
.
setting
.
EnableCookie
=
enable
return
b
}
// SetUserAgent sets User-Agent header field
func
(
b
*
BeegoHTTPRequest
)
SetUserAgent
(
useragent
string
)
*
BeegoHTTPRequest
{
b
.
setting
.
UserAgent
=
useragent
return
b
}
// Debug sets show debug or not when executing request.
func
(
b
*
BeegoHTTPRequest
)
Debug
(
isdebug
bool
)
*
BeegoHTTPRequest
{
b
.
setting
.
ShowDebug
=
isdebug
return
b
}
// Retries sets Retries times.
// default is 0 means no retried.
// -1 means retried forever.
// others means retried times.
func
(
b
*
BeegoHTTPRequest
)
Retries
(
times
int
)
*
BeegoHTTPRequest
{
b
.
setting
.
Retries
=
times
return
b
}
// DumpBody setting whether need to Dump the Body.
func
(
b
*
BeegoHTTPRequest
)
DumpBody
(
isdump
bool
)
*
BeegoHTTPRequest
{
b
.
setting
.
DumpBody
=
isdump
return
b
}
// DumpRequest return the DumpRequest
func
(
b
*
BeegoHTTPRequest
)
DumpRequest
()
[]
byte
{
return
b
.
dump
}
// SetTimeout sets connect time out and read-write time out for BeegoRequest.
func
(
b
*
BeegoHTTPRequest
)
SetTimeout
(
connectTimeout
,
readWriteTimeout
time
.
Duration
)
*
BeegoHTTPRequest
{
b
.
setting
.
ConnectTimeout
=
connectTimeout
b
.
setting
.
ReadWriteTimeout
=
readWriteTimeout
return
b
}
// SetTLSClientConfig sets tls connection configurations if visiting https url.
func
(
b
*
BeegoHTTPRequest
)
SetTLSClientConfig
(
config
*
tls
.
Config
)
*
BeegoHTTPRequest
{
b
.
setting
.
TLSClientConfig
=
config
return
b
}
// Header add header item string in request.
func
(
b
*
BeegoHTTPRequest
)
Header
(
key
,
value
string
)
*
BeegoHTTPRequest
{
b
.
req
.
Header
.
Set
(
key
,
value
)
return
b
}
// SetHost set the request host
func
(
b
*
BeegoHTTPRequest
)
SetHost
(
host
string
)
*
BeegoHTTPRequest
{
b
.
req
.
Host
=
host
return
b
}
// SetProtocolVersion Set the protocol version for incoming requests.
// Client requests always use HTTP/1.1.
func
(
b
*
BeegoHTTPRequest
)
SetProtocolVersion
(
vers
string
)
*
BeegoHTTPRequest
{
if
len
(
vers
)
==
0
{
vers
=
"HTTP/1.1"
}
major
,
minor
,
ok
:=
http
.
ParseHTTPVersion
(
vers
)
if
ok
{
b
.
req
.
Proto
=
vers
b
.
req
.
ProtoMajor
=
major
b
.
req
.
ProtoMinor
=
minor
}
return
b
}
// SetCookie add cookie into request.
func
(
b
*
BeegoHTTPRequest
)
SetCookie
(
cookie
*
http
.
Cookie
)
*
BeegoHTTPRequest
{
b
.
req
.
Header
.
Add
(
"Cookie"
,
cookie
.
String
())
return
b
}
// SetTransport set the setting transport
func
(
b
*
BeegoHTTPRequest
)
SetTransport
(
transport
http
.
RoundTripper
)
*
BeegoHTTPRequest
{
b
.
setting
.
Transport
=
transport
return
b
}
// SetProxy set the http proxy
// example:
//
// func(req *http.Request) (*url.URL, error) {
// u, _ := url.ParseRequestURI("http://127.0.0.1:8118")
// return u, nil
// }
func
(
b
*
BeegoHTTPRequest
)
SetProxy
(
proxy
func
(
*
http
.
Request
)
(
*
url
.
URL
,
error
))
*
BeegoHTTPRequest
{
b
.
setting
.
Proxy
=
proxy
return
b
}
// SetCheckRedirect specifies the policy for handling redirects.
//
// If CheckRedirect is nil, the Client uses its default policy,
// which is to stop after 10 consecutive requests.
func
(
b
*
BeegoHTTPRequest
)
SetCheckRedirect
(
redirect
func
(
req
*
http
.
Request
,
via
[]
*
http
.
Request
)
error
)
*
BeegoHTTPRequest
{
b
.
setting
.
CheckRedirect
=
redirect
return
b
}
// Param adds query param in to request.
// params build query string as ?key1=value1&key2=value2...
func
(
b
*
BeegoHTTPRequest
)
Param
(
key
,
value
string
)
*
BeegoHTTPRequest
{
if
param
,
ok
:=
b
.
params
[
key
];
ok
{
b
.
params
[
key
]
=
append
(
param
,
value
)
}
else
{
b
.
params
[
key
]
=
[]
string
{
value
}
}
return
b
}
// PostFile add a post file to the request
func
(
b
*
BeegoHTTPRequest
)
PostFile
(
formname
,
filename
string
)
*
BeegoHTTPRequest
{
b
.
files
[
formname
]
=
filename
return
b
}
// Body adds request raw body.
// it supports string and []byte.
func
(
b
*
BeegoHTTPRequest
)
Body
(
data
interface
{})
*
BeegoHTTPRequest
{
switch
t
:=
data
.
(
type
)
{
case
string
:
bf
:=
bytes
.
NewBufferString
(
t
)
b
.
req
.
Body
=
ioutil
.
NopCloser
(
bf
)
b
.
req
.
ContentLength
=
int64
(
len
(
t
))
case
[]
byte
:
bf
:=
bytes
.
NewBuffer
(
t
)
b
.
req
.
Body
=
ioutil
.
NopCloser
(
bf
)
b
.
req
.
ContentLength
=
int64
(
len
(
t
))
}
return
b
}
// XMLBody adds request raw body encoding by XML.
func
(
b
*
BeegoHTTPRequest
)
XMLBody
(
obj
interface
{})
(
*
BeegoHTTPRequest
,
error
)
{
if
b
.
req
.
Body
==
nil
&&
obj
!=
nil
{
byts
,
err
:=
xml
.
Marshal
(
obj
)
if
err
!=
nil
{
return
b
,
err
}
b
.
req
.
Body
=
ioutil
.
NopCloser
(
bytes
.
NewReader
(
byts
))
b
.
req
.
ContentLength
=
int64
(
len
(
byts
))
b
.
req
.
Header
.
Set
(
"Content-Type"
,
"application/xml"
)
}
return
b
,
nil
}
// YAMLBody adds request raw body encoding by YAML.
func
(
b
*
BeegoHTTPRequest
)
YAMLBody
(
obj
interface
{})
(
*
BeegoHTTPRequest
,
error
)
{
if
b
.
req
.
Body
==
nil
&&
obj
!=
nil
{
byts
,
err
:=
yaml
.
Marshal
(
obj
)
if
err
!=
nil
{
return
b
,
err
}
b
.
req
.
Body
=
ioutil
.
NopCloser
(
bytes
.
NewReader
(
byts
))
b
.
req
.
ContentLength
=
int64
(
len
(
byts
))
b
.
req
.
Header
.
Set
(
"Content-Type"
,
"application/x+yaml"
)
}
return
b
,
nil
}
// JSONBody adds request raw body encoding by JSON.
func
(
b
*
BeegoHTTPRequest
)
JSONBody
(
obj
interface
{})
(
*
BeegoHTTPRequest
,
error
)
{
if
b
.
req
.
Body
==
nil
&&
obj
!=
nil
{
byts
,
err
:=
json
.
Marshal
(
obj
)
if
err
!=
nil
{
return
b
,
err
}
b
.
req
.
Body
=
ioutil
.
NopCloser
(
bytes
.
NewReader
(
byts
))
b
.
req
.
ContentLength
=
int64
(
len
(
byts
))
b
.
req
.
Header
.
Set
(
"Content-Type"
,
"application/json"
)
}
return
b
,
nil
}
func
(
b
*
BeegoHTTPRequest
)
buildURL
(
paramBody
string
)
{
// build GET url with query string
if
b
.
req
.
Method
==
"GET"
&&
len
(
paramBody
)
>
0
{
if
strings
.
Contains
(
b
.
url
,
"?"
)
{
b
.
url
+=
"&"
+
paramBody
}
else
{
b
.
url
=
b
.
url
+
"?"
+
paramBody
}
return
}
// build POST/PUT/PATCH url and body
if
(
b
.
req
.
Method
==
"POST"
||
b
.
req
.
Method
==
"PUT"
||
b
.
req
.
Method
==
"PATCH"
||
b
.
req
.
Method
==
"DELETE"
)
&&
b
.
req
.
Body
==
nil
{
// with files
if
len
(
b
.
files
)
>
0
{
pr
,
pw
:=
io
.
Pipe
()
bodyWriter
:=
multipart
.
NewWriter
(
pw
)
go
func
()
{
for
formname
,
filename
:=
range
b
.
files
{
fileWriter
,
err
:=
bodyWriter
.
CreateFormFile
(
formname
,
filename
)
if
err
!=
nil
{
log
.
Println
(
"Httplib:"
,
err
)
}
fh
,
err
:=
os
.
Open
(
filename
)
if
err
!=
nil
{
log
.
Println
(
"Httplib:"
,
err
)
}
//iocopy
_
,
err
=
io
.
Copy
(
fileWriter
,
fh
)
fh
.
Close
()
if
err
!=
nil
{
log
.
Println
(
"Httplib:"
,
err
)
}
}
for
k
,
v
:=
range
b
.
params
{
for
_
,
vv
:=
range
v
{
bodyWriter
.
WriteField
(
k
,
vv
)
}
}
bodyWriter
.
Close
()
pw
.
Close
()
}()
b
.
Header
(
"Content-Type"
,
bodyWriter
.
FormDataContentType
())
b
.
req
.
Body
=
ioutil
.
NopCloser
(
pr
)
b
.
Header
(
"Transfer-Encoding"
,
"chunked"
)
return
}
// with params
if
len
(
paramBody
)
>
0
{
b
.
Header
(
"Content-Type"
,
"application/x-www-form-urlencoded"
)
b
.
Body
(
paramBody
)
}
}
}
func
(
b
*
BeegoHTTPRequest
)
getResponse
()
(
*
http
.
Response
,
error
)
{
if
b
.
resp
.
StatusCode
!=
0
{
return
b
.
resp
,
nil
}
resp
,
err
:=
b
.
DoRequest
()
if
err
!=
nil
{
return
nil
,
err
}
b
.
resp
=
resp
return
resp
,
nil
}
// DoRequest will do the client.Do
func
(
b
*
BeegoHTTPRequest
)
DoRequest
()
(
resp
*
http
.
Response
,
err
error
)
{
var
paramBody
string
if
len
(
b
.
params
)
>
0
{
var
buf
bytes
.
Buffer
for
k
,
v
:=
range
b
.
params
{
for
_
,
vv
:=
range
v
{
buf
.
WriteString
(
url
.
QueryEscape
(
k
))
buf
.
WriteByte
(
'='
)
buf
.
WriteString
(
url
.
QueryEscape
(
vv
))
buf
.
WriteByte
(
'&'
)
}
}
paramBody
=
buf
.
String
()
paramBody
=
paramBody
[
0
:
len
(
paramBody
)
-
1
]
}
b
.
buildURL
(
paramBody
)
urlParsed
,
err
:=
url
.
Parse
(
b
.
url
)
if
err
!=
nil
{
return
nil
,
err
}
b
.
req
.
URL
=
urlParsed
trans
:=
b
.
setting
.
Transport
if
trans
==
nil
{
// create default transport
trans
=
&
http
.
Transport
{
TLSClientConfig
:
b
.
setting
.
TLSClientConfig
,
Proxy
:
b
.
setting
.
Proxy
,
Dial
:
TimeoutDialer
(
b
.
setting
.
ConnectTimeout
,
b
.
setting
.
ReadWriteTimeout
),
MaxIdleConnsPerHost
:
100
,
}
}
else
{
// if b.transport is *http.Transport then set the settings.
if
t
,
ok
:=
trans
.
(
*
http
.
Transport
);
ok
{
if
t
.
TLSClientConfig
==
nil
{
t
.
TLSClientConfig
=
b
.
setting
.
TLSClientConfig
}
if
t
.
Proxy
==
nil
{
t
.
Proxy
=
b
.
setting
.
Proxy
}
if
t
.
Dial
==
nil
{
t
.
Dial
=
TimeoutDialer
(
b
.
setting
.
ConnectTimeout
,
b
.
setting
.
ReadWriteTimeout
)
}
}
}
var
jar
http
.
CookieJar
if
b
.
setting
.
EnableCookie
{
if
defaultCookieJar
==
nil
{
createDefaultCookie
()
}
jar
=
defaultCookieJar
}
client
:=
&
http
.
Client
{
Transport
:
trans
,
Jar
:
jar
,
}
if
b
.
setting
.
UserAgent
!=
""
&&
b
.
req
.
Header
.
Get
(
"User-Agent"
)
==
""
{
b
.
req
.
Header
.
Set
(
"User-Agent"
,
b
.
setting
.
UserAgent
)
}
if
b
.
setting
.
CheckRedirect
!=
nil
{
client
.
CheckRedirect
=
b
.
setting
.
CheckRedirect
}
if
b
.
setting
.
ShowDebug
{
dump
,
err
:=
httputil
.
DumpRequest
(
b
.
req
,
b
.
setting
.
DumpBody
)
if
err
!=
nil
{
log
.
Println
(
err
.
Error
())
}
b
.
dump
=
dump
}
// retries default value is 0, it will run once.
// retries equal to -1, it will run forever until success
// retries is setted, it will retries fixed times.
for
i
:=
0
;
b
.
setting
.
Retries
==
-
1
||
i
<=
b
.
setting
.
Retries
;
i
++
{
resp
,
err
=
client
.
Do
(
b
.
req
)
if
err
==
nil
{
break
}
}
return
resp
,
err
}
// String returns the body string in response.
// it calls Response inner.
func
(
b
*
BeegoHTTPRequest
)
String
()
(
string
,
error
)
{
data
,
err
:=
b
.
Bytes
()
if
err
!=
nil
{
return
""
,
err
}
return
string
(
data
),
nil
}
// Bytes returns the body []byte in response.
// it calls Response inner.
func
(
b
*
BeegoHTTPRequest
)
Bytes
()
([]
byte
,
error
)
{
if
b
.
body
!=
nil
{
return
b
.
body
,
nil
}
resp
,
err
:=
b
.
getResponse
()
if
err
!=
nil
{
return
nil
,
err
}
if
resp
.
Body
==
nil
{
return
nil
,
nil
}
defer
resp
.
Body
.
Close
()
if
b
.
setting
.
Gzip
&&
resp
.
Header
.
Get
(
"Content-Encoding"
)
==
"gzip"
{
reader
,
err
:=
gzip
.
NewReader
(
resp
.
Body
)
if
err
!=
nil
{
return
nil
,
err
}
b
.
body
,
err
=
ioutil
.
ReadAll
(
reader
)
return
b
.
body
,
err
}
b
.
body
,
err
=
ioutil
.
ReadAll
(
resp
.
Body
)
return
b
.
body
,
err
}
// ToFile saves the body data in response to one file.
// it calls Response inner.
func
(
b
*
BeegoHTTPRequest
)
ToFile
(
filename
string
)
error
{
resp
,
err
:=
b
.
getResponse
()
if
err
!=
nil
{
return
err
}
if
resp
.
Body
==
nil
{
return
nil
}
defer
resp
.
Body
.
Close
()
err
=
pathExistAndMkdir
(
filename
)
if
err
!=
nil
{
return
err
}
f
,
err
:=
os
.
Create
(
filename
)
if
err
!=
nil
{
return
err
}
defer
f
.
Close
()
_
,
err
=
io
.
Copy
(
f
,
resp
.
Body
)
return
err
}
//Check that the file directory exists, there is no automatically created
func
pathExistAndMkdir
(
filename
string
)
(
err
error
)
{
filename
=
path
.
Dir
(
filename
)
_
,
err
=
os
.
Stat
(
filename
)
if
err
==
nil
{
return
nil
}
if
os
.
IsNotExist
(
err
)
{
err
=
os
.
MkdirAll
(
filename
,
os
.
ModePerm
)
if
err
==
nil
{
return
nil
}
}
return
err
}
// ToJSON returns the map that marshals from the body bytes as json in response .
// it calls Response inner.
func
(
b
*
BeegoHTTPRequest
)
ToJSON
(
v
interface
{})
error
{
data
,
err
:=
b
.
Bytes
()
if
err
!=
nil
{
return
err
}
return
json
.
Unmarshal
(
data
,
v
)
}
// ToXML returns the map that marshals from the body bytes as xml in response .
// it calls Response inner.
func
(
b
*
BeegoHTTPRequest
)
ToXML
(
v
interface
{})
error
{
data
,
err
:=
b
.
Bytes
()
if
err
!=
nil
{
return
err
}
return
xml
.
Unmarshal
(
data
,
v
)
}
// ToYAML returns the map that marshals from the body bytes as yaml in response .
// it calls Response inner.
func
(
b
*
BeegoHTTPRequest
)
ToYAML
(
v
interface
{})
error
{
data
,
err
:=
b
.
Bytes
()
if
err
!=
nil
{
return
err
}
return
yaml
.
Unmarshal
(
data
,
v
)
}
// Response executes request client gets response mannually.
func
(
b
*
BeegoHTTPRequest
)
Response
()
(
*
http
.
Response
,
error
)
{
return
b
.
getResponse
()
}
// TimeoutDialer returns functions of connection dialer with timeout settings for http.Transport Dial field.
func
TimeoutDialer
(
cTimeout
time
.
Duration
,
rwTimeout
time
.
Duration
)
func
(
net
,
addr
string
)
(
c
net
.
Conn
,
err
error
)
{
return
func
(
netw
,
addr
string
)
(
net
.
Conn
,
error
)
{
conn
,
err
:=
net
.
DialTimeout
(
netw
,
addr
,
cTimeout
)
if
err
!=
nil
{
return
nil
,
err
}
err
=
conn
.
SetDeadline
(
time
.
Now
()
.
Add
(
rwTimeout
))
return
conn
,
err
}
}
...
...
vendor/github.com/astaxie/beego/logs/file.go
查看文件 @
ec1d9e6
...
...
@@ -359,6 +359,10 @@ RESTART_LOGGER:
func
(
w
*
fileLogWriter
)
deleteOldLog
()
{
dir
:=
filepath
.
Dir
(
w
.
Filename
)
absolutePath
,
err
:=
filepath
.
EvalSymlinks
(
w
.
Filename
)
if
err
==
nil
{
dir
=
filepath
.
Dir
(
absolutePath
)
}
filepath
.
Walk
(
dir
,
func
(
path
string
,
info
os
.
FileInfo
,
err
error
)
(
returnErr
error
)
{
defer
func
()
{
if
r
:=
recover
();
r
!=
nil
{
...
...
vendor/github.com/astaxie/beego/logs/log.go
查看文件 @
ec1d9e6
...
...
@@ -295,7 +295,11 @@ func (bl *BeeLogger) writeMsg(logLevel int, msg string, v ...interface{}) error
lm
.
level
=
logLevel
lm
.
msg
=
msg
lm
.
when
=
when
bl
.
msgChan
<-
lm
if
bl
.
outputs
!=
nil
{
bl
.
msgChan
<-
lm
}
else
{
logMsgPool
.
Put
(
lm
)
}
}
else
{
bl
.
writeToLoggers
(
when
,
msg
,
logLevel
)
}
...
...
vendor/github.com/astaxie/beego/parser.go
查看文件 @
ec1d9e6
...
...
@@ -500,7 +500,7 @@ func genRouterCode(pkgRealpath string) {
beego.GlobalControllerRouter["`
+
k
+
`"] = append(beego.GlobalControllerRouter["`
+
k
+
`"],
beego.ControllerComments{
Method: "`
+
strings
.
TrimSpace
(
c
.
Method
)
+
`",
`
+
"Router: `"
+
c
.
Router
+
"`"
+
`,
`
+
`Router: "`
+
c
.
Router
+
`"`
+
`,
AllowHTTPMethods: `
+
allmethod
+
`,
MethodParams: `
+
methodParams
+
`,
Filters: `
+
filters
+
`,
...
...
vendor/github.com/astaxie/beego/router.go
查看文件 @
ec1d9e6
...
...
@@ -18,6 +18,7 @@ import (
"errors"
"fmt"
"net/http"
"os"
"path"
"path/filepath"
"reflect"
...
...
@@ -121,6 +122,10 @@ type ControllerInfo struct {
methodParams
[]
*
param
.
MethodParam
}
func
(
c
*
ControllerInfo
)
GetPattern
()
string
{
return
c
.
pattern
}
// ControllerRegister containers registered router rules, controller handlers and filters.
type
ControllerRegister
struct
{
routers
map
[
string
]
*
Tree
...
...
@@ -249,25 +254,39 @@ func (p *ControllerRegister) addToRouter(method, pattern string, r *ControllerIn
func
(
p
*
ControllerRegister
)
Include
(
cList
...
ControllerInterface
)
{
if
BConfig
.
RunMode
==
DEV
{
skip
:=
make
(
map
[
string
]
bool
,
10
)
wgopath
:=
utils
.
GetGOPATHs
()
go111module
:=
os
.
Getenv
(
`GO111MODULE`
)
for
_
,
c
:=
range
cList
{
reflectVal
:=
reflect
.
ValueOf
(
c
)
t
:=
reflect
.
Indirect
(
reflectVal
)
.
Type
()
wgopath
:=
utils
.
GetGOPATHs
()
if
len
(
wgopath
)
==
0
{
panic
(
"you are in dev mode. So please set gopath"
)
}
pkgpath
:=
""
for
_
,
wg
:=
range
wgopath
{
wg
,
_
=
filepath
.
EvalSymlinks
(
filepath
.
Join
(
wg
,
"src"
,
t
.
PkgPath
()))
if
utils
.
FileExists
(
wg
)
{
pkgpath
=
wg
break
// for go modules
if
go111module
==
`on`
{
pkgpath
:=
filepath
.
Join
(
WorkPath
,
".."
,
t
.
PkgPath
())
if
utils
.
FileExists
(
pkgpath
)
{
if
pkgpath
!=
""
{
if
_
,
ok
:=
skip
[
pkgpath
];
!
ok
{
skip
[
pkgpath
]
=
true
parserPkg
(
pkgpath
,
t
.
PkgPath
())
}
}
}
}
if
pkgpath
!=
""
{
if
_
,
ok
:=
skip
[
pkgpath
];
!
ok
{
skip
[
pkgpath
]
=
true
parserPkg
(
pkgpath
,
t
.
PkgPath
())
}
else
{
if
len
(
wgopath
)
==
0
{
panic
(
"you are in dev mode. So please set gopath"
)
}
pkgpath
:=
""
for
_
,
wg
:=
range
wgopath
{
wg
,
_
=
filepath
.
EvalSymlinks
(
filepath
.
Join
(
wg
,
"src"
,
t
.
PkgPath
()))
if
utils
.
FileExists
(
wg
)
{
pkgpath
=
wg
break
}
}
if
pkgpath
!=
""
{
if
_
,
ok
:=
skip
[
pkgpath
];
!
ok
{
skip
[
pkgpath
]
=
true
parserPkg
(
pkgpath
,
t
.
PkgPath
())
}
}
}
}
...
...
@@ -288,6 +307,21 @@ func (p *ControllerRegister) Include(cList ...ControllerInterface) {
}
}
// GetContext returns a context from pool, so usually you should remember to call Reset function to clean the context
// And don't forget to give back context to pool
// example:
// ctx := p.GetContext()
// ctx.Reset(w, q)
// defer p.GiveBackContext(ctx)
func
(
p
*
ControllerRegister
)
GetContext
()
*
beecontext
.
Context
{
return
p
.
pool
.
Get
()
.
(
*
beecontext
.
Context
)
}
// GiveBackContext put the ctx into pool so that it could be reuse
func
(
p
*
ControllerRegister
)
GiveBackContext
(
ctx
*
beecontext
.
Context
)
{
p
.
pool
.
Put
(
ctx
)
}
// Get add get method
// usage:
// Get("/", func(ctx *context.Context){
...
...
@@ -667,10 +701,11 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
routerInfo
*
ControllerInfo
isRunnable
bool
)
context
:=
p
.
pool
.
Get
()
.
(
*
beecontext
.
Context
)
context
:=
p
.
GetContext
()
context
.
Reset
(
rw
,
r
)
defer
p
.
pool
.
Pu
t
(
context
)
defer
p
.
GiveBackContex
t
(
context
)
if
BConfig
.
RecoverFunc
!=
nil
{
defer
BConfig
.
RecoverFunc
(
context
)
}
...
...
@@ -739,7 +774,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
routerInfo
,
findRouter
=
p
.
FindRouter
(
context
)
}
//if no matches to url, throw a not found exception
//
if no matches to url, throw a not found exception
if
!
findRouter
{
exception
(
"404"
,
context
)
goto
Admin
...
...
@@ -750,19 +785,22 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
}
}
//execute middleware filters
if
routerInfo
!=
nil
{
// store router pattern into context
context
.
Input
.
SetData
(
"RouterPattern"
,
routerInfo
.
pattern
)
}
// execute middleware filters
if
len
(
p
.
filters
[
BeforeExec
])
>
0
&&
p
.
execFilter
(
context
,
urlPath
,
BeforeExec
)
{
goto
Admin
}
//check policies
//
check policies
if
p
.
execPolicy
(
context
,
urlPath
)
{
goto
Admin
}
if
routerInfo
!=
nil
{
//store router pattern into context
context
.
Input
.
SetData
(
"RouterPattern"
,
routerInfo
.
pattern
)
if
routerInfo
.
routerType
==
routerTypeRESTFul
{
if
_
,
ok
:=
routerInfo
.
methods
[
r
.
Method
];
ok
{
isRunnable
=
true
...
...
@@ -796,7 +834,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
// also defined runRouter & runMethod from filter
if
!
isRunnable
{
//Invoke the request handler
//
Invoke the request handler
var
execController
ControllerInterface
if
routerInfo
!=
nil
&&
routerInfo
.
initialize
!=
nil
{
execController
=
routerInfo
.
initialize
()
...
...
@@ -809,13 +847,13 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
}
}
//call the controller init function
//
call the controller init function
execController
.
Init
(
context
,
runRouter
.
Name
(),
runMethod
,
execController
)
//call prepare function
//
call prepare function
execController
.
Prepare
()
//if XSRF is Enable then check cookie where there has any cookie in the request's cookie _csrf
//
if XSRF is Enable then check cookie where there has any cookie in the request's cookie _csrf
if
BConfig
.
WebConfig
.
EnableXSRF
{
execController
.
XSRFToken
()
if
r
.
Method
==
http
.
MethodPost
||
r
.
Method
==
http
.
MethodDelete
||
r
.
Method
==
http
.
MethodPut
||
...
...
@@ -827,7 +865,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
execController
.
URLMapping
()
if
!
context
.
ResponseWriter
.
Started
{
//exec main logic
//
exec main logic
switch
runMethod
{
case
http
.
MethodGet
:
execController
.
Get
()
...
...
@@ -852,14 +890,14 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
in
:=
param
.
ConvertParams
(
methodParams
,
method
.
Type
(),
context
)
out
:=
method
.
Call
(
in
)
//For backward compatibility we only handle response if we had incoming methodParams
//
For backward compatibility we only handle response if we had incoming methodParams
if
methodParams
!=
nil
{
p
.
handleParamResponse
(
context
,
execController
,
out
)
}
}
}
//render template
//
render template
if
!
context
.
ResponseWriter
.
Started
&&
context
.
Output
.
Status
==
0
{
if
BConfig
.
WebConfig
.
AutoRender
{
if
err
:=
execController
.
Render
();
err
!=
nil
{
...
...
@@ -873,7 +911,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
execController
.
Finish
()
}
//execute middleware filters
//
execute middleware filters
if
len
(
p
.
filters
[
AfterExec
])
>
0
&&
p
.
execFilter
(
context
,
urlPath
,
AfterExec
)
{
goto
Admin
}
...
...
@@ -883,7 +921,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
}
Admin
:
//admin module record QPS
//
admin module record QPS
statusCode
:=
context
.
ResponseWriter
.
Status
if
statusCode
==
0
{
...
...
@@ -931,7 +969,7 @@ Admin:
}
func
(
p
*
ControllerRegister
)
handleParamResponse
(
context
*
beecontext
.
Context
,
execController
ControllerInterface
,
results
[]
reflect
.
Value
)
{
//looping in reverse order for the case when both error and value are returned and error sets the response status code
//
looping in reverse order for the case when both error and value are returned and error sets the response status code
for
i
:=
len
(
results
)
-
1
;
i
>=
0
;
i
--
{
result
:=
results
[
i
]
if
result
.
Kind
()
!=
reflect
.
Interface
||
!
result
.
IsNil
()
{
...
...
@@ -973,11 +1011,11 @@ func toURL(params map[string]string) string {
// LogAccess logging info HTTP Access
func
LogAccess
(
ctx
*
beecontext
.
Context
,
startTime
*
time
.
Time
,
statusCode
int
)
{
//Skip logging if AccessLogs config is false
//
Skip logging if AccessLogs config is false
if
!
BConfig
.
Log
.
AccessLogs
{
return
}
//Skip logging static requests unless EnableStaticLogs config is true
//
Skip logging static requests unless EnableStaticLogs config is true
if
!
BConfig
.
Log
.
EnableStaticLogs
&&
DefaultAccessLogFilter
.
Filter
(
ctx
)
{
return
}
...
...
@@ -1002,7 +1040,7 @@ func LogAccess(ctx *beecontext.Context, startTime *time.Time, statusCode int) {
HTTPReferrer
:
r
.
Header
.
Get
(
"Referer"
),
HTTPUserAgent
:
r
.
Header
.
Get
(
"User-Agent"
),
RemoteUser
:
r
.
Header
.
Get
(
"Remote-User"
),
BodyBytesSent
:
0
,
//@todo this one is missing!
BodyBytesSent
:
0
,
//
@todo this one is missing!
}
logs
.
AccessLog
(
record
,
BConfig
.
Log
.
AccessLogsFormat
)
}
...
...
vendor/github.com/astaxie/beego/session/sess_cookie.go
查看文件 @
ec1d9e6
...
...
@@ -74,7 +74,9 @@ func (st *CookieSessionStore) SessionID() string {
// SessionRelease Write cookie session to http response cookie
func
(
st
*
CookieSessionStore
)
SessionRelease
(
w
http
.
ResponseWriter
)
{
st
.
lock
.
Lock
()
encodedCookie
,
err
:=
encodeCookie
(
cookiepder
.
block
,
cookiepder
.
config
.
SecurityKey
,
cookiepder
.
config
.
SecurityName
,
st
.
values
)
st
.
lock
.
Unlock
()
if
err
==
nil
{
cookie
:=
&
http
.
Cookie
{
Name
:
cookiepder
.
config
.
CookieName
,
Value
:
url
.
QueryEscape
(
encodedCookie
),
...
...
vendor/github.com/astaxie/beego/session/sess_file.go
查看文件 @
ec1d9e6
...
...
@@ -129,8 +129,9 @@ func (fp *FileProvider) SessionInit(maxlifetime int64, savePath string) error {
// if file is not exist, create it.
// the file path is generated from sid string.
func
(
fp
*
FileProvider
)
SessionRead
(
sid
string
)
(
Store
,
error
)
{
if
strings
.
ContainsAny
(
sid
,
"./"
)
{
return
nil
,
nil
invalidChars
:=
"./"
if
strings
.
ContainsAny
(
sid
,
invalidChars
)
{
return
nil
,
errors
.
New
(
"the sid shouldn't have following characters: "
+
invalidChars
)
}
if
len
(
sid
)
<
2
{
return
nil
,
errors
.
New
(
"length of the sid is less than 2"
)
...
...
@@ -138,7 +139,7 @@ func (fp *FileProvider) SessionRead(sid string) (Store, error) {
filepder
.
lock
.
Lock
()
defer
filepder
.
lock
.
Unlock
()
err
:=
os
.
MkdirAll
(
path
.
Join
(
fp
.
savePath
,
string
(
sid
[
0
]),
string
(
sid
[
1
])),
07
77
)
err
:=
os
.
MkdirAll
(
path
.
Join
(
fp
.
savePath
,
string
(
sid
[
0
]),
string
(
sid
[
1
])),
07
55
)
if
err
!=
nil
{
SLogger
.
Println
(
err
.
Error
())
}
...
...
@@ -231,7 +232,7 @@ func (fp *FileProvider) SessionRegenerate(oldsid, sid string) (Store, error) {
return
nil
,
fmt
.
Errorf
(
"newsid %s exist"
,
newSidFile
)
}
err
=
os
.
MkdirAll
(
newPath
,
07
77
)
err
=
os
.
MkdirAll
(
newPath
,
07
55
)
if
err
!=
nil
{
SLogger
.
Println
(
err
.
Error
())
}
...
...
vendor/github.com/astaxie/beego/staticfile.go
查看文件 @
ec1d9e6
...
...
@@ -28,6 +28,7 @@ import (
"github.com/astaxie/beego/context"
"github.com/astaxie/beego/logs"
"github.com/hashicorp/golang-lru"
)
var
errNotStaticRequest
=
errors
.
New
(
"request not a static file request"
)
...
...
@@ -67,6 +68,10 @@ func serverStaticRouter(ctx *context.Context) {
http
.
ServeFile
(
ctx
.
ResponseWriter
,
ctx
.
Request
,
filePath
)
}
return
}
else
if
fileInfo
.
Size
()
>
int64
(
BConfig
.
WebConfig
.
StaticCacheFileSize
)
{
//over size file serve with http module
http
.
ServeFile
(
ctx
.
ResponseWriter
,
ctx
.
Request
,
filePath
)
return
}
var
enableCompress
=
BConfig
.
EnableGzip
&&
isStaticCompress
(
filePath
)
...
...
@@ -93,10 +98,11 @@ func serverStaticRouter(ctx *context.Context) {
}
type
serveContentHolder
struct
{
data
[]
byte
modTime
time
.
Time
size
int64
encoding
string
data
[]
byte
modTime
time
.
Time
size
int64
originSize
int64
//original file size:to judge file changed
encoding
string
}
type
serveContentReader
struct
{
...
...
@@ -104,22 +110,36 @@ type serveContentReader struct {
}
var
(
staticFileMap
=
make
(
map
[
string
]
*
serveContentHolder
)
mapLock
sync
.
RWMutex
staticFileLruCache
*
lru
.
Cache
lruLock
sync
.
RWMutex
)
func
openFile
(
filePath
string
,
fi
os
.
FileInfo
,
acceptEncoding
string
)
(
bool
,
string
,
*
serveContentHolder
,
*
serveContentReader
,
error
)
{
if
staticFileLruCache
==
nil
{
//avoid lru cache error
if
BConfig
.
WebConfig
.
StaticCacheFileNum
>=
1
{
staticFileLruCache
,
_
=
lru
.
New
(
BConfig
.
WebConfig
.
StaticCacheFileNum
)
}
else
{
staticFileLruCache
,
_
=
lru
.
New
(
1
)
}
}
mapKey
:=
acceptEncoding
+
":"
+
filePath
mapLock
.
RLock
()
mapFile
:=
staticFileMap
[
mapKey
]
mapLock
.
RUnlock
()
lruLock
.
RLock
()
var
mapFile
*
serveContentHolder
if
cacheItem
,
ok
:=
staticFileLruCache
.
Get
(
mapKey
);
ok
{
mapFile
=
cacheItem
.
(
*
serveContentHolder
)
}
lruLock
.
RUnlock
()
if
isOk
(
mapFile
,
fi
)
{
reader
:=
&
serveContentReader
{
Reader
:
bytes
.
NewReader
(
mapFile
.
data
)}
return
mapFile
.
encoding
!=
""
,
mapFile
.
encoding
,
mapFile
,
reader
,
nil
}
mapLock
.
Lock
()
defer
mapLock
.
Unlock
()
if
mapFile
=
staticFileMap
[
mapKey
];
!
isOk
(
mapFile
,
fi
)
{
lruLock
.
Lock
()
defer
lruLock
.
Unlock
()
if
cacheItem
,
ok
:=
staticFileLruCache
.
Get
(
mapKey
);
ok
{
mapFile
=
cacheItem
.
(
*
serveContentHolder
)
}
if
!
isOk
(
mapFile
,
fi
)
{
file
,
err
:=
os
.
Open
(
filePath
)
if
err
!=
nil
{
return
false
,
""
,
nil
,
nil
,
err
...
...
@@ -130,8 +150,10 @@ func openFile(filePath string, fi os.FileInfo, acceptEncoding string) (bool, str
if
err
!=
nil
{
return
false
,
""
,
nil
,
nil
,
err
}
mapFile
=
&
serveContentHolder
{
data
:
bufferWriter
.
Bytes
(),
modTime
:
fi
.
ModTime
(),
size
:
int64
(
bufferWriter
.
Len
()),
encoding
:
n
}
staticFileMap
[
mapKey
]
=
mapFile
mapFile
=
&
serveContentHolder
{
data
:
bufferWriter
.
Bytes
(),
modTime
:
fi
.
ModTime
(),
size
:
int64
(
bufferWriter
.
Len
()),
originSize
:
fi
.
Size
(),
encoding
:
n
}
if
isOk
(
mapFile
,
fi
)
{
staticFileLruCache
.
Add
(
mapKey
,
mapFile
)
}
}
reader
:=
&
serveContentReader
{
Reader
:
bytes
.
NewReader
(
mapFile
.
data
)}
...
...
@@ -141,8 +163,10 @@ func openFile(filePath string, fi os.FileInfo, acceptEncoding string) (bool, str
func
isOk
(
s
*
serveContentHolder
,
fi
os
.
FileInfo
)
bool
{
if
s
==
nil
{
return
false
}
else
if
s
.
size
>
int64
(
BConfig
.
WebConfig
.
StaticCacheFileSize
)
{
return
false
}
return
s
.
modTime
==
fi
.
ModTime
()
&&
s
.
s
ize
==
fi
.
Size
()
return
s
.
modTime
==
fi
.
ModTime
()
&&
s
.
originS
ize
==
fi
.
Size
()
}
// isStaticCompress detect static files
...
...
vendor/github.com/astaxie/beego/toolbox/statistics.go
查看文件 @
ec1d9e6
...
...
@@ -117,8 +117,8 @@ func (m *URLMap) GetMap() map[string]interface{} {
// GetMapData return all mapdata
func
(
m
*
URLMap
)
GetMapData
()
[]
map
[
string
]
interface
{}
{
m
.
lock
.
Lock
()
defer
m
.
lock
.
Unlock
()
m
.
lock
.
RLock
()
defer
m
.
lock
.
RUnlock
()
var
resultLists
[]
map
[
string
]
interface
{}
...
...
vendor/github.com/astaxie/beego/toolbox/task.go
查看文件 @
ec1d9e6
...
...
@@ -33,7 +33,7 @@ type bounds struct {
// The bounds for each field.
var
(
AdminTaskList
map
[
string
]
Tasker
taskLock
sync
.
Mutex
taskLock
sync
.
RW
Mutex
stop
chan
bool
changed
chan
bool
isstart
bool
...
...
@@ -408,7 +408,10 @@ func run() {
}
for
{
// we only use RLock here because NewMapSorter copy the reference, do not change any thing
taskLock
.
RLock
()
sortList
:=
NewMapSorter
(
AdminTaskList
)
taskLock
.
RUnlock
()
sortList
.
Sort
()
var
effective
time
.
Time
if
len
(
AdminTaskList
)
==
0
||
sortList
.
Vals
[
0
]
.
GetNext
()
.
IsZero
()
{
...
...
@@ -432,9 +435,11 @@ func run() {
continue
case
<-
changed
:
now
=
time
.
Now
()
.
Local
()
taskLock
.
Lock
()
for
_
,
t
:=
range
AdminTaskList
{
t
.
SetNext
(
now
)
}
taskLock
.
Unlock
()
continue
case
<-
stop
:
return
...
...
vendor/github.com/beorn7/perks/LICENSE
0 → 100644
查看文件 @
ec1d9e6
Copyright (C) 2013 Blake Mizerany
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
...
...
vendor/github.com/beorn7/perks/quantile/exampledata.txt
0 → 100644
查看文件 @
ec1d9e6
8
5
26
12
5
235
13
6
28
30
3
3
3
3
5
2
33
7
2
4
7
12
14
5
8
3
10
4
5
3
6
6
209
20
3
10
14
3
4
6
8
5
11
7
3
2
3
3
212
5
222
4
10
10
5
6
3
8
3
10
254
220
2
3
5
24
5
4
222
7
3
3
223
8
15
12
14
14
3
2
2
3
13
3
11
4
4
6
5
7
13
5
3
5
2
5
3
5
2
7
15
17
14
3
6
6
3
17
5
4
7
6
4
4
8
6
8
3
9
3
6
3
4
5
3
3
660
4
6
10
3
6
3
2
5
13
2
4
4
10
4
8
4
3
7
9
9
3
10
37
3
13
4
12
3
6
10
8
5
21
2
3
8
3
2
3
3
4
12
2
4
8
8
4
3
2
20
1
6
32
2
11
6
18
3
8
11
3
212
3
4
2
6
7
12
11
3
2
16
10
6
4
6
3
2
7
3
2
2
2
2
5
6
4
3
10
3
4
6
5
3
4
4
5
6
4
3
4
4
5
7
5
5
3
2
7
2
4
12
4
5
6
2
4
4
8
4
15
13
7
16
5
3
23
5
5
7
3
2
9
8
7
5
8
11
4
10
76
4
47
4
3
2
7
4
2
3
37
10
4
2
20
5
4
4
10
10
4
3
7
23
240
7
13
5
5
3
3
2
5
4
2
8
7
19
2
23
8
7
2
5
3
8
3
8
13
5
5
5
2
3
23
4
9
8
4
3
3
5
220
2
3
4
6
14
3
53
6
2
5
18
6
3
219
6
5
2
5
3
6
5
15
4
3
17
3
2
4
7
2
3
3
4
4
3
2
664
6
3
23
5
5
16
5
8
2
4
2
24
12
3
2
3
5
8
3
5
4
3
14
3
5
8
2
3
7
9
4
2
3
6
8
4
3
4
6
5
3
3
6
3
19
4
4
6
3
6
3
5
22
5
4
4
3
8
11
4
9
7
6
13
4
4
4
6
17
9
3
3
3
4
3
221
5
11
3
4
2
12
6
3
5
7
5
7
4
9
7
14
37
19
217
16
3
5
2
2
7
19
7
6
7
4
24
5
11
4
7
7
9
13
3
4
3
6
28
4
4
5
5
2
5
6
4
4
6
10
5
4
3
2
3
3
6
5
5
4
3
2
3
7
4
6
18
16
8
16
4
5
8
6
9
13
1545
6
215
6
5
6
3
45
31
5
2
2
4
3
3
2
5
4
3
5
7
7
4
5
8
5
4
749
2
31
9
11
2
11
5
4
4
7
9
11
4
5
4
7
3
4
6
2
15
3
4
3
4
3
5
2
13
5
5
3
3
23
4
4
5
7
4
13
2
4
3
4
2
6
2
7
3
5
5
3
29
5
4
4
3
10
2
3
79
16
6
6
7
7
3
5
5
7
4
3
7
9
5
6
5
9
6
3
6
4
17
2
10
9
3
6
2
3
21
22
5
11
4
2
17
2
224
2
14
3
4
4
2
4
4
4
4
5
3
4
4
10
2
6
3
3
5
7
2
7
5
6
3
218
2
2
5
2
6
3
5
222
14
6
33
3
2
5
3
3
3
9
5
3
3
2
7
4
3
4
3
5
6
5
26
4
13
9
7
3
221
3
3
4
4
4
4
2
18
5
3
7
9
6
8
3
10
3
11
9
5
4
17
5
5
6
6
3
2
4
12
17
6
7
218
4
2
4
10
3
5
15
3
9
4
3
3
6
29
3
3
4
5
5
3
8
5
6
6
7
5
3
5
3
29
2
31
5
15
24
16
5
207
4
3
3
2
15
4
4
13
5
5
4
6
10
2
7
8
4
6
20
5
3
4
3
12
12
5
17
7
3
3
3
6
10
3
5
25
80
4
9
3
2
11
3
3
2
3
8
7
5
5
19
5
3
3
12
11
2
6
5
5
5
3
3
3
4
209
14
3
2
5
19
4
4
3
4
14
5
6
4
13
9
7
4
7
10
2
9
5
7
2
8
4
6
5
5
222
8
7
12
5
216
3
4
4
6
3
14
8
7
13
4
3
3
3
3
17
5
4
3
33
6
6
33
7
5
3
8
7
5
2
9
4
2
233
24
7
4
8
10
3
4
15
2
16
3
3
13
12
7
5
4
207
4
2
4
27
15
2
5
2
25
6
5
5
6
13
6
18
6
4
12
225
10
7
5
2
2
11
4
14
21
8
10
3
5
4
232
2
5
5
3
7
17
11
6
6
23
4
6
3
5
4
2
17
3
6
5
8
3
2
2
14
9
4
4
2
5
5
3
7
6
12
6
10
3
6
2
2
19
5
4
4
9
2
4
13
3
5
6
3
6
5
4
9
6
3
5
7
3
6
6
4
3
10
6
3
221
3
5
3
6
4
8
5
3
6
4
4
2
54
5
6
11
3
3
4
4
4
3
7
3
11
11
7
10
6
13
223
213
15
231
7
3
7
228
2
3
4
4
5
6
7
4
13
3
4
5
3
6
4
6
7
2
4
3
4
3
3
6
3
7
3
5
18
5
6
8
10
3
3
3
2
4
2
4
4
5
6
6
4
10
13
3
12
5
12
16
8
4
19
11
2
4
5
6
8
5
6
4
18
10
4
2
216
6
6
6
2
4
12
8
3
11
5
6
14
5
3
13
4
5
4
5
3
28
6
3
7
219
3
9
7
3
10
6
3
4
19
5
7
11
6
15
19
4
13
11
3
7
5
10
2
8
11
2
6
4
6
24
6
3
3
3
3
6
18
4
11
4
2
5
10
8
3
9
5
3
4
5
6
2
5
7
4
4
14
6
4
4
5
5
7
2
4
3
7
3
3
6
4
5
4
4
4
3
3
3
3
8
14
2
3
5
3
2
4
5
3
7
3
3
18
3
4
4
5
7
3
3
3
13
5
4
8
211
5
5
3
5
2
5
4
2
655
6
3
5
11
2
5
3
12
9
15
11
5
12
217
2
6
17
3
3
207
5
5
4
5
9
3
2
8
5
4
3
2
5
12
4
14
5
4
2
13
5
8
4
225
4
3
4
5
4
3
3
6
23
9
2
6
7
233
4
4
6
18
3
4
6
3
4
4
2
3
7
4
13
227
4
3
5
4
2
12
9
17
3
7
14
6
4
5
21
4
8
9
2
9
25
16
3
6
4
7
8
5
2
3
5
4
3
3
5
3
3
3
2
3
19
2
4
3
4
2
3
4
4
2
4
3
3
3
2
6
3
17
5
6
4
3
13
5
3
3
3
4
9
4
2
14
12
4
5
24
4
3
37
12
11
21
3
4
3
13
4
2
3
15
4
11
4
4
3
8
3
4
4
12
8
5
3
3
4
2
220
3
5
223
3
3
3
10
3
15
4
241
9
7
3
6
6
23
4
13
7
3
4
7
4
9
3
3
4
10
5
5
1
5
24
2
4
5
5
6
14
3
8
2
3
5
13
13
3
5
2
3
15
3
4
2
10
4
4
4
5
5
3
5
3
4
7
4
27
3
6
4
15
3
5
6
6
5
4
8
3
9
2
6
3
4
3
7
4
18
3
11
3
3
8
9
7
24
3
219
7
10
4
5
9
12
2
5
4
4
4
3
3
19
5
8
16
8
6
22
3
23
3
242
9
4
3
3
5
7
3
3
5
8
3
7
5
14
8
10
3
4
3
7
4
6
7
4
10
4
3
11
3
7
10
3
13
6
8
12
10
5
7
9
3
4
7
7
10
8
30
9
19
4
3
19
15
4
13
3
215
223
4
7
4
8
17
16
3
7
6
5
5
4
12
3
7
4
4
13
4
5
2
5
6
5
6
6
7
10
18
23
9
3
3
6
5
2
4
2
7
3
3
2
5
5
14
10
224
6
3
4
3
7
5
9
3
6
4
2
5
11
4
3
3
2
8
4
7
4
10
7
3
3
18
18
17
3
3
3
4
5
3
3
4
12
7
3
11
13
5
4
7
13
5
4
11
3
12
3
6
4
4
21
4
6
9
5
3
10
8
4
6
4
4
6
5
4
8
6
4
6
4
4
5
9
6
3
4
2
9
3
18
2
4
3
13
3
6
6
8
7
9
3
2
16
3
4
6
3
2
33
22
14
4
9
12
4
5
6
3
23
9
4
3
5
5
3
4
5
3
5
3
10
4
5
5
8
4
4
6
8
5
4
3
4
6
3
3
3
5
9
12
6
5
9
3
5
3
2
2
2
18
3
2
21
2
5
4
6
4
5
10
3
9
3
2
10
7
3
6
6
4
4
8
12
7
3
7
3
3
9
3
4
5
4
4
5
5
10
15
4
4
14
6
227
3
14
5
216
22
5
4
2
2
6
3
4
2
9
9
4
3
28
13
11
4
5
3
3
2
3
3
5
3
4
3
5
23
26
3
4
5
6
4
6
3
5
5
3
4
3
2
2
2
7
14
3
6
7
17
2
2
15
14
16
4
6
7
13
6
4
5
6
16
3
3
28
3
6
15
3
9
2
4
6
3
3
22
4
12
6
7
2
5
4
10
3
16
6
9
2
5
12
7
5
5
5
5
2
11
9
17
4
3
11
7
3
5
15
4
3
4
211
8
7
5
4
7
6
7
6
3
6
5
6
5
3
4
4
26
4
6
10
4
4
3
2
3
3
4
5
9
3
9
4
4
5
5
8
2
4
2
3
8
4
11
19
5
8
6
3
5
6
12
3
2
4
16
12
3
4
4
8
6
5
6
6
219
8
222
6
16
3
13
19
5
4
3
11
6
10
4
7
7
12
5
3
3
5
6
10
3
8
2
5
4
7
2
4
4
2
12
9
6
4
2
40
2
4
10
4
223
4
2
20
6
7
24
5
4
5
2
20
16
6
5
13
2
3
3
19
3
2
4
5
6
7
11
12
5
6
7
7
3
5
3
5
3
14
3
4
4
2
11
1
7
3
9
6
11
12
5
8
6
221
4
2
12
4
3
15
4
5
226
7
218
7
5
4
5
18
4
5
9
4
4
2
9
18
18
9
5
6
6
3
3
7
3
5
4
4
4
12
3
6
31
5
4
7
3
6
5
6
5
11
2
2
11
11
6
7
5
8
7
10
5
23
7
4
3
5
34
2
5
23
7
3
6
8
4
4
4
2
5
3
8
5
4
8
25
2
3
17
8
3
4
8
7
3
15
6
5
7
21
9
5
6
6
5
3
2
3
10
3
6
3
14
7
4
4
8
7
8
2
6
12
4
213
6
5
21
8
2
5
23
3
11
2
3
6
25
2
3
6
7
6
6
4
4
6
3
17
9
7
6
4
3
10
7
2
3
3
3
11
8
3
7
6
4
14
36
3
4
3
3
22
13
21
4
2
7
4
4
17
15
3
7
11
2
4
7
6
209
6
3
2
2
24
4
9
4
3
3
3
29
2
2
4
3
3
5
4
6
3
3
2
4
...
...
vendor/github.com/beorn7/perks/quantile/stream.go
0 → 100644
查看文件 @
ec1d9e6
// Package quantile computes approximate quantiles over an unbounded data
// stream within low memory and CPU bounds.
//
// A small amount of accuracy is traded to achieve the above properties.
//
// Multiple streams can be merged before calling Query to generate a single set
// of results. This is meaningful when the streams represent the same type of
// data. See Merge and Samples.
//
// For more detailed information about the algorithm used, see:
//
// Effective Computation of Biased Quantiles over Data Streams
//
// http://www.cs.rutgers.edu/~muthu/bquant.pdf
package
quantile
import
(
"math"
"sort"
)
// Sample holds an observed value and meta information for compression. JSON
// tags have been added for convenience.
type
Sample
struct
{
Value
float64
`json:",string"`
Width
float64
`json:",string"`
Delta
float64
`json:",string"`
}
// Samples represents a slice of samples. It implements sort.Interface.
type
Samples
[]
Sample
func
(
a
Samples
)
Len
()
int
{
return
len
(
a
)
}
func
(
a
Samples
)
Less
(
i
,
j
int
)
bool
{
return
a
[
i
]
.
Value
<
a
[
j
]
.
Value
}
func
(
a
Samples
)
Swap
(
i
,
j
int
)
{
a
[
i
],
a
[
j
]
=
a
[
j
],
a
[
i
]
}
type
invariant
func
(
s
*
stream
,
r
float64
)
float64
// NewLowBiased returns an initialized Stream for low-biased quantiles
// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but
// error guarantees can still be given even for the lower ranks of the data
// distribution.
//
// The provided epsilon is a relative error, i.e. the true quantile of a value
// returned by a query is guaranteed to be within (1±Epsilon)*Quantile.
//
// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error
// properties.
func
NewLowBiased
(
epsilon
float64
)
*
Stream
{
ƒ
:=
func
(
s
*
stream
,
r
float64
)
float64
{
return
2
*
epsilon
*
r
}
return
newStream
(
ƒ
)
}
// NewHighBiased returns an initialized Stream for high-biased quantiles
// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but
// error guarantees can still be given even for the higher ranks of the data
// distribution.
//
// The provided epsilon is a relative error, i.e. the true quantile of a value
// returned by a query is guaranteed to be within 1-(1±Epsilon)*(1-Quantile).
//
// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error
// properties.
func
NewHighBiased
(
epsilon
float64
)
*
Stream
{
ƒ
:=
func
(
s
*
stream
,
r
float64
)
float64
{
return
2
*
epsilon
*
(
s
.
n
-
r
)
}
return
newStream
(
ƒ
)
}
// NewTargeted returns an initialized Stream concerned with a particular set of
// quantile values that are supplied a priori. Knowing these a priori reduces
// space and computation time. The targets map maps the desired quantiles to
// their absolute errors, i.e. the true quantile of a value returned by a query
// is guaranteed to be within (Quantile±Epsilon).
//
// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error properties.
func
NewTargeted
(
targetMap
map
[
float64
]
float64
)
*
Stream
{
// Convert map to slice to avoid slow iterations on a map.
// ƒ is called on the hot path, so converting the map to a slice
// beforehand results in significant CPU savings.
targets
:=
targetMapToSlice
(
targetMap
)
ƒ
:=
func
(
s
*
stream
,
r
float64
)
float64
{
var
m
=
math
.
MaxFloat64
var
f
float64
for
_
,
t
:=
range
targets
{
if
t
.
quantile
*
s
.
n
<=
r
{
f
=
(
2
*
t
.
epsilon
*
r
)
/
t
.
quantile
}
else
{
f
=
(
2
*
t
.
epsilon
*
(
s
.
n
-
r
))
/
(
1
-
t
.
quantile
)
}
if
f
<
m
{
m
=
f
}
}
return
m
}
return
newStream
(
ƒ
)
}
type
target
struct
{
quantile
float64
epsilon
float64
}
func
targetMapToSlice
(
targetMap
map
[
float64
]
float64
)
[]
target
{
targets
:=
make
([]
target
,
0
,
len
(
targetMap
))
for
quantile
,
epsilon
:=
range
targetMap
{
t
:=
target
{
quantile
:
quantile
,
epsilon
:
epsilon
,
}
targets
=
append
(
targets
,
t
)
}
return
targets
}
// Stream computes quantiles for a stream of float64s. It is not thread-safe by
// design. Take care when using across multiple goroutines.
type
Stream
struct
{
*
stream
b
Samples
sorted
bool
}
func
newStream
(
ƒ
invariant
)
*
Stream
{
x
:=
&
stream
{
ƒ
:
ƒ
}
return
&
Stream
{
x
,
make
(
Samples
,
0
,
500
),
true
}
}
// Insert inserts v into the stream.
func
(
s
*
Stream
)
Insert
(
v
float64
)
{
s
.
insert
(
Sample
{
Value
:
v
,
Width
:
1
})
}
func
(
s
*
Stream
)
insert
(
sample
Sample
)
{
s
.
b
=
append
(
s
.
b
,
sample
)
s
.
sorted
=
false
if
len
(
s
.
b
)
==
cap
(
s
.
b
)
{
s
.
flush
()
}
}
// Query returns the computed qth percentiles value. If s was created with
// NewTargeted, and q is not in the set of quantiles provided a priori, Query
// will return an unspecified result.
func
(
s
*
Stream
)
Query
(
q
float64
)
float64
{
if
!
s
.
flushed
()
{
// Fast path when there hasn't been enough data for a flush;
// this also yields better accuracy for small sets of data.
l
:=
len
(
s
.
b
)
if
l
==
0
{
return
0
}
i
:=
int
(
math
.
Ceil
(
float64
(
l
)
*
q
))
if
i
>
0
{
i
-=
1
}
s
.
maybeSort
()
return
s
.
b
[
i
]
.
Value
}
s
.
flush
()
return
s
.
stream
.
query
(
q
)
}
// Merge merges samples into the underlying streams samples. This is handy when
// merging multiple streams from separate threads, database shards, etc.
//
// ATTENTION: This method is broken and does not yield correct results. The
// underlying algorithm is not capable of merging streams correctly.
func
(
s
*
Stream
)
Merge
(
samples
Samples
)
{
sort
.
Sort
(
samples
)
s
.
stream
.
merge
(
samples
)
}
// Reset reinitializes and clears the list reusing the samples buffer memory.
func
(
s
*
Stream
)
Reset
()
{
s
.
stream
.
reset
()
s
.
b
=
s
.
b
[
:
0
]
}
// Samples returns stream samples held by s.
func
(
s
*
Stream
)
Samples
()
Samples
{
if
!
s
.
flushed
()
{
return
s
.
b
}
s
.
flush
()
return
s
.
stream
.
samples
()
}
// Count returns the total number of samples observed in the stream
// since initialization.
func
(
s
*
Stream
)
Count
()
int
{
return
len
(
s
.
b
)
+
s
.
stream
.
count
()
}
func
(
s
*
Stream
)
flush
()
{
s
.
maybeSort
()
s
.
stream
.
merge
(
s
.
b
)
s
.
b
=
s
.
b
[
:
0
]
}
func
(
s
*
Stream
)
maybeSort
()
{
if
!
s
.
sorted
{
s
.
sorted
=
true
sort
.
Sort
(
s
.
b
)
}
}
func
(
s
*
Stream
)
flushed
()
bool
{
return
len
(
s
.
stream
.
l
)
>
0
}
type
stream
struct
{
n
float64
l
[]
Sample
ƒ
invariant
}
func
(
s
*
stream
)
reset
()
{
s
.
l
=
s
.
l
[
:
0
]
s
.
n
=
0
}
func
(
s
*
stream
)
insert
(
v
float64
)
{
s
.
merge
(
Samples
{{
v
,
1
,
0
}})
}
func
(
s
*
stream
)
merge
(
samples
Samples
)
{
// TODO(beorn7): This tries to merge not only individual samples, but
// whole summaries. The paper doesn't mention merging summaries at
// all. Unittests show that the merging is inaccurate. Find out how to
// do merges properly.
var
r
float64
i
:=
0
for
_
,
sample
:=
range
samples
{
for
;
i
<
len
(
s
.
l
);
i
++
{
c
:=
s
.
l
[
i
]
if
c
.
Value
>
sample
.
Value
{
// Insert at position i.
s
.
l
=
append
(
s
.
l
,
Sample
{})
copy
(
s
.
l
[
i
+
1
:
],
s
.
l
[
i
:
])
s
.
l
[
i
]
=
Sample
{
sample
.
Value
,
sample
.
Width
,
math
.
Max
(
sample
.
Delta
,
math
.
Floor
(
s
.
ƒ
(
s
,
r
))
-
1
),
// TODO(beorn7): How to calculate delta correctly?
}
i
++
goto
inserted
}
r
+=
c
.
Width
}
s
.
l
=
append
(
s
.
l
,
Sample
{
sample
.
Value
,
sample
.
Width
,
0
})
i
++
inserted
:
s
.
n
+=
sample
.
Width
r
+=
sample
.
Width
}
s
.
compress
()
}
func
(
s
*
stream
)
count
()
int
{
return
int
(
s
.
n
)
}
func
(
s
*
stream
)
query
(
q
float64
)
float64
{
t
:=
math
.
Ceil
(
q
*
s
.
n
)
t
+=
math
.
Ceil
(
s
.
ƒ
(
s
,
t
)
/
2
)
p
:=
s
.
l
[
0
]
var
r
float64
for
_
,
c
:=
range
s
.
l
[
1
:
]
{
r
+=
p
.
Width
if
r
+
c
.
Width
+
c
.
Delta
>
t
{
return
p
.
Value
}
p
=
c
}
return
p
.
Value
}
func
(
s
*
stream
)
compress
()
{
if
len
(
s
.
l
)
<
2
{
return
}
x
:=
s
.
l
[
len
(
s
.
l
)
-
1
]
xi
:=
len
(
s
.
l
)
-
1
r
:=
s
.
n
-
1
-
x
.
Width
for
i
:=
len
(
s
.
l
)
-
2
;
i
>=
0
;
i
--
{
c
:=
s
.
l
[
i
]
if
c
.
Width
+
x
.
Width
+
x
.
Delta
<=
s
.
ƒ
(
s
,
r
)
{
x
.
Width
+=
c
.
Width
s
.
l
[
xi
]
=
x
// Remove element at i.
copy
(
s
.
l
[
i
:
],
s
.
l
[
i
+
1
:
])
s
.
l
=
s
.
l
[
:
len
(
s
.
l
)
-
1
]
xi
-=
1
}
else
{
x
=
c
xi
=
i
}
r
-=
c
.
Width
}
}
func
(
s
*
stream
)
samples
()
Samples
{
samples
:=
make
(
Samples
,
len
(
s
.
l
))
copy
(
samples
,
s
.
l
)
return
samples
}
...
...
vendor/github.com/cespare/xxhash/v2/.travis.yml
0 → 100644
查看文件 @
ec1d9e6
language
:
go
go
:
-
"
1.x"
-
master
env
:
-
TAGS=""
-
TAGS="-tags purego"
script
:
go test $TAGS -v ./...
...
...
vendor/github.com/cespare/xxhash/v2/LICENSE.txt
0 → 100644
查看文件 @
ec1d9e6
Copyright (c) 2016 Caleb Spare
MIT License
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
...
...
vendor/github.com/cespare/xxhash/v2/README.md
0 → 100644
查看文件 @
ec1d9e6
# xxhash
[

](https://godoc.org/github.com/cespare/xxhash)
[

](https://travis-ci.org/cespare/xxhash)
xxhash is a Go implementation of the 64-bit
[
xxHash
](
http://cyan4973.github.io/xxHash/
)
algorithm, XXH64. This is a
high-quality hashing algorithm that is much faster than anything in the Go
standard library.
This package provides a straightforward API:
```
func Sum64(b []byte) uint64
func Sum64String(s string) uint64
type Digest struct{ ... }
func New() *Digest
```
The
`Digest`
type implements hash.Hash64. Its key methods are:
```
func (*Digest) Write([]byte) (int, error)
func (*Digest) WriteString(string) (int, error)
func (*Digest) Sum64() uint64
```
This implementation provides a fast pure-Go implementation and an even faster
assembly implementation for amd64.
## Compatibility
This package is in a module and the latest code is in version 2 of the module.
You need a version of Go with at least "minimal module compatibility" to use
github.com/cespare/xxhash/v2:
*
1.9.7+ for Go 1.9
*
1.10.3+ for Go 1.10
*
Go 1.11 or later
I recommend using the latest release of Go.
## Benchmarks
Here are some quick benchmarks comparing the pure-Go and assembly
implementations of Sum64.
| input size | purego | asm |
| --- | --- | --- |
| 5 B | 979.66 MB/s | 1291.17 MB/s |
| 100 B | 7475.26 MB/s | 7973.40 MB/s |
| 4 KB | 17573.46 MB/s | 17602.65 MB/s |
| 10 MB | 17131.46 MB/s | 17142.16 MB/s |
These numbers were generated on Ubuntu 18.04 with an Intel i7-8700K CPU using
the following commands under Go 1.11.2:
```
$ go test -tags purego -benchtime 10s -bench '/xxhash,direct,bytes'
$ go test -benchtime 10s -bench '/xxhash,direct,bytes'
```
## Projects using this package
-
[
InfluxDB
](
https://github.com/influxdata/influxdb
)
-
[
Prometheus
](
https://github.com/prometheus/prometheus
)
-
[
FreeCache
](
https://github.com/coocood/freecache
)
...
...
vendor/github.com/cespare/xxhash/v2/go.mod
0 → 100644
查看文件 @
ec1d9e6
module github.com/cespare/xxhash/v2
go 1.11
...
...
vendor/github.com/cespare/xxhash/v2/xxhash.go
0 → 100644
查看文件 @
ec1d9e6
// Package xxhash implements the 64-bit variant of xxHash (XXH64) as described
// at http://cyan4973.github.io/xxHash/.
package
xxhash
import
(
"encoding/binary"
"errors"
"math/bits"
)
const
(
prime1
uint64
=
11400714785074694791
prime2
uint64
=
14029467366897019727
prime3
uint64
=
1609587929392839161
prime4
uint64
=
9650029242287828579
prime5
uint64
=
2870177450012600261
)
// NOTE(caleb): I'm using both consts and vars of the primes. Using consts where
// possible in the Go code is worth a small (but measurable) performance boost
// by avoiding some MOVQs. Vars are needed for the asm and also are useful for
// convenience in the Go code in a few places where we need to intentionally
// avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the
// result overflows a uint64).
var
(
prime1v
=
prime1
prime2v
=
prime2
prime3v
=
prime3
prime4v
=
prime4
prime5v
=
prime5
)
// Digest implements hash.Hash64.
type
Digest
struct
{
v1
uint64
v2
uint64
v3
uint64
v4
uint64
total
uint64
mem
[
32
]
byte
n
int
// how much of mem is used
}
// New creates a new Digest that computes the 64-bit xxHash algorithm.
func
New
()
*
Digest
{
var
d
Digest
d
.
Reset
()
return
&
d
}
// Reset clears the Digest's state so that it can be reused.
func
(
d
*
Digest
)
Reset
()
{
d
.
v1
=
prime1v
+
prime2
d
.
v2
=
prime2
d
.
v3
=
0
d
.
v4
=
-
prime1v
d
.
total
=
0
d
.
n
=
0
}
// Size always returns 8 bytes.
func
(
d
*
Digest
)
Size
()
int
{
return
8
}
// BlockSize always returns 32 bytes.
func
(
d
*
Digest
)
BlockSize
()
int
{
return
32
}
// Write adds more data to d. It always returns len(b), nil.
func
(
d
*
Digest
)
Write
(
b
[]
byte
)
(
n
int
,
err
error
)
{
n
=
len
(
b
)
d
.
total
+=
uint64
(
n
)
if
d
.
n
+
n
<
32
{
// This new data doesn't even fill the current block.
copy
(
d
.
mem
[
d
.
n
:
],
b
)
d
.
n
+=
n
return
}
if
d
.
n
>
0
{
// Finish off the partial block.
copy
(
d
.
mem
[
d
.
n
:
],
b
)
d
.
v1
=
round
(
d
.
v1
,
u64
(
d
.
mem
[
0
:
8
]))
d
.
v2
=
round
(
d
.
v2
,
u64
(
d
.
mem
[
8
:
16
]))
d
.
v3
=
round
(
d
.
v3
,
u64
(
d
.
mem
[
16
:
24
]))
d
.
v4
=
round
(
d
.
v4
,
u64
(
d
.
mem
[
24
:
32
]))
b
=
b
[
32
-
d
.
n
:
]
d
.
n
=
0
}
if
len
(
b
)
>=
32
{
// One or more full blocks left.
nw
:=
writeBlocks
(
d
,
b
)
b
=
b
[
nw
:
]
}
// Store any remaining partial block.
copy
(
d
.
mem
[
:
],
b
)
d
.
n
=
len
(
b
)
return
}
// Sum appends the current hash to b and returns the resulting slice.
func
(
d
*
Digest
)
Sum
(
b
[]
byte
)
[]
byte
{
s
:=
d
.
Sum64
()
return
append
(
b
,
byte
(
s
>>
56
),
byte
(
s
>>
48
),
byte
(
s
>>
40
),
byte
(
s
>>
32
),
byte
(
s
>>
24
),
byte
(
s
>>
16
),
byte
(
s
>>
8
),
byte
(
s
),
)
}
// Sum64 returns the current hash.
func
(
d
*
Digest
)
Sum64
()
uint64
{
var
h
uint64
if
d
.
total
>=
32
{
v1
,
v2
,
v3
,
v4
:=
d
.
v1
,
d
.
v2
,
d
.
v3
,
d
.
v4
h
=
rol1
(
v1
)
+
rol7
(
v2
)
+
rol12
(
v3
)
+
rol18
(
v4
)
h
=
mergeRound
(
h
,
v1
)
h
=
mergeRound
(
h
,
v2
)
h
=
mergeRound
(
h
,
v3
)
h
=
mergeRound
(
h
,
v4
)
}
else
{
h
=
d
.
v3
+
prime5
}
h
+=
d
.
total
i
,
end
:=
0
,
d
.
n
for
;
i
+
8
<=
end
;
i
+=
8
{
k1
:=
round
(
0
,
u64
(
d
.
mem
[
i
:
i
+
8
]))
h
^=
k1
h
=
rol27
(
h
)
*
prime1
+
prime4
}
if
i
+
4
<=
end
{
h
^=
uint64
(
u32
(
d
.
mem
[
i
:
i
+
4
]))
*
prime1
h
=
rol23
(
h
)
*
prime2
+
prime3
i
+=
4
}
for
i
<
end
{
h
^=
uint64
(
d
.
mem
[
i
])
*
prime5
h
=
rol11
(
h
)
*
prime1
i
++
}
h
^=
h
>>
33
h
*=
prime2
h
^=
h
>>
29
h
*=
prime3
h
^=
h
>>
32
return
h
}
const
(
magic
=
"xxh
\x06
"
marshaledSize
=
len
(
magic
)
+
8
*
5
+
32
)
// MarshalBinary implements the encoding.BinaryMarshaler interface.
func
(
d
*
Digest
)
MarshalBinary
()
([]
byte
,
error
)
{
b
:=
make
([]
byte
,
0
,
marshaledSize
)
b
=
append
(
b
,
magic
...
)
b
=
appendUint64
(
b
,
d
.
v1
)
b
=
appendUint64
(
b
,
d
.
v2
)
b
=
appendUint64
(
b
,
d
.
v3
)
b
=
appendUint64
(
b
,
d
.
v4
)
b
=
appendUint64
(
b
,
d
.
total
)
b
=
append
(
b
,
d
.
mem
[
:
d
.
n
]
...
)
b
=
b
[
:
len
(
b
)
+
len
(
d
.
mem
)
-
d
.
n
]
return
b
,
nil
}
// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface.
func
(
d
*
Digest
)
UnmarshalBinary
(
b
[]
byte
)
error
{
if
len
(
b
)
<
len
(
magic
)
||
string
(
b
[
:
len
(
magic
)])
!=
magic
{
return
errors
.
New
(
"xxhash: invalid hash state identifier"
)
}
if
len
(
b
)
!=
marshaledSize
{
return
errors
.
New
(
"xxhash: invalid hash state size"
)
}
b
=
b
[
len
(
magic
)
:
]
b
,
d
.
v1
=
consumeUint64
(
b
)
b
,
d
.
v2
=
consumeUint64
(
b
)
b
,
d
.
v3
=
consumeUint64
(
b
)
b
,
d
.
v4
=
consumeUint64
(
b
)
b
,
d
.
total
=
consumeUint64
(
b
)
copy
(
d
.
mem
[
:
],
b
)
b
=
b
[
len
(
d
.
mem
)
:
]
d
.
n
=
int
(
d
.
total
%
uint64
(
len
(
d
.
mem
)))
return
nil
}
func
appendUint64
(
b
[]
byte
,
x
uint64
)
[]
byte
{
var
a
[
8
]
byte
binary
.
LittleEndian
.
PutUint64
(
a
[
:
],
x
)
return
append
(
b
,
a
[
:
]
...
)
}
func
consumeUint64
(
b
[]
byte
)
([]
byte
,
uint64
)
{
x
:=
u64
(
b
)
return
b
[
8
:
],
x
}
func
u64
(
b
[]
byte
)
uint64
{
return
binary
.
LittleEndian
.
Uint64
(
b
)
}
func
u32
(
b
[]
byte
)
uint32
{
return
binary
.
LittleEndian
.
Uint32
(
b
)
}
func
round
(
acc
,
input
uint64
)
uint64
{
acc
+=
input
*
prime2
acc
=
rol31
(
acc
)
acc
*=
prime1
return
acc
}
func
mergeRound
(
acc
,
val
uint64
)
uint64
{
val
=
round
(
0
,
val
)
acc
^=
val
acc
=
acc
*
prime1
+
prime4
return
acc
}
func
rol1
(
x
uint64
)
uint64
{
return
bits
.
RotateLeft64
(
x
,
1
)
}
func
rol7
(
x
uint64
)
uint64
{
return
bits
.
RotateLeft64
(
x
,
7
)
}
func
rol11
(
x
uint64
)
uint64
{
return
bits
.
RotateLeft64
(
x
,
11
)
}
func
rol12
(
x
uint64
)
uint64
{
return
bits
.
RotateLeft64
(
x
,
12
)
}
func
rol18
(
x
uint64
)
uint64
{
return
bits
.
RotateLeft64
(
x
,
18
)
}
func
rol23
(
x
uint64
)
uint64
{
return
bits
.
RotateLeft64
(
x
,
23
)
}
func
rol27
(
x
uint64
)
uint64
{
return
bits
.
RotateLeft64
(
x
,
27
)
}
func
rol31
(
x
uint64
)
uint64
{
return
bits
.
RotateLeft64
(
x
,
31
)
}
...
...
vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go
0 → 100644
查看文件 @
ec1d9e6
// +build !appengine
// +build gc
// +build !purego
package
xxhash
// Sum64 computes the 64-bit xxHash digest of b.
//
//go:noescape
func
Sum64
(
b
[]
byte
)
uint64
//go:noescape
func
writeBlocks
(
d
*
Digest
,
b
[]
byte
)
int
...
...
请
注册
或
登录
后发表评论