def render(self, request): """You know what you doing.""" self.restat() if self.type is None: self.type, self.encoding = getTypeAndEncoding( self.basename(), self.contentTypes, self.contentEncodings, self.defaultType) if not self.exists(): return self.childNotFound.render(request) if self.isdir(): return self.redirect(request) #for content-length fsize = size = self.getFileSize() # request.setHeader('accept-ranges','bytes') if self.type: request.setHeader('content-type', self.type) if self.encoding: request.setHeader('content-encoding', self.encoding) try: f = self.openForReading() except IOError, e: import errno if e[0] == errno.EACCES: return error.ForbiddenResource().render(request) else: raise
def render(self, request): #print "" #print "BufferFile", request # FIXME detect when request is REALLY finished if request is None or request.finished : print "No request to render!" return '' """You know what you doing.""" self.restat() if self.type is None: self.type, self.encoding = static.getTypeAndEncoding(self.basename(), self.contentTypes, self.contentEncodings, self.defaultType) if not self.exists(): return self.childNotFound.render(request) if self.isdir(): return self.redirect(request) #for content-length if (self.target_size > 0): fsize = size = int(self.target_size) else: fsize = size = int(self.getFileSize()) #print fsize if size == int(self.getFileSize()): request.setHeader('accept-ranges','bytes') if self.type: request.setHeader('content-type', self.type) if self.encoding: request.setHeader('content-encoding', self.encoding) try: f = self.openForReading() except IOError, e: import errno if e[0] == errno.EACCES: return error.ForbiddenResource().render(request) else: raise
def renderHTTP(self, ctx): """You know what you doing.""" self.fp.restat() if self.type is None: self.type, self.encoding = getTypeAndEncoding( self.fp.basename(), self.contentTypes, self.contentEncodings, self.defaultType) if not self.fp.exists(): return rend.FourOhFour() request = inevow.IRequest(ctx) if self.fp.isdir(): return self.redirect(request) # fsize is the full file size # size is the length of the part actually transmitted fsize = size = self.getFileSize() request.setHeader('accept-ranges', 'bytes') if self.type: request.setHeader('content-type', self.type) if self.encoding: request.setHeader('content-encoding', self.encoding) try: f = self.openForReading() except IOError, e: import errno if e[0] == errno.EACCES: return error.ForbiddenResource().render(request) else: raise
def forbiddenResource(self, *args): return error.ForbiddenResource(*args)
def directoryListing(self): return error.ForbiddenResource()
# Create a new random session name and redirect to it. sessionName = hexlify(pack("<L", getrandbits(47))) request.redirect("/session/" + sessionName) request.finish() return server.NOT_DONE_YET if __name__ == "__main__": root = RootResource() # Mount the directories containing our static files staticDir = static.File("./static/") staticDir.putChild("algorithm", static.File("../algorithm/")) staticDir.directoryListing = lambda: error.ForbiddenResource() root.putChild("static", staticDir) # Create a resource that spawns new sessions as they are accessed root.putChild("session", SessionDispatcherResource()) # Create a transport endpoint that can be accessed using a WebSocket site = WebSocketSite(root) site.addHandler("/transport", TransportHandler) # Start listening listener = reactor.listenTCP(PORT, site) print "EXPERIMENTAL SERVER - Do not use in production environments!" print "Read the README file before using this." print
def render(self, request): #print "" #print "BufferFile", request # FIXME detect when request is REALLY finished if request is None or request.finished: print("No request to render!") return '' """You know what you doing.""" self.restat() if self.type is None: self.type, self.encoding = static.getTypeAndEncoding( self.basename(), self.contentTypes, self.contentEncodings, self.defaultType) if not self.exists(): return self.childNotFound.render(request) if self.isdir(): return self.redirect(request) #for content-length if (self.target_size > 0): fsize = size = int(self.target_size) else: fsize = size = int(self.getFileSize()) #print fsize if size == int(self.getFileSize()): request.setHeader('accept-ranges', 'bytes') if self.type: request.setHeader('content-type', self.type) if self.encoding: request.setHeader('content-encoding', self.encoding) try: f = self.openForReading() except IOError as e: import errno if e[0] == errno.EACCES: return error.ForbiddenResource().render(request) else: raise if request.setLastModified(self.getmtime()) is http.CACHED: return '' trans = True range = request.getHeader('range') #print "StaticFile", range tsize = size if range is not None: # This is a request for partial data... bytesrange = range.split('=') assert bytesrange[0] == 'bytes', \ "Syntactically invalid http range header!" start, end = bytesrange[1].split('-', 1) if start: start = int(start) # Are we requesting something beyond the current size of the file? if (start >= self.getFileSize()): # Retry later! print(bytesrange) print( "Requesting data beyond current scope -> postpone rendering!" ) self.upnp_retry = reactor.callLater( 1.0, self.render, request) return server.NOT_DONE_YET f.seek(start) if end: #print ":%s" % end end = int(end) else: end = size - 1 else: lastbytes = int(end) if size < lastbytes: lastbytes = size start = size - lastbytes f.seek(start) fsize = lastbytes end = size - 1 size = end + 1 fsize = end - int(start) + 1 # start is the byte offset to begin, and end is the byte offset # to end.. fsize is size to send, tsize is the real size of # the file, and size is the byte position to stop sending. if fsize <= 0: request.setResponseCode(http.REQUESTED_RANGE_NOT_SATISFIABLE) fsize = tsize trans = False else: request.setResponseCode(http.PARTIAL_CONTENT) request.setHeader( 'content-range', "bytes %s-%s/%s " % (str(start), str(end), str(tsize))) #print "StaticFile", start, end, tsize request.setHeader('content-length', str(fsize)) if request.method == 'HEAD' or trans == False: # pretend we're a HEAD request, so content-length # won't be overwritten. request.method = 'HEAD' return '' #print "StaticFile out", request.headers, request.code # return data # size is the byte position to stop sending, not how many bytes to send BufferFileTransfer(f, size - f.tell(), request) # and make sure the connection doesn't get closed return server.NOT_DONE_YET