Skip to content

Commit 0b1d865

Browse files
committed
拆分http的server,client
1 parent 471acfd commit 0b1d865

File tree

7 files changed

+56
-57
lines changed

7 files changed

+56
-57
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package httpClient
1+
package client
22

33
import (
44
"bytes"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package handler
1+
package server
22

33
import (
44
"encoding/json"
Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
package handler
1+
package server
22

33
import (
44
"fmt"
5+
"net"
56
"net/http"
67
"reflect"
78
"runtime/debug"
@@ -13,19 +14,24 @@ import (
1314
)
1415

1516
var (
16-
//Server 默认服务
17-
Server = newHTTPServer()
17+
server = newHTTPServer()
1818
)
1919

20-
type server struct {
20+
// iface 对外服务接口, path格式:Method/URI
21+
type iface struct {
22+
path string
23+
source reflect.Type
24+
}
25+
26+
type httpServer struct {
2127
path map[string]iface
2228
prefix *btree.BTree
2329
filter Filter
24-
mu sync.RWMutex
30+
sync.RWMutex
2531
}
2632

27-
func newHTTPServer() *server {
28-
return &server{
33+
func newHTTPServer() *httpServer {
34+
return &httpServer{
2935
path: make(map[string]iface),
3036
prefix: btree.New(3),
3137
filter: defaultFilter,
@@ -35,12 +41,6 @@ func newHTTPServer() *server {
3541
// Filter 请求过滤, 如果返回结果为nil,直接返回,不再进行后续处理.
3642
type Filter func(http.ResponseWriter, *http.Request) *http.Request
3743

38-
// iface 对外服务接口, path格式:Method/URI
39-
type iface struct {
40-
path string
41-
source reflect.Type
42-
}
43-
4444
func (i *iface) Less(bi btree.Item) bool {
4545
return strings.Compare(i.path, bi.(*iface).path) == 1
4646
}
@@ -64,7 +64,7 @@ func NameToPath(name string, depth int) string {
6464

6565
//AddInterface 自动注册接口
6666
//只要struct实现了Get(),Post(),Delete(),Put()接口就可以自动注册
67-
func (s *server) AddInterface(obj interface{}, path string, isPrefix bool) error {
67+
func AddInterface(obj interface{}, path string, isPrefix bool) error {
6868
rt := reflect.TypeOf(obj)
6969
if rt.Kind() != reflect.Ptr {
7070
return fmt.Errorf("need ptr")
@@ -78,13 +78,13 @@ func (s *server) AddInterface(obj interface{}, path string, isPrefix bool) error
7878
path = "/" + path
7979
}
8080

81-
s.mu.Lock()
82-
defer s.mu.Unlock()
81+
server.Lock()
82+
defer server.Unlock()
8383

8484
rv := reflect.ValueOf(obj)
8585
for i := 0; i < rv.NumMethod(); i++ {
8686
method := rt.Method(i).Name
87-
log.Debugf("rt:%v, %d, method:%v", rt, i, method)
87+
log.Debugf("rt:%v, %d, method:%v", rt, i, method)
8888
switch method {
8989
case POST.String():
9090
case GET.String():
@@ -102,57 +102,57 @@ func (s *server) AddInterface(obj interface{}, path string, isPrefix bool) error
102102

103103
//前缀匹配
104104
if isPrefix {
105-
if s.prefix.Has(&ifc) {
105+
if server.prefix.Has(&ifc) {
106106
panic(fmt.Sprintf("exist url:%v %v", method, path))
107107
}
108-
s.prefix.ReplaceOrInsert(&ifc)
109-
log.Debugf("add prefix:%v", path)
108+
server.prefix.ReplaceOrInsert(&ifc)
109+
log.Debugf("add prefix:%v", path)
110110
continue
111111
}
112112

113113
//全路径匹配
114-
if _, ok := s.path[ifc.path]; ok {
114+
if _, ok := server.path[ifc.path]; ok {
115115
panic(fmt.Sprintf("exist url:%v %v", method, path))
116116
}
117117

118-
s.path[ifc.path] = ifc
118+
server.path[ifc.path] = ifc
119119
}
120120

121121
return nil
122122
}
123123

124124
//AddFilter 添加过滤函数.
125-
func (s *server) AddFilter(filter Filter) {
126-
s.mu.Lock()
127-
defer s.mu.Unlock()
128-
s.filter = filter
125+
func AddFilter(filter Filter) {
126+
server.Lock()
127+
defer server.Unlock()
128+
server.filter = filter
129129
}
130130

131-
func (s *server) iface(w http.ResponseWriter, r *http.Request) (i iface, ok bool) {
132-
s.mu.RLock()
133-
defer s.mu.RUnlock()
131+
func getInterface(w http.ResponseWriter, r *http.Request) (i iface, ok bool) {
132+
server.RLock()
133+
defer server.RUnlock()
134134

135135
path := r.Method + r.URL.Path
136136

137-
if i, ok = s.path[path]; ok {
137+
if i, ok = server.path[path]; ok {
138138
//log.Debugf("find path:%v", path)
139139
return
140140
}
141141

142142
//如果完全匹配没找到,再找前缀的
143-
s.prefix.AscendGreaterOrEqual(&iface{path: path}, func(item btree.Item) bool {
143+
server.prefix.AscendGreaterOrEqual(&iface{path: path}, func(item btree.Item) bool {
144144
i = *(item.(*iface))
145145
ok = strings.HasPrefix(path, i.path)
146-
// log.Debugf("path:%v, ipath:%v, ok:%v", path, i.path, ok)
146+
// log.Debugf("path:%v, ipath:%v, ok:%v", path, i.path, ok)
147147
return !ok
148148
})
149149

150-
// log.Debugf("find prefix:%v, ok:%v", path, ok)
150+
// log.Debugf("find prefix:%v, ok:%v", path, ok)
151151
return
152152
}
153153

154154
//ServeHTTP 真正对外服务接口
155-
func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
155+
func (s *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
156156
defer func() {
157157
if p := recover(); p != nil {
158158
log.Errorf("panic:%v req:%v, stack:%s", p, r, debug.Stack())
@@ -167,7 +167,7 @@ func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
167167
return
168168
}
169169

170-
i, ok := s.iface(w, r)
170+
i, ok := getInterface(w, r)
171171
if !ok {
172172
log.Errorf("%v %v %v not found.", r.RemoteAddr, r.Method, r.URL)
173173
SendResponse(w, http.StatusNotFound, "invalid request")
@@ -176,7 +176,7 @@ func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
176176

177177
log.Debugf("%v %v %v %v", r.RemoteAddr, r.Method, r.URL, i.path)
178178

179-
callback := reflect.New(i.source).MethodByName(r.Method).Interface().(func(http.ResponseWriter, *http.Request))
179+
callback := reflect.New(i.source).MethodByName(r.Method).Interface().(func(http.ResponseWriter, *http.Request))
180180
callback(w, nr)
181181

182182
return
@@ -185,3 +185,8 @@ func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
185185
func defaultFilter(_ http.ResponseWriter, r *http.Request) *http.Request {
186186
return r
187187
}
188+
189+
//Start 启动httpServer.
190+
func Start(l net.Listener) error {
191+
return http.Serve(l, server)
192+
}

handler/vars.go renamed to http/server/vars.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package handler
1+
package server
22

33
import (
44
"encoding/json"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package handler
1+
package server
22

33
import (
44
"bytes"

main.go

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,17 @@ import (
66
"net"
77
"net/http"
88

9-
"github.com/dearcode/crab/handler"
9+
"github.com/dearcode/crab/http/server"
1010
_ "github.com/dearcode/crab/server"
1111
)
1212

1313
type index struct {
14-
r *http.Request
15-
}
16-
17-
func test(r *http.Request) {
18-
fmt.Printf("%v\n", r.RemoteAddr)
14+
r *http.Request
1915
}
2016

2117
func (i *index) GET(w http.ResponseWriter, req *http.Request) {
22-
fmt.Printf("index:%p\n", i)
23-
test(req)
24-
w.Write([]byte("ok"))
18+
i.r = req
19+
w.Write([]byte(fmt.Sprintf("client:%v addr:%p", i.r.RemoteAddr, i)))
2520
}
2621

2722
func main() {
@@ -33,9 +28,8 @@ func main() {
3328
panic(err.Error())
3429
}
3530

36-
handler.Server.AddInterface(&index{}, "/index", false)
37-
38-
if err = http.Serve(ln, handler.Server); err != nil {
31+
server.AddInterface(&index{}, "/index", false)
32+
if err = server.Start(ln); err != nil {
3933
panic(err.Error())
4034
}
4135
}

server/init.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package server
22

33
import (
4-
"github.com/dearcode/crab/handler"
4+
"github.com/dearcode/crab/http/server"
55
)
66

77
func init() {
8-
handler.Server.AddInterface(&staticServer{}, "/", true)
9-
handler.Server.AddInterface(&debugServer{}, "/debug/", true)
8+
server.AddInterface(&staticServer{}, "/", true)
9+
server.AddInterface(&debugServer{}, "/debug/", true)
1010

11-
handler.Server.AddInterface(&testServer{}, "/test/", false)
11+
server.AddInterface(&testServer{}, "/test/", false)
1212

13-
handler.Server.AddInterface(&user{}, "", false)
13+
server.AddInterface(&user{}, "", false)
1414
}

0 commit comments

Comments
 (0)