Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-app / pithos / api / public.py @ 5fe43b8c

History | View | Annotate | Download (6.2 kB)

1 65bbcd43 Christos Stavrakakis
# Copyright 2011-2013 GRNET S.A. All rights reserved.
2 2715ade4 Sofia Papagiannaki
#
3 f7b1d2af Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 f7b1d2af Antony Chazapis
# without modification, are permitted provided that the following
5 f7b1d2af Antony Chazapis
# conditions are met:
6 2715ade4 Sofia Papagiannaki
#
7 f7b1d2af Antony Chazapis
#   1. Redistributions of source code must retain the above
8 f7b1d2af Antony Chazapis
#      copyright notice, this list of conditions and the following
9 f7b1d2af Antony Chazapis
#      disclaimer.
10 2715ade4 Sofia Papagiannaki
#
11 f7b1d2af Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 f7b1d2af Antony Chazapis
#      copyright notice, this list of conditions and the following
13 f7b1d2af Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 f7b1d2af Antony Chazapis
#      provided with the distribution.
15 2715ade4 Sofia Papagiannaki
#
16 f7b1d2af Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 f7b1d2af Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 f7b1d2af Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 f7b1d2af Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 f7b1d2af Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 f7b1d2af Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 f7b1d2af Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 f7b1d2af Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 f7b1d2af Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 f7b1d2af Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 f7b1d2af Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 f7b1d2af Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 2715ade4 Sofia Papagiannaki
#
29 f7b1d2af Antony Chazapis
# The views and conclusions contained in the software and
30 f7b1d2af Antony Chazapis
# documentation are those of the authors and should not be
31 f7b1d2af Antony Chazapis
# interpreted as representing official policies, either expressed
32 f7b1d2af Antony Chazapis
# or implied, of GRNET S.A.
33 f7b1d2af Antony Chazapis
34 f7b1d2af Antony Chazapis
from django.http import HttpResponse
35 8fbfd37b Antony Chazapis
from django.views.decorators.csrf import csrf_exempt
36 f7b1d2af Antony Chazapis
37 65bbcd43 Christos Stavrakakis
from snf_django.lib import api
38 bd40abfa Christos Stavrakakis
from snf_django.lib.api import faults
39 cf441bae Antony Chazapis
40 83b4c5fa Antony Chazapis
from pithos.api.util import (put_object_headers, update_manifest_meta,
41 e30537f1 Sofia Papagiannaki
                             validate_modification_preconditions,
42 e30537f1 Sofia Papagiannaki
                             validate_matching_preconditions,
43 e30537f1 Sofia Papagiannaki
                             object_data_response, api_method,
44 e30537f1 Sofia Papagiannaki
                             split_container_object_string)
45 f7b1d2af Antony Chazapis
46 65bbcd43 Christos Stavrakakis
import logging
47 f7b1d2af Antony Chazapis
logger = logging.getLogger(__name__)
48 f7b1d2af Antony Chazapis
49 f7b1d2af Antony Chazapis
50 8fbfd37b Antony Chazapis
@csrf_exempt
51 bb4eafc6 Antony Chazapis
def public_demux(request, v_public):
52 f7b1d2af Antony Chazapis
    if request.method == 'HEAD':
53 bb4eafc6 Antony Chazapis
        return public_meta(request, v_public)
54 f7b1d2af Antony Chazapis
    elif request.method == 'GET':
55 bb4eafc6 Antony Chazapis
        return public_read(request, v_public)
56 f7b1d2af Antony Chazapis
    else:
57 55616866 Kostas Papadimitriou
        return api.api_method_not_allowed(request)
58 f7b1d2af Antony Chazapis
59 2715ade4 Sofia Papagiannaki
60 d630c78b Sofia Papagiannaki
@api_method(http_method="HEAD", token_required=False, user_required=False,
61 d630c78b Sofia Papagiannaki
            logger=logger)
62 bb4eafc6 Antony Chazapis
def public_meta(request, v_public):
63 f7b1d2af Antony Chazapis
    # Normal Response Codes: 204
64 08de868d Antony Chazapis
    # Error Response Codes: internalServerError (500),
65 f7b1d2af Antony Chazapis
    #                       itemNotFound (404),
66 f7b1d2af Antony Chazapis
    #                       badRequest (400)
67 2715ade4 Sofia Papagiannaki
68 d630c78b Sofia Papagiannaki
    request.user_uniq = None
69 f7b1d2af Antony Chazapis
    try:
70 2715ade4 Sofia Papagiannaki
        v_account, v_container, v_object = request.backend.get_public(
71 2715ade4 Sofia Papagiannaki
            request.user_uniq,
72 56f3c759 Sofia Papagiannaki
            v_public)
73 61efb530 Antony Chazapis
        meta = request.backend.get_object_meta(request.user_uniq, v_account,
74 2715ade4 Sofia Papagiannaki
                                               v_container, v_object, 'pithos')
75 2715ade4 Sofia Papagiannaki
        public = request.backend.get_object_public(
76 2715ade4 Sofia Papagiannaki
            request.user_uniq, v_account,
77 2715ade4 Sofia Papagiannaki
            v_container, v_object)
78 cca6c617 Antony Chazapis
    except:
79 bd40abfa Christos Stavrakakis
        raise faults.ItemNotFound('Object does not exist')
80 2715ade4 Sofia Papagiannaki
81 e0f916bb Antony Chazapis
    if not public:
82 bd40abfa Christos Stavrakakis
        raise faults.ItemNotFound('Object does not exist')
83 8cb45c13 Antony Chazapis
    update_manifest_meta(request, v_account, meta)
84 2715ade4 Sofia Papagiannaki
85 4a1c29ea Antony Chazapis
    response = HttpResponse(status=200)
86 4a1c29ea Antony Chazapis
    put_object_headers(response, meta, True)
87 f7b1d2af Antony Chazapis
    return response
88 f7b1d2af Antony Chazapis
89 2715ade4 Sofia Papagiannaki
90 d630c78b Sofia Papagiannaki
@api_method(http_method="GET", token_required=False, user_required=False,
91 d630c78b Sofia Papagiannaki
            logger=logger)
92 bb4eafc6 Antony Chazapis
def public_read(request, v_public):
93 f7b1d2af Antony Chazapis
    # Normal Response Codes: 200, 206
94 08de868d Antony Chazapis
    # Error Response Codes: internalServerError (500),
95 f7b1d2af Antony Chazapis
    #                       rangeNotSatisfiable (416),
96 f7b1d2af Antony Chazapis
    #                       preconditionFailed (412),
97 f7b1d2af Antony Chazapis
    #                       itemNotFound (404),
98 f7b1d2af Antony Chazapis
    #                       badRequest (400),
99 f7b1d2af Antony Chazapis
    #                       notModified (304)
100 56f3c759 Sofia Papagiannaki
101 d630c78b Sofia Papagiannaki
    request.user_uniq = None
102 f7b1d2af Antony Chazapis
    try:
103 2715ade4 Sofia Papagiannaki
        v_account, v_container, v_object = request.backend.get_public(
104 2715ade4 Sofia Papagiannaki
            request.user_uniq,
105 56f3c759 Sofia Papagiannaki
            v_public)
106 61efb530 Antony Chazapis
        meta = request.backend.get_object_meta(request.user_uniq, v_account,
107 2715ade4 Sofia Papagiannaki
                                               v_container, v_object, 'pithos')
108 2715ade4 Sofia Papagiannaki
        public = request.backend.get_object_public(
109 2715ade4 Sofia Papagiannaki
            request.user_uniq, v_account,
110 2715ade4 Sofia Papagiannaki
            v_container, v_object)
111 cca6c617 Antony Chazapis
    except:
112 bd40abfa Christos Stavrakakis
        raise faults.ItemNotFound('Object does not exist')
113 2715ade4 Sofia Papagiannaki
114 e0f916bb Antony Chazapis
    if not public:
115 bd40abfa Christos Stavrakakis
        raise faults.ItemNotFound('Object does not exist')
116 8cb45c13 Antony Chazapis
    update_manifest_meta(request, v_account, meta)
117 2715ade4 Sofia Papagiannaki
118 f7b1d2af Antony Chazapis
    # Evaluate conditions.
119 f7b1d2af Antony Chazapis
    validate_modification_preconditions(request, meta)
120 f7b1d2af Antony Chazapis
    try:
121 f7b1d2af Antony Chazapis
        validate_matching_preconditions(request, meta)
122 bd40abfa Christos Stavrakakis
    except faults.NotModified:
123 f7b1d2af Antony Chazapis
        response = HttpResponse(status=304)
124 4a1c29ea Antony Chazapis
        response['ETag'] = meta['ETag']
125 f7b1d2af Antony Chazapis
        return response
126 2715ade4 Sofia Papagiannaki
127 8cb45c13 Antony Chazapis
    sizes = []
128 8cb45c13 Antony Chazapis
    hashmaps = []
129 8cb45c13 Antony Chazapis
    if 'X-Object-Manifest' in meta:
130 8cb45c13 Antony Chazapis
        try:
131 2715ade4 Sofia Papagiannaki
            src_container, src_name = split_container_object_string(
132 2715ade4 Sofia Papagiannaki
                '/' + meta['X-Object-Manifest'])
133 2715ade4 Sofia Papagiannaki
            objects = request.backend.list_objects(
134 2715ade4 Sofia Papagiannaki
                request.user_uniq, v_account,
135 2715ade4 Sofia Papagiannaki
                src_container, prefix=src_name, virtual=False)
136 cca6c617 Antony Chazapis
        except:
137 bd40abfa Christos Stavrakakis
            raise faults.ItemNotFound('Object does not exist')
138 2715ade4 Sofia Papagiannaki
139 8cb45c13 Antony Chazapis
        try:
140 8cb45c13 Antony Chazapis
            for x in objects:
141 61efb530 Antony Chazapis
                s, h = request.backend.get_object_hashmap(request.user_uniq,
142 65bbcd43 Christos Stavrakakis
                                                          v_account,
143 65bbcd43 Christos Stavrakakis
                                                          src_container,
144 65bbcd43 Christos Stavrakakis
                                                          x[0], x[1])
145 8cb45c13 Antony Chazapis
                sizes.append(s)
146 8cb45c13 Antony Chazapis
                hashmaps.append(h)
147 cca6c617 Antony Chazapis
        except:
148 bd40abfa Christos Stavrakakis
            raise faults.ItemNotFound('Object does not exist')
149 8cb45c13 Antony Chazapis
    else:
150 8cb45c13 Antony Chazapis
        try:
151 2715ade4 Sofia Papagiannaki
            s, h = request.backend.get_object_hashmap(
152 2715ade4 Sofia Papagiannaki
                request.user_uniq, v_account,
153 2715ade4 Sofia Papagiannaki
                v_container, v_object)
154 8cb45c13 Antony Chazapis
            sizes.append(s)
155 8cb45c13 Antony Chazapis
            hashmaps.append(h)
156 cca6c617 Antony Chazapis
        except:
157 bd40abfa Christos Stavrakakis
            raise faults.ItemNotFound('Object does not exist')
158 2715ade4 Sofia Papagiannaki
159 bb4eafc6 Antony Chazapis
    if 'Content-Disposition' not in meta:
160 bb4eafc6 Antony Chazapis
        name = v_object.rstrip('/').split('/')[-1]
161 bb4eafc6 Antony Chazapis
        if not name:
162 bb4eafc6 Antony Chazapis
            name = v_public
163 bb4eafc6 Antony Chazapis
        meta['Content-Disposition'] = 'attachment; filename=%s' % (name,)
164 2715ade4 Sofia Papagiannaki
165 8cb45c13 Antony Chazapis
    return object_data_response(request, sizes, hashmaps, meta, True)