def open_write(self, key, metadata=None, is_compressed=False, extra_headers=None): """ The returned object will buffer all data and only start the upload when its `close` method is called. """ log.debug('started with %s', key) headers = CaseInsensitiveDict() if extra_headers is not None: headers.update(extra_headers) if metadata is None: metadata = dict() self._add_meta_headers(headers, metadata) return ObjectW(key, self, headers)
def copy(self, src, dest, metadata=None, extra_headers=None): log.debug('started with %s, %s', src, dest) headers = CaseInsensitiveDict() if extra_headers is not None: headers.update(extra_headers) headers[self.hdr_prefix + 'copy-source'] = \ urllib.parse.quote('/%s/%s%s' % (self.bucket_name, self.prefix, src)) if metadata is None: headers[self.hdr_prefix + 'metadata-directive'] = 'COPY' else: headers[self.hdr_prefix + 'metadata-directive'] = 'REPLACE' self._add_meta_headers(headers, metadata) try: resp = self._do_request('PUT', '/%s%s' % (self.prefix, dest), headers=headers) except NoSuchKeyError: raise NoSuchObject(src) # When copying, S3 may return error despite a 200 OK status # http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html # https://doc.s3.amazonaws.com/proposals/copy.html if self.options.get('dumb-copy', False): self.conn.discard() return body = self.conn.readall() root = self._parse_xml_response(resp, body) # Some S3 implemenentations do not have a namespace on # CopyObjectResult. if root.tag in [ self.xml_ns_prefix + 'CopyObjectResult', 'CopyObjectResult' ]: return elif root.tag in [self.xml_ns_prefix + 'Error', 'Error']: raise get_S3Error(root.findtext('Code'), root.findtext('Message'), resp.headers) else: log.error('Unexpected server reply to copy operation:\n%s', self._dump_response(resp, body)) raise RuntimeError('Copy response has %s as root tag' % root.tag)
def copy(self, src, dest, metadata=None, extra_headers=None): log.debug('started with %s, %s', src, dest) headers = CaseInsensitiveDict() if extra_headers is not None: headers.update(extra_headers) headers[self.hdr_prefix + 'copy-source'] = \ urllib.parse.quote('/%s/%s%s' % (self.bucket_name, self.prefix, src)) if metadata is None: headers[self.hdr_prefix + 'metadata-directive'] = 'COPY' else: headers[self.hdr_prefix + 'metadata-directive'] = 'REPLACE' self._add_meta_headers(headers, metadata) try: resp = self._do_request('PUT', '/%s%s' % (self.prefix, dest), headers=headers) except NoSuchKeyError: raise NoSuchObject(src) # When copying, S3 may return error despite a 200 OK status # http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html # https://doc.s3.amazonaws.com/proposals/copy.html if self.options.get('dumb-copy', False): self.conn.discard() return body = self.conn.readall() root = self._parse_xml_response(resp, body) # Some S3 implemenentations do not have a namespace on # CopyObjectResult. if root.tag in [self.xml_ns_prefix + 'CopyObjectResult', 'CopyObjectResult']: return elif root.tag in [self.xml_ns_prefix + 'Error', 'Error']: raise get_S3Error(root.findtext('Code'), root.findtext('Message'), resp.headers) else: log.error('Unexpected server reply to copy operation:\n%s', self._dump_response(resp, body)) raise RuntimeError('Copy response has %s as root tag' % root.tag)