For a goal to broadcast message from a goroutine to multiple http URL handlers, I am trying to register these http URL handlers, with below code in main.go
:
type webSocketHandler func(http.ResponseWriter, *http.Request)
type threadSafeSlice struct {
sync.Mutex
handlers []*webSocketHandler
}
var sliceOfHandlers threadSafeSlice
func (slice *threadSafeSlice) push(handle *webSocketHandler) { //register
slice.Lock()
defer slice.Unlock()
slice.handlers = append(slice.handlers, handle)
}
where forWardMsgToClient()
is the http URL handler that need to be registered,
broadCastMessage()
goroutine can broadcast message to multiple forWardMsgToClient()
handlers, in the below code:
func main() {
go broadcastMessage()
http.HandleFunc("/websocket", forwardMsgToClient)
http.ListenAndServe(":3000", nil)
}
func forwardMsgToClient(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
for {
// Forward message to the client upon receiving a msg from publisher
}
}
All the above code is in main.go
But the problem is, goroutine forwardMsgToClient()
gets spawned for respective client after rw, e := l.Accept()
call in ../go/src/net/http/server.go
.
Reason to register(push()
) http URL handler function(forwardMsgToClient()
) is to make broadcastMessage()
goroutine know the number of channels to create for all http URL handlers and delete the channel when un-registering http URL handler function(forwardMsgToClient()
).
Bit nervous, if we need to modify /go/src/net/http/server.go
to achieve this goal
How to register(push()
) a http URL handler function forwardMsgToClient()
in sliceOfHandlers.handlers
?