X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=lib%2Fxdsserver%2Fwebserver.go;h=a50b41e8789d4ca2d84765575f8b7fa815c6ebc7;hb=HEAD;hp=0e1676ae7a2c07df718b09cf614d535de185649a;hpb=2f7828d01f4c4ca2909f95f098627cd5475ed225;p=src%2Fxds%2Fxds-server.git diff --git a/lib/xdsserver/webserver.go b/lib/xdsserver/webserver.go index 0e1676a..a50b41e 100644 --- a/lib/xdsserver/webserver.go +++ b/lib/xdsserver/webserver.go @@ -1,3 +1,20 @@ +/* + * Copyright (C) 2017-2018 "IoT.bzh" + * Author Sebastien Douheret + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package xdsserver import ( @@ -11,7 +28,7 @@ import ( "github.com/Sirupsen/logrus" "github.com/gin-contrib/static" "github.com/gin-gonic/gin" - "github.com/googollee/go-socket.io" + socketio "github.com/googollee/go-socket.io" ) // WebServer . @@ -26,8 +43,8 @@ type WebServer struct { const indexFilename = "index.html" -// NewWebServer creates an instance of WebServer -func NewWebServer(ctx *Context) *WebServer { +// WebServerConstructor creates an instance of WebServer +func WebServerConstructor(ctx *Context) *WebServer { // Setup logging for gin router if ctx.Log.Level == logrus.DebugLevel { @@ -47,6 +64,7 @@ func NewWebServer(ctx *Context) *WebServer { r := gin.New() svr := &WebServer{ + Context: ctx, router: r, api: nil, sIOServer: nil, @@ -66,6 +84,7 @@ func (s *WebServer) Serve() error { s.router.Use(gin.Recovery()) s.router.Use(s.middlewareXDSDetails()) s.router.Use(s.middlewareCORS()) + s.router.Use(s.lockRequest()) // Create REST API s.api = NewAPIV1(s.Context) @@ -109,6 +128,7 @@ func (s *WebServer) Serve() error { case <-s.stop: // Shutting down permanently s.sessions.Stop() + s.sdks.Stop() s.Log.Infoln("shutting down (stop)") case err = <-serveError: // Error due to listen/serve failure @@ -153,6 +173,16 @@ func (s *WebServer) middlewareCORS() gin.HandlerFunc { } } +//lockRequest handles to increment/decrement xds package update +//to avoid updating xds-server when request is done +func (s *WebServer) lockRequest() gin.HandlerFunc { + return func(c *gin.Context) { + LockXdsUpdateCounter(s.Context, true) + c.Next() + LockXdsUpdateCounter(s.Context, false) + } +} + // socketHandler is the handler for the "main" websocket connection func (s *WebServer) socketHandler(c *gin.Context) { @@ -164,11 +194,12 @@ func (s *WebServer) socketHandler(c *gin.Context) { } s.sIOServer.On("connection", func(so socketio.Socket) { - s.Log.Debugf("WS Connected (SID=%v)", so.Id()) - s.sessions.UpdateIOSocket(sess.ID, &so) + sessID := sess.ID + s.Log.Debugf("WS Connected (sessID=%v, SID=%v)", sessID, so.Id()) + s.sessions.UpdateIOSocket(sessID, &so) so.On("disconnection", func() { - s.Log.Debugf("WS disconnected (SID=%v)", so.Id()) + s.Log.Debugf("WS disconnected (sessID=%v, SID=%v)", sessID, so.Id()) s.sessions.UpdateIOSocket(sess.ID, nil) }) })