Переход на асинхронное закрытие каналов с таймаутом, чтобы при обрыве соединения...
[vpproxy.git] / vphttp.py
index 0c09c5297bb8e040d32460a1201c517f473544ac..7ed52f787296d6cfc382be6e5b4938be851af4b3 100644 (file)
--- a/vphttp.py
+++ b/vphttp.py
@@ -37,7 +37,9 @@ try:
 except ImportError:
     pass
 
+import uuid
 
+from apscheduler.schedulers.background import BackgroundScheduler
 
 class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
 
@@ -86,11 +88,12 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
 
         try:
             while True:
-
+            
                 if not self.clientconnected:
                     logger.debug("Client is not connected, terminating")
                     break
 
+                VPStuff.vlcclient.mark(self.vlcid)
                 data = self.video.read(4096)
                 if data and self.clientconnected:
                     self.wfile.write(data)
@@ -186,6 +189,8 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
         self.handleRequest(headers_only)
 
     def handleRequest(self, headers_only):
+      
+        self.unic = uuid.uuid4()  
 
         # Limit concurrent connections
         if 0 < VPConfig.maxconns <= VPStuff.clientcounter.total:
@@ -217,7 +222,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
                 self.params.append('0')
 
         # Adding client to clientcounter
-        clients = VPStuff.clientcounter.add(self.reqtype+'\\'+self.path_unquoted, self.clientip)
+        clients = VPStuff.clientcounter.add(self.reqtype+'\\'+self.path_unquoted, self.clientip, self.unic)
         # If we are the one client, but sucessfully got vp instance from clientcounter,
         # then somebody is waiting in the videodestroydelay state
 
@@ -309,6 +314,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
                 # End headers. Next goes video data
                 self.end_headers()
                 logger.debug("Headers sent")
+                self.headerssent = True
 
             # Run proxyReadWrite
             self.proxyReadWrite()
@@ -332,20 +338,20 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
         finally:
             logger.debug("END REQUEST")
             logger.info("Closed connection from " + self.clientip + " path " + self.path)
-            VPStuff.clientcounter.delete(self.reqtype+'\\'+self.path_unquoted, self.clientip)
-            if not VPStuff.clientcounter.get(self.reqtype+'\\'+self.path_unquoted):
-                try:
-                    logger.debug("That was the last client, destroying VPClient")
-                    logger.info("Stopping broadcasting " + self.path)
-                    VPStuff.vlcclient.stopBroadcast(self.vlcid)
-                except:
-                    pass
-                self.vp.destroy()
-            if not self.headerssent:
-                logger.error("Problem receiving video stream, no headers!")
-                if VPStuff.clientcounter.total == 0:
-                    logger.error("Probably VLC hang")
-                    VPStuff.vlc.kill()
+            VPStuff.clientcounter.delete(self.reqtype+'\\'+self.path_unquoted, self.clientip, self.unic)
+#            if not VPStuff.clientcounter.get(self.reqtype+'\\'+self.path_unquoted):
+#                try:
+#                    logger.debug("That was the last client, destroying VPClient")
+#                    logger.info("Stopping broadcasting " + self.path)
+#                    VPStuff.vlcclient.stopBroadcast(self.vlcid)
+#                except vlcclient.VlcException:    
+#                  logger.error("VLC connection problem, %s client(s)!" % VPStuff.clientcounter.total)
+#                  if VPStuff.clientcounter.total == 0:
+#                      logger.error("Probably VLC hang")
+#                      VPStuff.vlc.kill()
+#                except:
+#                    pass
+            self.vp.destroy()
 
 class HTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
 
@@ -515,6 +521,14 @@ def _reloadconfig(signum=None, frame=None):
     from vpconfig import VPConfig
     logger.info('Config reloaded')
 
+sched = BackgroundScheduler()
+sched.start()
+
+def clean_streams():
+  VPStuff.vlcclient.clean_streams(15)
+
+job = sched.add_job(clean_streams, 'interval', seconds=15)
+
 # setting signal handlers
 try:
     gevent.signal(signal.SIGHUP, _reloadconfig)
@@ -533,7 +547,7 @@ else:
 
 try:
     logger.info("Using gevent %s" % gevent.__version__)
-    logger.info("Using psutil %s" % psutil.__version__)
+    logger.info("Usig psutil %s" % psutil.__version__)
     logger.info("Using VLC %s" % VPStuff.vlcclient._vlcver)
     logger.info("Server started.")
     while True: