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