def _get_all(self, element_map, initial_query_string='', headers=None, **params): query_args = self._get_all_query_args( params, initial_query_string=initial_query_string) response = self.connection.make_request('GET', self.name, headers=headers, query_args=query_args) body = response.read() if response.status == 200: rs = ResultSet(element_map) h = handler.XmlHandler(rs, self) if not isinstance(body, bytes): body = body.encode('utf-8') try: xml.sax.parseString(body, h) except Exception as exc: print "There have exception {0}, use alternative method".format( str(exc)) doc = PyQuery(body) for content in doc('Contents').items(): new_key = Key(bucket=self) new_key.name = content('Key').text() new_key.etag = content('Etag').text() new_key.size = content('Size').text() new_key.last_modified = content('LastModified').text() new_key.storage_class = content('StorageClass').text() rs.append(new_key) return rs else: raise S3ResponseError(response.status, response.reason, body)
def get_adp(self, task_id): query_args = 'queryadp' response = self.make_request('GET', task_id, query_args=query_args) body = response.read() if response.status != 200: raise S3ResponseError(response.status, response.reason, body) return body
def _get_key_internal(self, key_name, headers, query_args_l): query_args = query_args_l or None response = self.connection.make_request('HEAD', self.name, key_name, headers=headers, query_args=query_args) response.read() # Allow any success status (2xx) - for example this lets us # support Range gets, which return status 206: if response.status / 100 == 2: k = Key(self) #provider = self.connection.provider #k.metadata = boto.utils.get_aws_metadata(response.msg, provider) for field in Key.base_fields: k.__dict__[field.lower().replace('-', '_')] = \ response.getheader(field) # the following machinations are a workaround to the fact that # apache/fastcgi omits the content-length header on HEAD # requests when the content-length is zero. # See http://goo.gl/0Tdax for more details. clen = response.getheader('content-length') if clen: k.size = int(response.getheader('content-length')) else: k.size = 0 k.name = key_name k.handle_version_headers(response) k.handle_encryption_headers(response) k.handle_restore_headers(response) k.handle_addl_headers(response.getheaders()) return k, response else: if response.status == 404: return None, response else: raise S3ResponseError(response.status, response.reason, None)
def set_xml_logging(self, logging_str, headers=None): """ Set logging on a bucket directly to the given xml string. :type logging_str: unicode string :param logging_str: The XML for the bucketloggingstatus which will be set. The string will be converted to utf-8 before it is sent. Usually, you will obtain this XML from the BucketLogging object. :rtype: bool :return: True if ok or raises an exception. """ body = logging_str if not isinstance(body, bytes): body = body.encode('utf-8') response = self.connection.make_request('PUT', self.name, data=body, query_args='logging', headers=headers) body = response.read() if response.status == 200: return True else: raise S3ResponseError(response.status, response.reason, body)
def create_bucket(self, bucket_name, headers=None, location=None, policy=None): check_lowercase_bucketname(bucket_name) if policy: if headers: headers[self.provider.acl_header] = policy else: headers = {self.provider.acl_header: policy} if location == None: data = '' else: data = '<CreateBucketConfiguration><LocationConstraint>' + \ location + '</LocationConstraint></CreateBucketConfiguration>' response = self.make_request('PUT', bucket_name, headers=headers, data=data) body = response.read() if response.status == 409: raise S3CreateError(response.status, response.reason, body) if response.status == 200: return Bucket(self, bucket_name) else: raise S3ResponseError(response.status, response.reason, body)
def restore_object(self, object_key, headers=None): response = self.connection.make_request('POST', self.name, object_key, query_args='restore', headers=headers) body = response.read() if response.status == 200 or response.status == 202: return True else: raise S3ResponseError(response.status, response.reason, body)
def delete_bucket_crr(self, headers=None): response = self.connection.make_request('DELETE', self.name, query_args='crr', headers=headers) body = response.read() if response.status == 200: return None else: raise S3ResponseError(response.status, response.reason, body)
def get_bucket_policy(self, headers=None): response = self.connection.make_request('GET', self.name, query_args='policy', headers=headers) body = response.read() if response.status == 200: return body else: raise S3ResponseError(response.status, response.reason, body)
def set_bucket_policy(self, policy, headers=None): response = self.connection.make_request('PUT', self.name, data=policy, query_args='policy', headers=headers) body = response.read() if response.status == 204: return True else: raise S3ResponseError(response.status, response.reason, body)
def set_adp(self, key_name, headers): query_args = 'adp' response = self.connection.make_request('PUT', self.name, key_name, headers=headers, query_args=query_args) body = response.read() if response.status != 200: raise S3ResponseError(response.status, response.reason, body) task_id = response.getheader("TaskID") return task_id
def get_bucket_location(self, bucket_name): response = self.make_request('GET', bucket_name, query_args='location') body = response.read() if response.status == 200: loc = BucketLocation() h = handler.XmlHandler(loc, self) xml.sax.parseString(body, h) return loc.location else: raise S3ResponseError(response.status, response.reason, body)
def delete_object_tagging(self, object_key, version_id=None, headers=None): query_args = 'tagging' if version_id is not None: query_args = query_args + '&versionId=' + version_id response = self.connection.make_request('DELETE', self.name, object_key, query_args=query_args, headers=headers) body = response.read() if response.status == 204: return None else: raise S3ResponseError(response.status, response.reason, body)
def delete_bucket(self, bucket_name, headers=None): """ Removes an S3 bucket. In order to remove the bucket, it must first be empty. If the bucket is not empty, an ``S3ResponseError`` will be raised. """ response = self.make_request('DELETE', bucket_name, headers=headers) body = response.read() if response.status != 204: raise S3ResponseError(response.status, response.reason, body)
def get_all_buckets(self, headers=None): response = self.make_request('GET', headers=headers) body = response.read() if response.status > 300: raise S3ResponseError(response.status, response.reason, body) rs = ResultSet([('Bucket', Bucket)]) h = handler.XmlHandler(rs, self) if not isinstance(body, bytes): body = body.encode('utf-8') xml.sax.parseString(body, h) return rs
def set_xml_acl(self, acl_str, key_name='', headers=None, version_id=None, query_args='acl'): if version_id: query_arg['versionId'] = version_id if not isinstance(acl_str, bytes): acl_str = acl_str.encode('utf-8') response = self.connection.make_request('PUT', self.name, key_name, data=acl_str, query_args=query_args, headers=headers) body = response.read() if response.status != 200: raise S3ResponseError(response.status, response.reason, body)
def get_bucket_versioning(self, headers=None): response = self.connection.make_request('GET', self.name, query_args='versioning', headers=headers) body = response.read() if response.status == 200: versioningConfig = BucketVersioningConfig() h = handler.XmlHandler(versioningConfig, self) if not isinstance(body, bytes): body = body.encode('utf-8') xml.sax.parseString(body, h) return versioningConfig else: raise S3ResponseError(response.status, response.reason, body)
def get_bucket_lifecyle(self, headers=None): response = self.connection.make_request('GET', self.name, query_args='lifecycle', headers=headers) body = response.read() if response.status == 200: lifecyle = BucketLifecyle() h = handler.XmlHandler(lifecyle, self) if not isinstance(body, bytes): body = body.encode('utf-8') xml.sax.parseString(body, h) return lifecyle else: raise S3ResponseError(response.status, response.reason, body)
def fetch_object(self, object_key, source_url=None, callback_url=None, headers=None): if headers is None: headers = {} if source_url is not None: headers['x-kss-sourceurl'] = source_url if callback_url is not None: headers['x-kss-callbackurl'] = callback_url response = self.connection.make_request('PUT', self.name, object_key, query_args='fetch', headers=headers) body = response.read() if response.status == 200: return None else: raise S3ResponseError(response.status, response.reason, body)
def set_bucket_lifecycle(self, bucketLifecyle, headers=None): if headers is None: headers = {} bucketLifecyle_xml = bucketLifecyle.to_xml() if not isinstance(bucketLifecyle_xml, bytes): bucketLifecyle_xml = bucketLifecyle_xml.encode('utf-8') md5 = ks3.utils.compute_base64_md5_digest(bucketLifecyle_xml) headers['Content-MD5'] = md5 headers['application/xml'] = 'application/xml' response = self.connection.make_request('PUT', self.name, data=bucketLifecyle_xml, query_args='lifecycle', headers=headers) body = response.read() if response.status == 200: return None else: raise S3ResponseError(response.status, response.reason, body)
def get_acl(self, key_name='', headers=None, version_id=None): query_args = 'acl' if version_id: query_args += '&versionId=%s' % version_id response = self.connection.make_request('GET', self.name, key_name, query_args=query_args, headers=headers) body = response.read() if response.status == 200: policy = Policy(self) h = handler.XmlHandler(policy, self) if not isinstance(body, bytes): body = body.encode('utf-8') xml.sax.parseString(body, h) return policy else: raise S3ResponseError(response.status, response.reason, body)
def set_canned_acl(self, acl_str, key_name='', headers=None, version_id=None): assert acl_str in CannedACLStrings if headers: headers[self.connection.provider.acl_header] = acl_str else: headers = {self.connection.provider.acl_header: acl_str} query_args = 'acl' if version_id: query_args += '&versionId=%s' % version_id response = self.connection.make_request('PUT', self.name, key_name, headers=headers, query_args=query_args) body = response.read() if response.status != 200: raise S3ResponseError(response.status, response.reason, body)
def set_bucket_crr(self, targetBucket, deleteMarkerStatus=None, prefix=None, region=None, headers=None): replicate = BucketCrossReplicate(targetBucket, deleteMarkerStatus, prefix, region) if headers is None: headers = {} headers['Content-Type'] = 'text/xml' replicate_xml = replicate.to_xml() if not isinstance(replicate_xml, bytes): replicate_xml = replicate_xml.encode('utf-8') md5 = ks3.utils.compute_base64_md5_digest(replicate_xml) headers['Content-MD5'] = md5 response = self.connection.make_request('PUT', self.name, data=replicate_xml, query_args='crr', headers=headers) body = response.read() if response.status == 200: return True else: raise S3ResponseError(response.status, response.reason, body)
def get_object_tagging(self, object_key, version_id=None, headers=None): query_args = 'tagging' if version_id is not None: query_args = query_args + '&versionId=' + version_id response = self.connection.make_request('GET', self.name, object_key, query_args=query_args, headers=headers) body = response.read() if response.status == 200: objectTagging = ObjectTagging() h = handler.XmlHandler(objectTagging, self) if not isinstance(body, bytes): body = body.encode('utf-8') xml.sax.parseString(body, h) return objectTagging else: raise S3ResponseError(response.status, response.reason, body)
def set_bucket_versioning(self, version_configuration, headers=None): if headers is None: headers = {} version_configuration_xml = version_configuration.to_xml() if not isinstance(version_configuration_xml, bytes): version_configuration_xml = version_configuration_xml.encode('utf-8') md5 = ks3.utils.compute_base64_md5_digest(version_configuration_xml) headers['Content-MD5'] = md5 headers['application/xml'] = 'application/xml' response = self.connection.make_request('PUT', self.name, data=version_configuration_xml, query_args='versioning', headers=headers) body = response.read() if response.status == 200: return None else: raise S3ResponseError(response.status, response.reason, body)
def _get_all(self, element_map, initial_query_string='', headers=None, **params): query_args = self._get_all_query_args( params, initial_query_string=initial_query_string ) response = self.connection.make_request('GET', self.name, headers=headers, query_args=query_args) body = response.read() if response.status == 200: rs = ResultSet(element_map) h = handler.XmlHandler(rs, self) if not isinstance(body, bytes): body = body.encode('utf-8') xml.sax.parseString(body, h) return rs else: raise S3ResponseError(response.status, response.reason, body)
def get_logging_status(self, headers=None): """ Get the logging status for this bucket. :rtype: :class:`boto.s3.bucketlogging.BucketLogging` :return: A BucketLogging object for this bucket. """ response = self.connection.make_request('GET', self.name, query_args='logging', headers=headers) body = response.read() if response.status == 200: blogging = BucketLogging() h = handler.XmlHandler(blogging, self) if not isinstance(body, bytes): body = body.encode('utf-8') xml.sax.parseString(body, h) return blogging else: raise S3ResponseError(response.status, response.reason, body)
def set_bucket_quota(self, headers=None, quota=0): """ :param quota: bucket quota default 0 not limit :param headers: custom header :return: True is ok or raises an exception. """ bucketQuota = BucketQuota(quota) quota_to_xml = bucketQuota.to_xml() if not isinstance(quota_to_xml, bytes): quota_to_xml = quota_to_xml.encode('utf-8') if headers is None: headers = {} headers['Content-Type'] = 'text/xml' response = self.connection.make_request('PUT', self.name, data=quota_to_xml, query_args='quota', headers=headers) body = response.read() if response.status == 200: return True else: raise S3ResponseError(response.status, response.reason, body)
def set_object_tagging(self, object_key, tagging_set, version_id=None, headers=None): object_tagging = ObjectTagging(tagging_set) if headers is None: headers = {} headers['Content-Type'] = 'text/xml' object_tagging_xml = object_tagging.to_xml() if not isinstance(object_tagging_xml, bytes): object_tagging_xml = object_tagging_xml.encode('utf-8') query_args = 'tagging' if version_id is not None: query_args = query_args + '&versionId=' + version_id response = self.connection.make_request('PUT', self.name, object_key, data=object_tagging_xml, query_args=query_args, headers=headers) body = response.read() if response.status == 200: return True else: raise S3ResponseError(response.status, response.reason, body)
def _get_all(self, element_map, initial_query_string='', headers=None, **params): query_args = self._get_all_query_args( params, initial_query_string=initial_query_string) response = self.connection.make_request('GET', self.name, headers=headers, query_args=query_args) body = response.read() if response.status == 200: rs = ResultSet(element_map) h = handler.XmlHandler(rs, self) if not isinstance(body, bytes): body = body.encode('utf-8') try: xml.sax.parseString(body, h) except: print "My Func" doc = PyQuery(body) for content in doc('Contents').items(): new_key = Key(bucket=self) new_key.name = content('Key').text() new_key.etag = content('Etag').text() new_key.size = content('Size').text() new_key.last_modified = content('LastModified').text() new_key.storage_class = content('StorageClass').text() rs.append(new_key) # k_name_list = re.findall('<Key>([\d\D]+?)</Key>', body) # for k_name in k_name_list: # kkk = Key() # kkk.name = unicode(k_name) # rs.append(kkk) return rs else: raise S3ResponseError(response.status, response.reason, body)