def __init__(self, uri): self.uri = uri _, host_port, path, _, _ = urlsplit(uri) if host_port.find(':') != -1: host, port = tuple(host_port.split(':')) port = int(port) else: host = host_port port = 80 ReverseProxyResource.__init__(self, host, port, path)
def proxyURL(self, request): self.info("proxy_mode: %s, request %s" % (self.proxy_mode,request.method)) if self.proxy_mode == 'redirect': # send stream url to client for redirection request.redirect(self.stream_url) request.finish() elif self.proxy_mode in ('proxy',): res = ReverseProxyResource.render(self,request) if isinstance(res,int): return res request.write(res) return elif self.proxy_mode in ('buffer','buffered'): # download stream to cache, # and send it to the client in // after X bytes filepath = os.path.join(self.cache_directory, self.id) file_is_already_available = False if (os.path.exists(filepath) and os.path.getsize(filepath) == self.filesize): res = self.renderFile(request, filepath) if isinstance(res,int): return res request.write(res) request.finish() else: if request.method != 'HEAD': self.downloadFile(request, filepath, None) range = request.getHeader('range') if range is not None: bytesrange = range.split('=') assert bytesrange[0] == 'bytes',\ "Syntactically invalid http range header!" start, end = bytesrange[1].split('-', 1) #print "%r %r" %(start,end) if start: start = int(start) if end: end = int(end) else: end = self.filesize -1 # Are we requesting something beyond the current size of the file? try: size = os.path.getsize(filepath) except OSError: size = 0 if (start >= size and end+10 > self.filesize and end-start < 200000): #print "let's hand that through, it is probably a mp4 index request" res = ReverseProxyResource.render(self,request) if isinstance(res,int): return res request.write(res) return res = self.renderBufferFile (request, filepath, self.buffer_size) if res == '' and request.method != 'HEAD': return server.NOT_DONE_YET if not isinstance(res,int): request.write(res) if request.method == 'HEAD': request.finish() else: self.warning("Unsupported Proxy Mode: %s" % self.proxy_mode) return self.requestFinished(None)
def proxyURL(self, request): self.info(f'proxy_mode: {self.proxy_mode}, request {request.method}') if self.proxy_mode == 'redirect': # send stream url to client for redirection request.redirect(self.stream_url) request.finish() elif self.proxy_mode in ('proxy',): res = ReverseProxyResource.render(self, request) if isinstance(res, int): return res request.write(res) return elif self.proxy_mode in ('buffer', 'buffered'): # download stream to cache, # and send it to the client in // after X bytes filepath = os.path.join(self.cache_directory, self.id) file_is_already_available = False if (os.path.exists(filepath) and os.path.getsize(filepath) == self.filesize): res = self.renderFile(request, filepath) if isinstance(res, int): return res request.write(res) request.finish() else: if request.method != 'HEAD': self.downloadFile(request, filepath, None) range = request.getHeader('range') if range is not None: bytesrange = range.split('=') assert bytesrange[0] == 'bytes', \ 'Syntactically invalid http range header!' start, end = bytesrange[1].split('-', 1) # print('%r %r' %(start,end)) if start: start = int(start) if end: end = int(end) else: end = self.filesize - 1 # Are we requesting something # beyond the current size of the file? try: size = os.path.getsize(filepath) except OSError: size = 0 if (start >= size and end + 10 > self.filesize and end - start < 200000): # print 'let's hand that through, # it is probably a mp4 index request' res = ReverseProxyResource.render( self, request) if isinstance(res, int): return res request.write(res) return res = self.renderBufferFile( request, filepath, self.buffer_size) if res == '' and request.method != 'HEAD': return server.NOT_DONE_YET if not isinstance(res, int): request.write(res) if request.method == 'HEAD': request.finish() else: self.warning(f'Unsupported Proxy Mode: {self.proxy_mode}') return self.requestFinished(None)