'<html><body><h4>Connected clients: ' + str(self.stuff.clientcounter.total) + '</h4>')
connection.wfile.write(
'<h5>Concurrent connections limit: ' + str(self.config.maxconns) + '</h5>')
+ connection.wfile.write('<table border="1"><tr><th>url</th><th>count</th><th>clients</th></tr>')
for i in self.stuff.clientcounter.clients:
- connection.wfile.write(str(i) + ' : ' + str(self.stuff.clientcounter.clients[i][0]) + ' ' +
- str(self.stuff.clientcounter.clients[i][1]) + '<br>')
+ connection.wfile.write('<tr>')
+ connection.wfile.write('<td>' + str(i) + ' </td><td> ' + str(self.stuff.clientcounter.clients[i][0]) + '</td><td>')
+ for client in self.stuff.clientcounter.clients[i][1]:
+ connection.wfile.write(str(client) + '<br>')
+ connection.wfile.write('</td></tr>')
+ connection.wfile.write('</table>')
connection.wfile.write('</body></html>')
class VPConfig():
# Message level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
- debug = logging.INFO
+ debug = logging.WARNING
# HTTP Server host
httphost = '0.0.0.0'
# HTTP Server port
# ----------------------------------------------------
#
# VLC cmd line (use `--file-logging --logfile=filepath` to write log)
- vlccmd = "vlc -I telnet --clock-jitter 0 --network-caching 500 --sout-mux-caching 2000 --telnet-password admin --telnet-port 4212"
+ vlccmd = "cvlc -I telnet --clock-jitter 0 --network-caching 500 --sout-mux-caching 2000 --telnet-password admin --telnet-port 4212 --http-user-agent=\"SmartLabs/1.5.9\""
# VLC spawn timeout
# Adjust this if you get error 'Cannot spawn VLC!'
vlcspawntimeout = 15
vlcforceffmpeg = False
# Delay before closing connection when client disconnects
# In seconds.
- videodestroydelay = 5
+ videodestroydelay = 30
# Pre-buffering timeout. In seconds.
- videotimeout = 30
+ videotimeout = 45
#
# Some video players (mostly STBs and Smart TVs) can generate dummy requests
# to detect MIME-type or something before playing.
'''
GET request handler
'''
+
logger = logging.getLogger('http_HTTPHandler')
self.clientconnected = True
# Don't wait videodestroydelay if error happened
# Connected client IP address
self.clientip = self.request.getpeername()[0]
+ req_headers = self.headers
+ self.client_data = {
+ 'ip': self.clientip,
+ 'forwarded-for': req_headers.get('X-Forwarded-For'),
+ 'client-agent': req_headers.get('User-Agent'),
+ 'uuid': uuid.uuid4()
+ }
+
if VPConfig.firewall:
# If firewall enabled
self.clientinrange = any(map(lambda i: ipaddr.IPAddress(self.clientip) \
def handleRequest(self, headers_only):
- self.unic = uuid.uuid4()
-
# Limit concurrent connections
if 0 < VPConfig.maxconns <= VPStuff.clientcounter.total:
logger.debug("Maximum connections reached, can't serve this")
self.params.append('0')
# Adding client to clientcounter
- clients = VPStuff.clientcounter.add(self.reqtype+'\\'+self.path_unquoted, self.clientip, self.unic)
+ clients = VPStuff.clientcounter.add(self.reqtype+'/'+self.path_unquoted, self.client_data)
# If we are the one client, but sucessfully got vp instance from clientcounter,
# then somebody is waiting in the videodestroydelay state
# Check if we are first client
- if VPStuff.clientcounter.get(self.reqtype+'\\'+self.path_unquoted)==1:
+ if VPStuff.clientcounter.get(self.reqtype+'/'+self.path_unquoted)==1:
logger.debug("First client, should create VLC session")
shouldcreatevp = True
else:
logger.debug("Can reuse existing session")
shouldcreatevp = False
- self.vlcid = hashlib.md5(self.reqtype+'\\'+self.path_unquoted).hexdigest()
+ self.vlcid = hashlib.md5(self.reqtype+'/'+self.path_unquoted).hexdigest()
# Send fake headers if this User-Agent is in fakeheaderuas tuple
if fakeua:
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, 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
+ VPStuff.clientcounter.delete(self.reqtype+'/'+self.path_unquoted, self.client_data)
self.vp.destroy()
class HTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
sched.start()
def clean_streams():
- VPStuff.vlcclient.clean_streams(15)
+ VPStuff.vlcclient.clean_streams(VPConfig.videodestroydelay)
job = sched.add_job(clean_streams, 'interval', seconds=15)
# Return to our server tasks
server.handle_request()
except (KeyboardInterrupt, SystemExit):
+ sched.shutdown()
shutdown()