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)
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)
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)