def add_quota_used(self, quota_info, content_uploaded):
        quota_limit = long(quota_info['quota_limit'])
        quota_used = long(quota_info['quota_used'])
        quota_used_afer_put = quota_used + long(content_uploaded)
        
        quota_used_after_put = quota_used + content_uploaded
        if quota_used_after_put > quota_limit:
            self.app.logger.error("StackSync Quota: Quota exceeded. Available space: "+str(quota_limit-quota_used))
            return create_error_response(413, 'Upload exceeds quota.')

        #Notify quota_server for the new quota_used value.
        self.app.logger.info('StackSync Quota: add_quota_used')
        response = self.rpc_server.XmlRpcQuotaHandler.updateAvailableQuota(quota_info['user'], str(quota_used_after_put))
    
        response = create_response(response, status_code=200)
            
        if not is_valid_status(response.status_int):
            self.app.logger.error("StackSync Quota: Error updating quota used")
            return response
    
        return self.app
    def __call__(self, req):
        self.app.logger.info('StackSync Quota start')
        self.app.logger.info(req.environ)
        
        #Check if is a call to object
        _, _, container, swift_object = split_path(req.path, 0, 4, True)
        if not swift_object:
            return self.app
        
        #check if is an authorize reqeuest
        container_info = get_container_info(req.environ, self.app, swift_source='CQ')
        response = self.authorize(req, container_info)
        if response:
            return response
        
        #check if is a valid request
        if not self.valid_request(req):
            # We only want to process PUT and DELETE requests
            return self.app


        quota_info = self.rpc_server.XmlRpcQuotaHandler.getAvailableQuota(container)

        response = create_response(quota_info, status_code=200)
        
        if not is_valid_status(response.status_int):
            if response.status_int == 404:
                # User not found. No StackSync user
                return self.app
            else:
                self.app.logger.error("StackSync Quota: status code: %s. body: %s", str(response.status_int), str(response.body))
                return response
        
        quota_info = json.loads(quota_info)
        
        if req.method == 'PUT':
            return self.add_quota_used(quota_info, long(req.environ["CONTENT_LENGTH"]))
        if req.method == 'DELETE':
            return self.subtract_quota_used(quota_info, req.environ)                   
 def subtract_quota_used(self, quota_info, env):
     # HEAD to swift resource to know the content length
     quota_limit = long(quota_info['quota_limit'])
     quota_used = long(quota_info['quota_used'])
     
     object_info = get_object_info(env, self.app, env['PATH_INFO'])
     if not object_info or not object_info['length']:
         content_to_delete = 0
     else:
         content_to_delete = long(object_info['length'])
     
     quota_used_after_delete = quota_used - content_to_delete
     
     #send new quota to quota server
     self.app.logger.info('StackSync Quota: subtract_quota_used')
     response = self.rpc_server.XmlRpcQuotaHandler.updateAvailableQuota(quota_info['user'], str(quota_used_after_delete))
     
     response = create_response(response, status_code=200)
         
     if not is_valid_status(response.status_int):
         self.app.logger.error("StackSync Quota: Error updating quota used")
         return response
     
     return self.app