def save_object(self, env): # Restorer 데몬에 의해 호출됨 req = Request(env) self._split_request_path(req) try: disk_file = self.get_diskfile(self.device, self.partition, self.account, self.container, self.obj) except DiskFileDeviceUnavailable: return HTTPInsufficientStorage(drive=self.device, request=Request(env)) ori_meta = disk_file.read_metadata() metadata = {} metadata.update(val for val in req.headers.iteritems() if is_user_meta('object', val[0])) del metadata['X-Object-Meta-S3-Restored'] # Timestamp 값 유지 metadata['X-Timestamp'] = ori_meta['X-Timestamp'] metadata['Content-Type'] = ori_meta['Content-Type'] fsize = req.message_length() etag = md5() try: with disk_file.create(size=fsize) as writer: def timeout_reader(): with ChunkReadTimeout(60): return req.environ['wsgi.input'].read(65536) try: for chunk in iter(lambda: timeout_reader(), ''): etag.update(chunk) writer.write(chunk) except ChunkReadTimeout: return HTTPRequestTimeout(request=req) etag = etag.hexdigest() metadata['ETag'] = etag metadata['Content-Length'] = str(fsize) writer.put(metadata) except DiskFileNoSpace: return HTTPInsufficientStorage(drive=self.device, request=req) return HTTPCreated(request=req, etag=etag)