Revision 890c2065 snf-pithos-app/pithos/api/delegate.py

b/snf-pithos-app/pithos/api/delegate.py
44 44
from django.views.decorators.csrf import csrf_exempt
45 45

  
46 46
from pithos.api.settings import (
47
    AUTHENTICATION_URL, AUTHENTICATION_USERS, SERVICE_TOKEN, USER_INFO_URL)
47
    AUTHENTICATION_USERS, USER_LOGIN_URL, USER_FEEDBACK_URL, USER_CATALOG_URL,
48
    SERVICE_TOKEN)
48 49

  
49
from synnefo.lib.astakos import get_username
50
from synnefo.lib.pool.http import get_http_connection
50 51

  
51 52
logger = logging.getLogger(__name__)
52 53

  
53 54

  
54 55
def delegate_to_login_service(request):
55
    url = AUTHENTICATION_URL
56
    url = USER_LOGIN_URL
56 57
    users = AUTHENTICATION_USERS
57 58
    if users or not url:
58 59
        return HttpResponseNotFound()
......
63 64
    else:
64 65
        proto = 'http://'
65 66
    params = dict([(k, v) for k, v in request.GET.items()])
66
    uri = proto + p.netloc + '/login?' + urlencode(params)
67
    uri = proto + p.netloc + p.path + '?' + urlencode(params)
67 68
    return HttpResponseRedirect(uri)
68 69

  
69 70

  
70
@csrf_exempt
71
def delegate_to_feedback_service(request):
72
    url = AUTHENTICATION_URL
73
    users = AUTHENTICATION_USERS
74
    if users or not url:
75
        return HttpResponseNotFound()
76

  
71
def proxy(request, url, headers={}, body=None):
77 72
    p = urlparse(url)
78
    if request.is_secure():
79
        proto = 'https://'
80
    else:
81
        proto = 'http://'
82 73

  
83
    uri = proto + p.netloc + '/im/service/api/v2.0/feedback'
84
    headers = {'X-Auth-Token': SERVICE_TOKEN}
85
    values = dict([(k, unicode(v).encode('utf-8')) for k, v in request.POST.items()])
86
    data = urllib.urlencode(values)
87
    req = urllib2.Request(uri, data, headers)
74
    kwargs = {}
75
    kwargs['headers'] = headers
76
    kwargs['headers'].update(request.META)
77
    kwargs['body'] = body
78
    kwargs['headers'].setdefault('content-type', 'application/json')
79
    kwargs['headers'].setdefault('content-length', len(body) if body else 0)
80

  
81
    conn = get_http_connection(p.netloc, p.scheme)
88 82
    try:
89
        urllib2.urlopen(req)
90
    except urllib2.HTTPError, e:
91
        logger.exception(e)
92
        return HttpResponse(status=e.code)
93
    except urllib2.URLError, e:
94
        logger.exception(e)
95
        return HttpResponse(status=e.reason)
96
    return HttpResponse()
83
        conn.request(request.method, p.path + '?' + p.query, **kwargs)
84
        response = conn.getresponse()
85
        length = response.getheader('content-length', None)
86
        data = response.read(length)
87
        status = int(response.status)
88
        return HttpResponse(data, status=status)
89
    finally:
90
        conn.close()
97 91

  
92
@csrf_exempt
93
def delegate_to_feedback_service(request):
94
    token = request.META.get('HTTP_X_AUTH_TOKEN')
95
    headers = {'X-Auth-Token': token}
96
    return proxy(
97
        request, USER_FEEDBACK_URL, headers=headers, body=request.raw_post_data)
98

  
99
@csrf_exempt
100
def delegate_to_user_catalogs_service(request):
101
    token = request.META.get('HTTP_X_AUTH_TOKEN')
102
    headers = {'X-Auth-Token': token, 'content-type': 'application/json'}
103
    return proxy(
104
        request, USER_CATALOG_URL, headers=headers, body=request.raw_post_data)

Also available in: Unified diff