Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-app / pithos / api / delegate.py @ ccfd4e44

History | View | Annotate | Download (3.6 kB)

1 2e662088 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 2715ade4 Sofia Papagiannaki
#
3 0a8bf8fb Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 0a8bf8fb Antony Chazapis
# without modification, are permitted provided that the following
5 0a8bf8fb Antony Chazapis
# conditions are met:
6 2715ade4 Sofia Papagiannaki
#
7 0a8bf8fb Antony Chazapis
#   1. Redistributions of source code must retain the above
8 0a8bf8fb Antony Chazapis
#      copyright notice, this list of conditions and the following
9 0a8bf8fb Antony Chazapis
#      disclaimer.
10 2715ade4 Sofia Papagiannaki
#
11 0a8bf8fb Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 0a8bf8fb Antony Chazapis
#      copyright notice, this list of conditions and the following
13 0a8bf8fb Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 0a8bf8fb Antony Chazapis
#      provided with the distribution.
15 2715ade4 Sofia Papagiannaki
#
16 0a8bf8fb Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 0a8bf8fb Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 0a8bf8fb Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 0a8bf8fb Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 0a8bf8fb Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 0a8bf8fb Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 0a8bf8fb Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 0a8bf8fb Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 0a8bf8fb Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 0a8bf8fb Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 0a8bf8fb Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 0a8bf8fb Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 2715ade4 Sofia Papagiannaki
#
29 0a8bf8fb Antony Chazapis
# The views and conclusions contained in the software and
30 0a8bf8fb Antony Chazapis
# documentation are those of the authors and should not be
31 0a8bf8fb Antony Chazapis
# interpreted as representing official policies, either expressed
32 0a8bf8fb Antony Chazapis
# or implied, of GRNET S.A.
33 0a8bf8fb Antony Chazapis
34 0a8bf8fb Antony Chazapis
import logging
35 0a8bf8fb Antony Chazapis
36 a49baffa Antony Chazapis
from urlparse import urlparse
37 b91bd50a Sofia Papagiannaki
import urllib
38 b91bd50a Sofia Papagiannaki
import urllib2
39 a49baffa Antony Chazapis
40 0308f3a7 Sofia Papagiannaki
from django.http import (
41 0308f3a7 Sofia Papagiannaki
    HttpResponseNotFound, HttpResponseRedirect, HttpResponseBadRequest,
42 0308f3a7 Sofia Papagiannaki
    HttpResponse)
43 a903e505 Antony Chazapis
from django.utils.http import urlencode
44 b91bd50a Sofia Papagiannaki
from django.views.decorators.csrf import csrf_exempt
45 a49baffa Antony Chazapis
46 0308f3a7 Sofia Papagiannaki
from pithos.api.settings import (
47 27932481 Sofia Papagiannaki
    AUTHENTICATION_USERS, USER_LOGIN_URL, USER_FEEDBACK_URL, USER_CATALOG_URL)
48 0a8bf8fb Antony Chazapis
49 890c2065 Sofia Papagiannaki
from synnefo.lib.pool.http import get_http_connection
50 0a8bf8fb Antony Chazapis
51 0a8bf8fb Antony Chazapis
logger = logging.getLogger(__name__)
52 0a8bf8fb Antony Chazapis
53 2715ade4 Sofia Papagiannaki
54 b91bd50a Sofia Papagiannaki
def delegate_to_login_service(request):
55 890c2065 Sofia Papagiannaki
    url = USER_LOGIN_URL
56 a49baffa Antony Chazapis
    users = AUTHENTICATION_USERS
57 a49baffa Antony Chazapis
    if users or not url:
58 4732ed31 Antony Chazapis
        return HttpResponseNotFound()
59 2715ade4 Sofia Papagiannaki
60 a49baffa Antony Chazapis
    p = urlparse(url)
61 0a8bf8fb Antony Chazapis
    if request.is_secure():
62 4732ed31 Antony Chazapis
        proto = 'https://'
63 0a8bf8fb Antony Chazapis
    else:
64 4732ed31 Antony Chazapis
        proto = 'http://'
65 f1bacd3c Sofia Papagiannaki
    params = dict([(k, v) for k, v in request.GET.items()])
66 890c2065 Sofia Papagiannaki
    uri = proto + p.netloc + p.path + '?' + urlencode(params)
67 4732ed31 Antony Chazapis
    return HttpResponseRedirect(uri)
68 b91bd50a Sofia Papagiannaki
69 2715ade4 Sofia Papagiannaki
70 890c2065 Sofia Papagiannaki
def proxy(request, url, headers={}, body=None):
71 b91bd50a Sofia Papagiannaki
    p = urlparse(url)
72 2715ade4 Sofia Papagiannaki
73 890c2065 Sofia Papagiannaki
    kwargs = {}
74 890c2065 Sofia Papagiannaki
    kwargs['headers'] = headers
75 890c2065 Sofia Papagiannaki
    kwargs['headers'].update(request.META)
76 890c2065 Sofia Papagiannaki
    kwargs['body'] = body
77 890c2065 Sofia Papagiannaki
    kwargs['headers'].setdefault('content-type', 'application/json')
78 890c2065 Sofia Papagiannaki
    kwargs['headers'].setdefault('content-length', len(body) if body else 0)
79 890c2065 Sofia Papagiannaki
80 890c2065 Sofia Papagiannaki
    conn = get_http_connection(p.netloc, p.scheme)
81 b91bd50a Sofia Papagiannaki
    try:
82 890c2065 Sofia Papagiannaki
        conn.request(request.method, p.path + '?' + p.query, **kwargs)
83 890c2065 Sofia Papagiannaki
        response = conn.getresponse()
84 890c2065 Sofia Papagiannaki
        length = response.getheader('content-length', None)
85 890c2065 Sofia Papagiannaki
        data = response.read(length)
86 890c2065 Sofia Papagiannaki
        status = int(response.status)
87 890c2065 Sofia Papagiannaki
        return HttpResponse(data, status=status)
88 890c2065 Sofia Papagiannaki
    finally:
89 890c2065 Sofia Papagiannaki
        conn.close()
90 0308f3a7 Sofia Papagiannaki
91 890c2065 Sofia Papagiannaki
@csrf_exempt
92 890c2065 Sofia Papagiannaki
def delegate_to_feedback_service(request):
93 890c2065 Sofia Papagiannaki
    token = request.META.get('HTTP_X_AUTH_TOKEN')
94 890c2065 Sofia Papagiannaki
    headers = {'X-Auth-Token': token}
95 890c2065 Sofia Papagiannaki
    return proxy(
96 890c2065 Sofia Papagiannaki
        request, USER_FEEDBACK_URL, headers=headers, body=request.raw_post_data)
97 890c2065 Sofia Papagiannaki
98 890c2065 Sofia Papagiannaki
@csrf_exempt
99 890c2065 Sofia Papagiannaki
def delegate_to_user_catalogs_service(request):
100 890c2065 Sofia Papagiannaki
    token = request.META.get('HTTP_X_AUTH_TOKEN')
101 890c2065 Sofia Papagiannaki
    headers = {'X-Auth-Token': token, 'content-type': 'application/json'}
102 890c2065 Sofia Papagiannaki
    return proxy(
103 890c2065 Sofia Papagiannaki
        request, USER_CATALOG_URL, headers=headers, body=request.raw_post_data)