X-Git-Url: https://git.rvb.name/vpproxy.git/blobdiff_plain/1e2c0e679beb33f10c2e551768c17ccd77576b54..3a3df745c628e61204c0444f912f74a55d1d38d1:/vphttp.py diff --git a/vphttp.py b/vphttp.py index 9046563..6108bd8 100644 --- a/vphttp.py +++ b/vphttp.py @@ -9,8 +9,9 @@ import traceback import gevent import gevent.monkey # Monkeypatching and all the stuff - gevent.monkey.patch_all() +# Startup delay for daemon restart +gevent.sleep(5) import glob import os import signal @@ -163,7 +164,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): self.reqtype = self.splittedpath[1].lower() # If first parameter is 'pid' or 'torrent' or it should be handled # by plugin - if not (self.reqtype=='get' or self.reqtype in VPStuff.pluginshandlers): + if not (self.reqtype in ('get','mp4','webm') or self.reqtype in VPStuff.pluginshandlers): self.dieWithError(400) # 400 Bad Request return except IndexError: @@ -186,6 +187,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): def handleRequest(self, headers_only): # Limit concurrent connections + print VPStuff.clientcounter.total if 0 < VPConfig.maxconns <= VPStuff.clientcounter.total: logger.debug("Maximum connections reached, can't serve this") self.dieWithError(503) # 503 Service Unavailable @@ -193,6 +195,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): # Pretend to work fine with Fake UAs or HEAD request. useragent = self.headers.get('User-Agent') + logger.debug("HTTP User Agent:"+useragent) fakeua = useragent and useragent in VPConfig.fakeuas if headers_only or fakeua: if fakeua: @@ -214,19 +217,19 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): self.params.append('0') # Adding client to clientcounter - clients = VPStuff.clientcounter.add(self.path_unquoted, self.clientip) + clients = VPStuff.clientcounter.add(self.reqtype+'\\'+self.path_unquoted, self.clientip) # 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.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.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: @@ -243,12 +246,9 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): logger.debug("hangDetector spawned") gevent.sleep() - # Initializing VPClient - # Getting URL self.errorhappened = False - print shouldcreatevp if shouldcreatevp: logger.debug("Got url " + self.path_unquoted) # Force ffmpeg demuxing if set in config @@ -257,8 +257,9 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): else: self.vlcprefix = '' + logger.info("Starting broadcasting "+self.path) VPStuff.vlcclient.startBroadcast( - self.vlcid, self.vlcprefix + self.path_unquoted, VPConfig.vlcmux, VPConfig.vlcpreaccess) + self.vlcid, self.vlcprefix + self.path_unquoted, VPConfig.vlcmux, VPConfig.vlcpreaccess, self.reqtype) # Sleep a bit, because sometimes VLC doesn't open port in # time gevent.sleep(0.5) @@ -284,11 +285,14 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): del self.video.info().dict['server'] if self.video.info().dict.has_key('transfer-encoding'): del self.video.info().dict['transfer-encoding'] + if self.video.info().dict.has_key('content-type'): + del self.video.info().dict['content-type'] if self.video.info().dict.has_key('keep-alive'): del self.video.info().dict['keep-alive'] for key in self.video.info().dict: self.send_header(key, self.video.info().dict[key]) + self.send_header("Content-Type", "video/mpeg") # End headers. Next goes video data self.end_headers() logger.debug("Headers sent") @@ -311,14 +315,15 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): # Unknown exception logger.error(traceback.format_exc()) self.errorhappened = True - raise self.dieWithError() finally: logger.debug("END REQUEST") - VPStuff.clientcounter.delete(self.path_unquoted, self.clientip) - if not VPStuff.clientcounter.get(self.path_unquoted): + 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 @@ -417,7 +422,7 @@ DEVNULL = open(os.devnull, 'wb') # Spawning procedures def spawnVLC(cmd, delay = 0): try: - VPStuff.vlc = psutil.Popen(cmd, stdout=DEVNULL, stderr=DEVNULL) + VPStuff.vlc = psutil.Popen(cmd) #, stdout=DEVNULL, stderr=DEVNULL) gevent.sleep(delay) return True except: @@ -430,7 +435,6 @@ def connectVLC(): out_port=VPConfig.vlcoutport) return True except vlcclient.VlcException as e: - print repr(e) return False def isRunning(process):