Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.2 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 11bb4341 Kostas Papadimitriou
from urlparse 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 11bb4341 Kostas Papadimitriou
USER_CATALOG_URL = getattr(settings, 'CYCLADES_USER_CATALOG_URL', None)
43 11bb4341 Kostas Papadimitriou
USER_FEEDBACK_URL = getattr(settings, 'CYCLADES_USER_FEEDBACK_URL', None)
44 11bb4341 Kostas Papadimitriou
45 11bb4341 Kostas Papadimitriou
from synnefo.lib.pool.http import get_http_connection
46 11bb4341 Kostas Papadimitriou
47 11bb4341 Kostas Papadimitriou
logger = logging.getLogger(__name__)
48 11bb4341 Kostas Papadimitriou
49 11bb4341 Kostas Papadimitriou
50 11bb4341 Kostas Papadimitriou
def proxy(request, url, headers={}, body=None):
51 11bb4341 Kostas Papadimitriou
    p = urlparse(url)
52 11bb4341 Kostas Papadimitriou
53 11bb4341 Kostas Papadimitriou
    kwargs = {}
54 11bb4341 Kostas Papadimitriou
    kwargs['headers'] = headers
55 11bb4341 Kostas Papadimitriou
    kwargs['headers'].update(request.META)
56 11bb4341 Kostas Papadimitriou
    kwargs['body'] = body
57 11bb4341 Kostas Papadimitriou
    kwargs['headers'].setdefault('content-type', 'application/json')
58 11bb4341 Kostas Papadimitriou
    kwargs['headers'].setdefault('content-length', len(body) if body else 0)
59 11bb4341 Kostas Papadimitriou
60 11bb4341 Kostas Papadimitriou
    conn = get_http_connection(p.netloc, p.scheme)
61 11bb4341 Kostas Papadimitriou
    try:
62 11bb4341 Kostas Papadimitriou
        conn.request(request.method, p.path + '?' + p.query, **kwargs)
63 11bb4341 Kostas Papadimitriou
        response = conn.getresponse()
64 11bb4341 Kostas Papadimitriou
        length = response.getheader('content-length', None)
65 11bb4341 Kostas Papadimitriou
        data = response.read(length)
66 11bb4341 Kostas Papadimitriou
        status = int(response.status)
67 11bb4341 Kostas Papadimitriou
        return HttpResponse(data, status=status)
68 11bb4341 Kostas Papadimitriou
    finally:
69 11bb4341 Kostas Papadimitriou
        conn.close()
70 11bb4341 Kostas Papadimitriou
71 e440e835 Christos Stavrakakis
72 11bb4341 Kostas Papadimitriou
@csrf_exempt
73 11bb4341 Kostas Papadimitriou
def delegate_to_feedback_service(request):
74 11bb4341 Kostas Papadimitriou
    token = request.META.get('HTTP_X_AUTH_TOKEN')
75 11bb4341 Kostas Papadimitriou
    headers = {'X-Auth-Token': token}
76 e440e835 Christos Stavrakakis
    return proxy(request, USER_FEEDBACK_URL, headers=headers,
77 e440e835 Christos Stavrakakis
                 body=request.raw_post_data)
78 e440e835 Christos Stavrakakis
79 11bb4341 Kostas Papadimitriou
80 11bb4341 Kostas Papadimitriou
@csrf_exempt
81 11bb4341 Kostas Papadimitriou
def delegate_to_user_catalogs_service(request):
82 11bb4341 Kostas Papadimitriou
    token = request.META.get('HTTP_X_AUTH_TOKEN')
83 11bb4341 Kostas Papadimitriou
    headers = {'X-Auth-Token': token, 'content-type': 'application/json'}
84 e440e835 Christos Stavrakakis
    return proxy(request, USER_CATALOG_URL, headers=headers,
85 e440e835 Christos Stavrakakis
                 body=request.raw_post_data)