Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / delegate.py @ 95059648

History | View | Annotate | Download (4 kB)

1 e440e835 Christos Stavrakakis
# Copyright 2011, 2012, 2013 GRNET S.A. All rights reserved.
2 11bb4341 Kostas Papadimitriou
#
3 11bb4341 Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 11bb4341 Kostas Papadimitriou
# without modification, are permitted provided that the following
5 11bb4341 Kostas Papadimitriou
# conditions are met:
6 11bb4341 Kostas Papadimitriou
#
7 11bb4341 Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 11bb4341 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 11bb4341 Kostas Papadimitriou
#      disclaimer.
10 11bb4341 Kostas Papadimitriou
#
11 11bb4341 Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 11bb4341 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 11bb4341 Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 11bb4341 Kostas Papadimitriou
#      provided with the distribution.
15 11bb4341 Kostas Papadimitriou
#
16 11bb4341 Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 11bb4341 Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 11bb4341 Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 11bb4341 Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 11bb4341 Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 11bb4341 Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 11bb4341 Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 11bb4341 Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 11bb4341 Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 11bb4341 Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 11bb4341 Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 11bb4341 Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 11bb4341 Kostas Papadimitriou
#
29 11bb4341 Kostas Papadimitriou
# The views and conclusions contained in the software and
30 11bb4341 Kostas Papadimitriou
# documentation are those of the authors and should not be
31 11bb4341 Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 11bb4341 Kostas Papadimitriou
# or implied, of GRNET S.A.
33 11bb4341 Kostas Papadimitriou
34 11bb4341 Kostas Papadimitriou
import logging
35 11bb4341 Kostas Papadimitriou
36 2c2ccd2d Giorgos Korfiatis
import urlparse
37 e440e835 Christos Stavrakakis
from django.http import HttpResponse
38 11bb4341 Kostas Papadimitriou
from django.views.decorators.csrf import csrf_exempt
39 11bb4341 Kostas Papadimitriou
40 11bb4341 Kostas Papadimitriou
from django.conf import settings
41 11bb4341 Kostas Papadimitriou
42 6e27e449 Christos Stavrakakis
ASTAKOS_URL = getattr(settings, 'ASTAKOS_URL', None)
43 426e1fb9 Kostas Papadimitriou
USER_QUOTA_URL = urlparse.urljoin(ASTAKOS_URL, "astakos/api/quotas")
44 426e1fb9 Kostas Papadimitriou
RESOURCES_URL = urlparse.urljoin(ASTAKOS_URL, "astakos/api/resources")
45 79b5d61b Sofia Papagiannaki
USER_CATALOG_URL = urlparse.urljoin(ASTAKOS_URL, "astakos/api/user_catalogs")
46 79b5d61b Sofia Papagiannaki
USER_FEEDBACK_URL = urlparse.urljoin(ASTAKOS_URL, "astakos/api/feedback")
47 11bb4341 Kostas Papadimitriou
48 1a736ca8 Christos Stavrakakis
from objpool.http import PooledHTTPConnection
49 11bb4341 Kostas Papadimitriou
50 11bb4341 Kostas Papadimitriou
logger = logging.getLogger(__name__)
51 11bb4341 Kostas Papadimitriou
52 11bb4341 Kostas Papadimitriou
53 11bb4341 Kostas Papadimitriou
def proxy(request, url, headers={}, body=None):
54 2c2ccd2d Giorgos Korfiatis
    p = urlparse.urlparse(url)
55 11bb4341 Kostas Papadimitriou
56 11bb4341 Kostas Papadimitriou
    kwargs = {}
57 11bb4341 Kostas Papadimitriou
    kwargs['headers'] = headers
58 11bb4341 Kostas Papadimitriou
    kwargs['headers'].update(request.META)
59 11bb4341 Kostas Papadimitriou
    kwargs['body'] = body
60 11bb4341 Kostas Papadimitriou
    kwargs['headers'].setdefault('content-type', 'application/json')
61 11bb4341 Kostas Papadimitriou
    kwargs['headers'].setdefault('content-length', len(body) if body else 0)
62 11bb4341 Kostas Papadimitriou
63 4ab1af1a Georgios D. Tsoukalas
    with PooledHTTPConnection(p.netloc, p.scheme) as conn:
64 11bb4341 Kostas Papadimitriou
        conn.request(request.method, p.path + '?' + p.query, **kwargs)
65 11bb4341 Kostas Papadimitriou
        response = conn.getresponse()
66 11bb4341 Kostas Papadimitriou
        length = response.getheader('content-length', None)
67 11bb4341 Kostas Papadimitriou
        data = response.read(length)
68 11bb4341 Kostas Papadimitriou
        status = int(response.status)
69 11bb4341 Kostas Papadimitriou
        return HttpResponse(data, status=status)
70 11bb4341 Kostas Papadimitriou
71 e440e835 Christos Stavrakakis
72 11bb4341 Kostas Papadimitriou
@csrf_exempt
73 426e1fb9 Kostas Papadimitriou
def delegate_to_resources_service(request):
74 426e1fb9 Kostas Papadimitriou
    logger.debug("Delegate resources request to %s" % RESOURCES_URL)
75 426e1fb9 Kostas Papadimitriou
    token = request.META.get('HTTP_X_AUTH_TOKEN')
76 426e1fb9 Kostas Papadimitriou
    headers = {'X-Auth-Token': token}
77 426e1fb9 Kostas Papadimitriou
    return proxy(request, RESOURCES_URL, headers=headers,
78 426e1fb9 Kostas Papadimitriou
                 body=request.raw_post_data)
79 426e1fb9 Kostas Papadimitriou
80 426e1fb9 Kostas Papadimitriou
81 426e1fb9 Kostas Papadimitriou
@csrf_exempt
82 426e1fb9 Kostas Papadimitriou
def delegate_to_user_quota_service(request):
83 426e1fb9 Kostas Papadimitriou
    logger.debug("Delegate quotas request to %s" % USER_QUOTA_URL)
84 426e1fb9 Kostas Papadimitriou
    token = request.META.get('HTTP_X_AUTH_TOKEN')
85 426e1fb9 Kostas Papadimitriou
    headers = {'X-Auth-Token': token}
86 426e1fb9 Kostas Papadimitriou
    return proxy(request, USER_QUOTA_URL, headers=headers,
87 426e1fb9 Kostas Papadimitriou
                 body=request.raw_post_data)
88 426e1fb9 Kostas Papadimitriou
89 426e1fb9 Kostas Papadimitriou
90 426e1fb9 Kostas Papadimitriou
@csrf_exempt
91 11bb4341 Kostas Papadimitriou
def delegate_to_feedback_service(request):
92 5af5920c Kostas Papadimitriou
    logger.debug("Delegate feedback request to %s" % USER_FEEDBACK_URL)
93 11bb4341 Kostas Papadimitriou
    token = request.META.get('HTTP_X_AUTH_TOKEN')
94 11bb4341 Kostas Papadimitriou
    headers = {'X-Auth-Token': token}
95 e440e835 Christos Stavrakakis
    return proxy(request, USER_FEEDBACK_URL, headers=headers,
96 e440e835 Christos Stavrakakis
                 body=request.raw_post_data)
97 e440e835 Christos Stavrakakis
98 11bb4341 Kostas Papadimitriou
99 11bb4341 Kostas Papadimitriou
@csrf_exempt
100 11bb4341 Kostas Papadimitriou
def delegate_to_user_catalogs_service(request):
101 11bb4341 Kostas Papadimitriou
    token = request.META.get('HTTP_X_AUTH_TOKEN')
102 11bb4341 Kostas Papadimitriou
    headers = {'X-Auth-Token': token, 'content-type': 'application/json'}
103 e440e835 Christos Stavrakakis
    return proxy(request, USER_CATALOG_URL, headers=headers,
104 e440e835 Christos Stavrakakis
                 body=request.raw_post_data)