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
29752e25
Commit
29752e25
authored
Dec 16, 2015
by
astaxie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor router
parent
7dcbcf07
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
74 additions
and
40 deletions
+74
-40
input.go
context/input.go
+36
-10
controller.go
controller.go
+1
-1
controller_test.go
controller_test.go
+10
-5
filter_test.go
filter_test.go
+1
-1
router.go
router.go
+4
-4
router_test.go
router_test.go
+1
-1
tree.go
tree.go
+0
-0
tree_test.go
tree_test.go
+21
-18
No files found.
context/input.go
View file @
29752e25
...
...
@@ -33,6 +33,7 @@ var (
acceptsHTMLRegex
=
regexp
.
MustCompile
(
`(text/html|application/xhtml\+xml)(?:,|$)`
)
acceptsXMLRegex
=
regexp
.
MustCompile
(
`(application/xml|text/xml)(?:,|$)`
)
acceptsJSONRegex
=
regexp
.
MustCompile
(
`(application/json)(?:,|$)`
)
maxParam
=
50
)
// BeegoInput operates the http request header, data, cookie and body.
...
...
@@ -40,16 +41,17 @@ var (
type
BeegoInput
struct
{
Context
*
Context
CruSession
session
.
Store
Params
map
[
string
]
string
Data
map
[
interface
{}]
interface
{}
// store some values in this context when calling context in filter or controller.
pnames
[]
string
pvalues
[]
string
data
map
[
interface
{}]
interface
{}
// store some values in this context when calling context in filter or controller.
RequestBody
[]
byte
}
// NewInput return BeegoInput generated by Context.
func
NewInput
()
*
BeegoInput
{
return
&
BeegoInput
{
Params
:
make
(
map
[
string
]
string
),
Data
:
make
(
map
[
interface
{}]
interface
{}),
pvalues
:
make
([]
string
,
maxParam
),
data
:
make
(
map
[
interface
{}]
interface
{}),
}
}
...
...
@@ -57,8 +59,8 @@ func NewInput() *BeegoInput {
func
(
input
*
BeegoInput
)
Reset
(
ctx
*
Context
)
{
input
.
Context
=
ctx
input
.
CruSession
=
nil
input
.
Params
=
make
(
map
[
string
]
string
)
input
.
Data
=
make
(
map
[
interface
{}]
interface
{})
input
.
pnames
=
input
.
pnames
[
:
0
]
input
.
data
=
nil
input
.
RequestBody
=
[]
byte
{}
}
...
...
@@ -254,14 +256,27 @@ func (input *BeegoInput) UserAgent() string {
return
input
.
Header
(
"User-Agent"
)
}
// ParamsLen return the length of the params
func
(
input
*
BeegoInput
)
ParamsLen
()
int
{
return
len
(
input
.
pnames
)
}
// Param returns router param by a given key.
func
(
input
*
BeegoInput
)
Param
(
key
string
)
string
{
if
v
,
ok
:=
input
.
Params
[
key
];
ok
{
return
v
for
i
,
v
:=
range
input
.
pnames
{
if
v
==
key
{
return
input
.
pvalues
[
i
]
}
}
return
""
}
// SetParam will set the param with key and value
func
(
input
*
BeegoInput
)
SetParam
(
key
,
val
string
)
{
input
.
pvalues
[
len
(
input
.
pnames
)]
=
val
input
.
pnames
=
append
(
input
.
pnames
,
key
)
}
// Query returns input data item string by a given string.
func
(
input
*
BeegoInput
)
Query
(
key
string
)
string
{
if
val
:=
input
.
Param
(
key
);
val
!=
""
{
...
...
@@ -305,9 +320,17 @@ func (input *BeegoInput) CopyBody() []byte {
return
requestbody
}
// Data return the implicit data in the input
func
(
input
*
BeegoInput
)
Data
()
map
[
interface
{}]
interface
{}
{
if
input
.
data
==
nil
{
input
.
data
=
make
(
map
[
interface
{}]
interface
{})
}
return
input
.
data
}
// GetData returns the stored data in this context.
func
(
input
*
BeegoInput
)
GetData
(
key
interface
{})
interface
{}
{
if
v
,
ok
:=
input
.
D
ata
[
key
];
ok
{
if
v
,
ok
:=
input
.
d
ata
[
key
];
ok
{
return
v
}
return
nil
...
...
@@ -316,7 +339,10 @@ func (input *BeegoInput) GetData(key interface{}) interface{} {
// SetData stores data with given key in this context.
// This data are only available in this context.
func
(
input
*
BeegoInput
)
SetData
(
key
,
val
interface
{})
{
input
.
Data
[
key
]
=
val
if
input
.
data
==
nil
{
input
.
data
=
make
(
map
[
interface
{}]
interface
{})
}
input
.
data
[
key
]
=
val
}
// ParseFormOrMulitForm parseForm or parseMultiForm based on Content-type
...
...
controller.go
View file @
29752e25
...
...
@@ -105,7 +105,7 @@ func (c *Controller) Init(ctx *context.Context, controllerName, actionName strin
c
.
AppController
=
app
c
.
EnableRender
=
true
c
.
EnableXSRF
=
true
c
.
Data
=
ctx
.
Input
.
Data
c
.
Data
=
ctx
.
Input
.
Data
()
c
.
methodMapping
=
make
(
map
[
string
]
func
())
}
...
...
controller_test.go
View file @
29752e25
...
...
@@ -21,7 +21,8 @@ import (
)
func
TestGetInt
(
t
*
testing
.
T
)
{
i
:=
&
context
.
BeegoInput
{
Params
:
map
[
string
]
string
{
"age"
:
"40"
}}
i
:=
context
.
NewInput
()
i
.
SetParam
(
"age"
,
"40"
)
ctx
:=
&
context
.
Context
{
Input
:
i
}
ctrlr
:=
Controller
{
Ctx
:
ctx
}
val
,
_
:=
ctrlr
.
GetInt
(
"age"
)
...
...
@@ -31,7 +32,8 @@ func TestGetInt(t *testing.T) {
}
func
TestGetInt8
(
t
*
testing
.
T
)
{
i
:=
&
context
.
BeegoInput
{
Params
:
map
[
string
]
string
{
"age"
:
"40"
}}
i
:=
context
.
NewInput
()
i
.
SetParam
(
"age"
,
"40"
)
ctx
:=
&
context
.
Context
{
Input
:
i
}
ctrlr
:=
Controller
{
Ctx
:
ctx
}
val
,
_
:=
ctrlr
.
GetInt8
(
"age"
)
...
...
@@ -42,7 +44,8 @@ func TestGetInt8(t *testing.T) {
}
func
TestGetInt16
(
t
*
testing
.
T
)
{
i
:=
&
context
.
BeegoInput
{
Params
:
map
[
string
]
string
{
"age"
:
"40"
}}
i
:=
context
.
NewInput
()
i
.
SetParam
(
"age"
,
"40"
)
ctx
:=
&
context
.
Context
{
Input
:
i
}
ctrlr
:=
Controller
{
Ctx
:
ctx
}
val
,
_
:=
ctrlr
.
GetInt16
(
"age"
)
...
...
@@ -52,7 +55,8 @@ func TestGetInt16(t *testing.T) {
}
func
TestGetInt32
(
t
*
testing
.
T
)
{
i
:=
&
context
.
BeegoInput
{
Params
:
map
[
string
]
string
{
"age"
:
"40"
}}
i
:=
context
.
NewInput
()
i
.
SetParam
(
"age"
,
"40"
)
ctx
:=
&
context
.
Context
{
Input
:
i
}
ctrlr
:=
Controller
{
Ctx
:
ctx
}
val
,
_
:=
ctrlr
.
GetInt32
(
"age"
)
...
...
@@ -62,7 +66,8 @@ func TestGetInt32(t *testing.T) {
}
func
TestGetInt64
(
t
*
testing
.
T
)
{
i
:=
&
context
.
BeegoInput
{
Params
:
map
[
string
]
string
{
"age"
:
"40"
}}
i
:=
context
.
NewInput
()
i
.
SetParam
(
"age"
,
"40"
)
ctx
:=
&
context
.
Context
{
Input
:
i
}
ctrlr
:=
Controller
{
Ctx
:
ctx
}
val
,
_
:=
ctrlr
.
GetInt64
(
"age"
)
...
...
filter_test.go
View file @
29752e25
...
...
@@ -29,7 +29,7 @@ func init() {
}
var
FilterUser
=
func
(
ctx
*
context
.
Context
)
{
ctx
.
Output
.
Body
([]
byte
(
"i am "
+
ctx
.
Input
.
Param
s
[
":last"
]
+
ctx
.
Input
.
Params
[
":first"
]
))
ctx
.
Output
.
Body
([]
byte
(
"i am "
+
ctx
.
Input
.
Param
(
":last"
)
+
ctx
.
Input
.
Param
(
":first"
)
))
}
func
TestFilter
(
t
*
testing
.
T
)
{
...
...
router.go
View file @
29752e25
...
...
@@ -466,8 +466,8 @@ func (p *ControllerRegister) URLFor(endpoint string, values ...interface{}) stri
}
func
(
p
*
ControllerRegister
)
geturl
(
t
*
Tree
,
url
,
controllName
,
methodName
string
,
params
map
[
string
]
string
,
httpMethod
string
)
(
bool
,
string
)
{
for
k
,
subtree
:=
range
t
.
fixrouters
{
u
:=
path
.
Join
(
url
,
k
)
for
_
,
subtree
:=
range
t
.
fixrouters
{
u
:=
path
.
Join
(
url
,
subtree
.
prefix
)
ok
,
u
:=
p
.
geturl
(
subtree
,
u
,
controllName
,
methodName
,
params
,
httpMethod
)
if
ok
{
return
ok
,
u
...
...
@@ -675,10 +675,10 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
if
r
,
ok
:=
runObject
.
(
*
controllerInfo
);
ok
{
routerInfo
=
r
findrouter
=
true
if
splat
,
ok
:=
context
.
Input
.
Params
[
":splat"
];
ok
{
if
splat
:=
context
.
Input
.
Param
(
":splat"
);
splat
!=
""
{
splatlist
:=
strings
.
Split
(
splat
,
"/"
)
for
k
,
v
:=
range
splatlist
{
context
.
Input
.
Params
[
strconv
.
Itoa
(
k
)]
=
v
context
.
Input
.
SetParam
(
strconv
.
Itoa
(
k
),
v
)
}
}
}
...
...
router_test.go
View file @
29752e25
...
...
@@ -45,7 +45,7 @@ func (tc *TestController) List() {
}
func
(
tc
*
TestController
)
Params
()
{
tc
.
Ctx
.
Output
.
Body
([]
byte
(
tc
.
Ctx
.
Input
.
Param
s
[
"0"
]
+
tc
.
Ctx
.
Input
.
Params
[
"1"
]
+
tc
.
Ctx
.
Input
.
Params
[
"2"
]
))
tc
.
Ctx
.
Output
.
Body
([]
byte
(
tc
.
Ctx
.
Input
.
Param
(
"0"
)
+
tc
.
Ctx
.
Input
.
Param
(
"1"
)
+
tc
.
Ctx
.
Input
.
Param
(
"2"
)
))
}
func
(
tc
*
TestController
)
Myext
()
{
...
...
tree.go
View file @
29752e25
This diff is collapsed.
Click to expand it.
tree_test.go
View file @
29752e25
...
...
@@ -45,6 +45,7 @@ func init() {
routers
=
append
(
routers
,
testinfo
{
"/*"
,
"/customer/2009/12/11"
,
map
[
string
]
string
{
":splat"
:
"customer/2009/12/11"
}})
routers
=
append
(
routers
,
testinfo
{
"/aa/*/bb"
,
"/aa/2009/bb"
,
map
[
string
]
string
{
":splat"
:
"2009"
}})
routers
=
append
(
routers
,
testinfo
{
"/cc/*/dd"
,
"/cc/2009/11/dd"
,
map
[
string
]
string
{
":splat"
:
"2009/11"
}})
routers
=
append
(
routers
,
testinfo
{
"/cc/:id/*"
,
"/cc/2009/11/dd"
,
map
[
string
]
string
{
":id"
:
"2009"
,
":splat"
:
"11/dd"
}})
routers
=
append
(
routers
,
testinfo
{
"/ee/:year/*/ff"
,
"/ee/2009/11/ff"
,
map
[
string
]
string
{
":year"
:
"2009"
,
":splat"
:
"11"
}})
routers
=
append
(
routers
,
testinfo
{
"/thumbnail/:size/uploads/*"
,
"/thumbnail/100x100/uploads/items/2014/04/20/dPRCdChkUd651t1Hvs18.jpg"
,
...
...
@@ -76,14 +77,14 @@ func TestTreeRouters(t *testing.T) {
ctx
:=
context
.
NewContext
()
obj
:=
tr
.
Match
(
r
.
requesturl
,
ctx
)
if
obj
==
nil
||
obj
.
(
string
)
!=
"astaxie"
{
t
.
Fatal
(
r
.
url
+
" can't get obj "
)
t
.
Fatal
(
r
.
url
+
" can't get obj, Expect "
,
r
.
requesturl
)
}
if
r
.
params
!=
nil
{
for
k
,
v
:=
range
r
.
params
{
if
vv
,
ok
:=
ctx
.
Input
.
Params
[
k
];
!
ok
{
if
vv
:=
ctx
.
Input
.
Param
(
k
);
vv
!=
v
{
t
.
Fatal
(
"The Rule: "
+
r
.
url
+
"
\n
The RequestURL:"
+
r
.
requesturl
+
"
\n
The Key is "
+
k
+
", The Value should be: "
+
v
+
", but get: "
+
vv
)
}
else
if
vv
==
""
&&
v
!=
""
{
t
.
Fatal
(
r
.
url
+
" "
+
r
.
requesturl
+
" get param empty:"
+
k
)
}
else
if
vv
!=
v
{
t
.
Fatal
(
r
.
url
+
" "
+
r
.
requesturl
+
" should be:"
+
v
+
" get param:"
+
vv
)
}
}
}
...
...
@@ -101,10 +102,10 @@ func TestAddTree(t *testing.T) {
if
obj
==
nil
||
obj
.
(
string
)
!=
"astaxie"
{
t
.
Fatal
(
"/v1/zl/shop/:id/account can't get obj "
)
}
if
len
(
ctx
.
Input
.
Params
)
==
0
{
if
ctx
.
Input
.
ParamsLen
(
)
==
0
{
t
.
Fatal
(
"get param error"
)
}
if
ctx
.
Input
.
Param
s
[
":id"
]
!=
"123"
{
if
ctx
.
Input
.
Param
(
":id"
)
!=
"123"
{
t
.
Fatal
(
"get :id param error"
)
}
ctx
.
Input
.
Reset
(
ctx
)
...
...
@@ -112,10 +113,10 @@ func TestAddTree(t *testing.T) {
if
obj
==
nil
||
obj
.
(
string
)
!=
"astaxie"
{
t
.
Fatal
(
"/v1/zl//shop/:sd/ttt_:id(.+)_:page(.+).html can't get obj "
)
}
if
len
(
ctx
.
Input
.
Params
)
==
0
{
if
ctx
.
Input
.
ParamsLen
(
)
==
0
{
t
.
Fatal
(
"get param error"
)
}
if
ctx
.
Input
.
Param
s
[
":sd"
]
!=
"123"
||
ctx
.
Input
.
Params
[
":id"
]
!=
"1"
||
ctx
.
Input
.
Params
[
":page"
]
!=
"12"
{
if
ctx
.
Input
.
Param
(
":sd"
)
!=
"123"
||
ctx
.
Input
.
Param
(
":id"
)
!=
"1"
||
ctx
.
Input
.
Param
(
":page"
)
!=
"12"
{
t
.
Fatal
(
"get :sd :id :page param error"
)
}
...
...
@@ -126,10 +127,10 @@ func TestAddTree(t *testing.T) {
if
obj
==
nil
||
obj
.
(
string
)
!=
"astaxie"
{
t
.
Fatal
(
"/v1/:shopid/shop/:id/account can't get obj "
)
}
if
len
(
ctx
.
Input
.
Params
)
==
0
{
if
ctx
.
Input
.
ParamsLen
(
)
==
0
{
t
.
Fatal
(
"get param error"
)
}
if
ctx
.
Input
.
Param
s
[
":id"
]
!=
"123"
||
ctx
.
Input
.
Params
[
":shopid"
]
!=
"zl"
{
if
ctx
.
Input
.
Param
(
":id"
)
!=
"123"
||
ctx
.
Input
.
Param
(
":shopid"
)
!=
"zl"
{
t
.
Fatal
(
"get :id :shopid param error"
)
}
ctx
.
Input
.
Reset
(
ctx
)
...
...
@@ -137,10 +138,10 @@ func TestAddTree(t *testing.T) {
if
obj
==
nil
||
obj
.
(
string
)
!=
"astaxie"
{
t
.
Fatal
(
"/v1/:shopid/shop/:sd/ttt_:id(.+)_:page(.+).html can't get obj "
)
}
if
len
(
ctx
.
Input
.
Params
)
==
0
{
if
ctx
.
Input
.
ParamsLen
(
)
==
0
{
t
.
Fatal
(
"get :shopid param error"
)
}
if
ctx
.
Input
.
Param
s
[
":sd"
]
!=
"123"
||
ctx
.
Input
.
Params
[
":id"
]
!=
"1"
||
ctx
.
Input
.
Params
[
":page"
]
!=
"12"
||
ctx
.
Input
.
Params
[
":shopid"
]
!=
"zl"
{
if
ctx
.
Input
.
Param
(
":sd"
)
!=
"123"
||
ctx
.
Input
.
Param
(
":id"
)
!=
"1"
||
ctx
.
Input
.
Param
(
":page"
)
!=
"12"
||
ctx
.
Input
.
Param
(
":shopid"
)
!=
"zl"
{
t
.
Fatal
(
"get :sd :id :page :shopid param error"
)
}
}
...
...
@@ -156,10 +157,10 @@ func TestAddTree2(t *testing.T) {
if
obj
==
nil
||
obj
.
(
string
)
!=
"astaxie"
{
t
.
Fatal
(
"/:version(v1|v2)/:prefix/shop/:id/account can't get obj "
)
}
if
len
(
ctx
.
Input
.
Params
)
==
0
{
if
ctx
.
Input
.
ParamsLen
(
)
==
0
{
t
.
Fatal
(
"get param error"
)
}
if
ctx
.
Input
.
Param
s
[
":id"
]
!=
"123"
||
ctx
.
Input
.
Params
[
":prefix"
]
!=
"zl"
||
ctx
.
Input
.
Params
[
":version"
]
!=
"v1"
{
if
ctx
.
Input
.
Param
(
":id"
)
!=
"123"
||
ctx
.
Input
.
Param
(
":prefix"
)
!=
"zl"
||
ctx
.
Input
.
Param
(
":version"
)
!=
"v1"
{
t
.
Fatal
(
"get :id :prefix :version param error"
)
}
}
...
...
@@ -175,10 +176,10 @@ func TestAddTree3(t *testing.T) {
if
obj
==
nil
||
obj
.
(
string
)
!=
"astaxie"
{
t
.
Fatal
(
"/table/:num/shop/:sd/account can't get obj "
)
}
if
len
(
ctx
.
Input
.
Params
)
==
0
{
if
ctx
.
Input
.
ParamsLen
(
)
==
0
{
t
.
Fatal
(
"get param error"
)
}
if
ctx
.
Input
.
Param
s
[
":num"
]
!=
"123"
||
ctx
.
Input
.
Params
[
":sd"
]
!=
"123"
{
if
ctx
.
Input
.
Param
(
":num"
)
!=
"123"
||
ctx
.
Input
.
Param
(
":sd"
)
!=
"123"
{
t
.
Fatal
(
"get :num :sd param error"
)
}
ctx
.
Input
.
Reset
(
ctx
)
...
...
@@ -199,10 +200,12 @@ func TestAddTree4(t *testing.T) {
if
obj
==
nil
||
obj
.
(
string
)
!=
"astaxie"
{
t
.
Fatal
(
"/:info:int/:num/:id/shop/:sd/:account can't get obj "
)
}
if
len
(
ctx
.
Input
.
Params
)
==
0
{
if
ctx
.
Input
.
ParamsLen
(
)
==
0
{
t
.
Fatal
(
"get param error"
)
}
if
ctx
.
Input
.
Params
[
":info"
]
!=
"12"
||
ctx
.
Input
.
Params
[
":num"
]
!=
"123"
||
ctx
.
Input
.
Params
[
":id"
]
!=
"456"
||
ctx
.
Input
.
Params
[
":sd"
]
!=
"123"
||
ctx
.
Input
.
Params
[
":account"
]
!=
"account"
{
if
ctx
.
Input
.
Param
(
":info"
)
!=
"12"
||
ctx
.
Input
.
Param
(
":num"
)
!=
"123"
||
ctx
.
Input
.
Param
(
":id"
)
!=
"456"
||
ctx
.
Input
.
Param
(
":sd"
)
!=
"123"
||
ctx
.
Input
.
Param
(
":account"
)
!=
"account"
{
t
.
Fatal
(
"get :info :num :id :sd :account param error"
)
}
ctx
.
Input
.
Reset
(
ctx
)
...
...
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