Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.3 kB)

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