add dispatch(net.Conn, *upgrader.T) to dispatch client into controller
This commit is contained in:
parent
844bdf14c6
commit
3be3b5e156
|
@ -0,0 +1,78 @@
|
|||
package ws
|
||||
|
||||
import (
|
||||
"git.xdrm.io/gws/upgrader"
|
||||
"net"
|
||||
)
|
||||
|
||||
|
||||
// dispatch finds a controller for a client
|
||||
func (s *Server) dispatch(sock net.Conn, u *upgrader.T){
|
||||
|
||||
/* (1) Build client
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Add socket */
|
||||
client := new(Client)
|
||||
client.soc = sock
|
||||
|
||||
/* (2) Add uri */
|
||||
uri := u.Request.GetURI()
|
||||
client.arg = make([][]string, 1)
|
||||
client.arg[0] = []string{ uri }
|
||||
|
||||
/* (3) Add protocol */
|
||||
client.pro = string(u.Response.GetProtocol())
|
||||
|
||||
|
||||
/* (2) Search for a controller (from URI)
|
||||
---------------------------------------------------------*/
|
||||
var controller *Controller = nil
|
||||
|
||||
/* (1) Iterate over URI controllers */
|
||||
for _, c := range s.ctl {
|
||||
|
||||
/* (2) If matches */
|
||||
if c.uri.Match(uri) {
|
||||
|
||||
/* (3) Extract matches */
|
||||
match := c.uri.GetAllMatch()
|
||||
|
||||
/* (4) Add them to the 'arg' attribute */
|
||||
for _, m := range match {
|
||||
client.arg = append(client.arg, m)
|
||||
}
|
||||
|
||||
/* (5) Mark that we have a controller */
|
||||
controller = c
|
||||
break
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* (6) If no controller found */
|
||||
if controller == nil && s.def != nil {
|
||||
controller = s.def
|
||||
}
|
||||
|
||||
/* (7) If no controller -> close socket */
|
||||
if controller == nil {
|
||||
sock.Close()
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
/* (3) Manage client+controller
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Add client to server */
|
||||
s.cli = append(s.cli, client)
|
||||
|
||||
/* (2) Add controller to client */
|
||||
client.ctl = controller
|
||||
|
||||
/* (3) Launch controller routine */
|
||||
go controller.fun(client, nil)
|
||||
|
||||
return
|
||||
|
||||
}
|
Loading…
Reference in New Issue