Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
 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)