def render(self, request): rlen = len(request.postpath) if request.method in [GET, HEAD] and rlen == 0: return self.render_GET(request) elif request.method == POST and rlen in [0, 1]: return self.render_POST(request) elif len(request.postpath) == 1: return self._processResource(request) elif request.method == GET and rlen >= 2: if isInteger(request.postpath[1]): if rlen == 2: return self._processRevision(request) elif rlen == 3 and request.postpath[2].startswith('.'): name = request.postpath.pop(0) request.prepath.append(name) revision = request.postpath.pop(0) request.prepath.append(revision) return RESTProperty(self.package_id, self.resourcetype_id, name, revision) elif request.postpath[1].startswith('.'): name = request.postpath.pop(0) request.prepath.append(name) return RESTProperty(self.package_id, self.resourcetype_id, name) allowed_methods = getattr(self, 'allowedMethods', ()) msg = "This operation is not allowed on this resource." raise NotAllowedError(allowed_methods=allowed_methods, message=msg)
def render_GET(self, request): """ Handles all GET requests. """ rlen = len(request.postpath) # If nothing else is given, just render a list of every resource of # this type. if rlen == 0: return self.renderResourceList(request) # Special .meta resource renders information about the resource type. elif rlen == 1 and request.postpath[0] == ".meta": return self.renderMetaInformation(request) # Otherwise attempt to render the most recent version of the specified # resource. elif rlen == 1: name = request.postpath.pop(0) request.prepath.append(name) res = request.env.catalog.getResource(self.package_id, self.resourcetype_id, name, revision=None) return RESTResource(res) # Longer paths can either request certain revisions of a resource or # metainformation of the resource. revision = None name = request.postpath.pop(0) request.prepath.append(name) if request.postpath and isInteger(request.postpath[0]): revision = request.postpath.pop(0) request.prepath.append(revision) # Property requests if request.postpath and request.postpath[0].startswith("."): return RESTProperty(self.package_id, self.resourcetype_id, name, revision=revision) # Finally return the resource. res = request.env.catalog.getResource(self.package_id, self.resourcetype_id, name, revision=revision) return RESTResource(res)
fsize = size = obj.getsize() self.setHeader('content-length', str(fsize)) if self.method == HEAD: self.write('') self.finish() return # accept range self.setHeader('accept-ranges', 'bytes') range = self.getHeader('range') # a request for partial data, e.g. Range: bytes=160694272- if range and 'bytes=' in range and '-' in range.split('=')[1]: parts = range.split('bytes=')[1].strip().split('-') if len(parts) == 2: start = parts[0] end = parts[1] if isInteger(start): fp.seek(int(start)) if isInteger(end): end = int(end) size = end else: end = size self.setResponseCode(http.PARTIAL_CONTENT) self.setHeader('content-range', "bytes %s-%s/%s " % ( str(start), str(end), str(size))) #content-length should be the actual size of the stuff we're #sending, not the full size of the on-server entity. fsize = end - int(start) self.setHeader('content-length', str(fsize)) # start the file transfer sp = static.SingleRangeStaticProducer(self, fp, start, fsize)