94 lines
3.5 KiB
Python
94 lines
3.5 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from openstack import exceptions
|
|
from openstack.object_store import object_store_service
|
|
from openstack import resource
|
|
from openstack import utils
|
|
|
|
|
|
class Object(resource.Resource):
|
|
base_path = "/%(container)s"
|
|
service = object_store_service.ObjectStoreService()
|
|
id_attribute = "name"
|
|
|
|
allow_create = True
|
|
allow_retrieve = True
|
|
allow_update = True
|
|
allow_delete = True
|
|
allow_list = True
|
|
allow_head = True
|
|
|
|
# URL parameters
|
|
container = resource.prop("container")
|
|
name = resource.prop("name")
|
|
|
|
# Object details
|
|
hash = resource.prop("hash")
|
|
bytes = resource.prop("bytes")
|
|
|
|
# Headers for HEAD and GET requests
|
|
auth_token = resource.prop("x-auth-token")
|
|
newest = resource.prop("x-newest", type=bool)
|
|
range = resource.prop("range", type=dict)
|
|
if_match = resource.prop("if-match", type=dict)
|
|
if_none_match = resource.prop("if-none-match", type=dict)
|
|
if_modified_since = resource.prop("if-modified-since", type=dict)
|
|
if_unmodified_since = resource.prop("if-unmodified-since", type=dict)
|
|
|
|
# Query parameters
|
|
signature = resource.prop("signature")
|
|
expires = resource.prop("expires")
|
|
multipart_manifest = resource.prop("multipart-manifest")
|
|
|
|
# Response headers from HEAD and GET
|
|
content_length = resource.prop("content-length")
|
|
content_type = resource.prop("content-type")
|
|
accept_ranges = resource.prop("accept-ranges")
|
|
last_modified = resource.prop("last-modified")
|
|
etag = resource.prop("etag")
|
|
is_static_large_object = resource.prop("x-static-large-object")
|
|
date = resource.prop("date")
|
|
content_encoding = resource.prop("content-encoding")
|
|
content_disposition = resource.prop("content-disposition")
|
|
delete_at = resource.prop("x-delete-at", type=int)
|
|
object_manifest = resource.prop("x-object-manifest")
|
|
timestamp = resource.prop("x-timestamp")
|
|
|
|
# Headers for PUT and POST requests
|
|
transfer_encoding = resource.prop("transfer-encoding")
|
|
detect_content_type = resource.prop("x-detect-content-type", type=bool)
|
|
copy_from = resource.prop("x-copy-from")
|
|
delete_after = resource.prop("x-delete-after", type=int)
|
|
|
|
def get(self, session):
|
|
if not self.allow_retrieve:
|
|
raise exceptions.MethodNotSupported('retrieve')
|
|
|
|
# When joining the base_path part and the id part, base_path's
|
|
# leading slash gets dropped off here. Putting an empty leading value
|
|
# in front of it causes it to get joined and replaced.
|
|
url = utils.urljoin("", self.base_path % self, self.id)
|
|
|
|
# Only send actual headers, not potentially set body values and
|
|
# query parameters.
|
|
headers = self._attrs.copy()
|
|
for val in ("container", "name", "hash", "bytes", "signature",
|
|
"expires", "multipart_manifest"):
|
|
headers.pop(val, None)
|
|
|
|
resp = session.get(url, service=self.service, accept="bytes",
|
|
headers=headers).content
|
|
|
|
return resp
|