def __call__(self, env, start_response):
        req = Request(env)
        try:
            version, account, container, obj = req.split_path(1, 4, True)
        except ValueError:
            return self.app(env, start_response)

        def iter_response(iterable):
            key = account
            iterator = iter(iterable)
            try:
                chunk = iterator.next()
                while not chunk:
                    chunk = iterator.next()
            except StopIteration:
                chunk = ''

            try:
                while chunk:
                    self.cache.inc_read_bytes(key, delta=len(chunk))
                    yield chunk
                    current_time = time.time()
                    self.cache.reset_bytes(current_time)
                    if self.cache.get_read_bytes(
                            key) >= self.cache.get_read_limit(key):
                        self.logger.debug('Going to sleep for %s seconds '\
                                          'Key:%s, read_bytes:%s, read_limit:%s '\
                                          %(self.cache.next_reset_time - current_time,\
                                            key, self.cache.get_read_bytes(key),\
                                            self.cache.get_read_limit(key)))
                        _sleep(self.cache.next_reset_time - current_time)
                    chunk = iterator.next()
            except GeneratorExit:  # generator was closed before we finished
                raise
            finally:
                self.cache.dec_req_count(key)

        bw_control_resp = self.handle_bw_control(req, account, container, obj)
        if not bw_control_resp:
            return self.app(env, start_response)
        else:
            try:
                iterable = self.app(env, start_response)
                return iter_response(iterable)
            except Exception:
                raise
            return iter_response(iterable)
Exemple #2
0
    def __call__(self, env, start_response):
        """
        WSGI entry point
        """
        req = Request(env)
        try:
            vrs, account, container, obj = req.split_path(4, 4, True)
        except ValueError:
            return self.app(env, start_response)

        # install our COPY-callback hook
        env['swift.copy_hook'] = self.copy_hook(
            env.get('swift.copy_hook',
                    lambda src_req, src_resp, sink_req: src_resp))

        try:
            if req.method == 'PUT' and \
                    req.params.get('multipart-manifest') == 'put':
                return self.handle_multipart_put(req, start_response)
            if req.method == 'DELETE' and \
                    req.params.get('multipart-manifest') == 'delete':
                #                return self.handle_multipart_delete(req)(env, start_response)
                objects = self.handle_multipart_delete(req)
                ob = '\n'.join(objects)
                env['CONTENT_LENGTH'] = len(str(ob))
                env['wsgi.input'] = StringIO(ob)
                env['HTTP_X_BULK_DELETE'] = 'True'
                env['PATH_INFO'] = "/".join(env['PATH_INFO'].split("/")[:4])
                return self.app(env, start_response)
            if req.method == 'GET' or req.method == 'HEAD':
                return self.handle_multipart_get_or_head(req, start_response)
            if 'X-Static-Large-Object' in req.headers:
                raise HTTPBadRequest(
                    request=req,
                    body='X-Static-Large-Object is a reserved header. '
                    'To create a static large object add query param '
                    'multipart-manifest=put.')
        except HTTPException as err_resp:
            return err_resp(env, start_response)

        return self.app(env, start_response)
Exemple #3
0
    def __call__(self, env, start_response):
        """
        WSGI entry point.
        Wraps env in swob.Request object and passes it down.

        :param env: WSGI environment dictionary
        :param start_response: WSGI callable
        """
        req = Request(env)
        if self.memcache_client is None:
            self.memcache_client = cache_from_env(env)
        if not self.memcache_client:
            self.logger.warning(
                _('Warning: Cannot ratelimit without a memcached client'))
            return self.app(env, start_response)
        try:
            version, account, container, obj = req.split_path(1, 4, True)
        except ValueError:
            return self.app(env, start_response)
        ratelimit_resp = self.handle_ratelimit(req, account, container, obj)
        if ratelimit_resp is None:
            return self.app(env, start_response)
        else:
            return ratelimit_resp(env, start_response)