1- package handler
1+ package server
22
33import (
44 "fmt"
5+ "net"
56 "net/http"
67 "reflect"
78 "runtime/debug"
@@ -13,19 +14,24 @@ import (
1314)
1415
1516var (
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,直接返回,不再进行后续处理.
3642type 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-
4444func (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) {
185185func 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+ }
0 commit comments