Example #1
0
def multi(request):
	if request.method != 'GET':
		return HttpResponseNotAllowed(['GET'])

	# prevent loops
	if request.META.get('HTTP_INTERNAL') == '1':
		return HttpResponseBadRequest('Can\'t make internal requests to the multi resource.\n')

	# headers to pass along
	headers_meta = dict()
	for k, v in request.META.iteritems():
		if k not in ('HTTP_INTERNAL', 'HTTP_WAIT'):
			headers_meta[k] = v

	uri_headers = dict()
	for i in request.META.get('HTTP_URI').split(','):
		try:
			uri, params = parse_header_params(i)
		except:
			return HttpResponseBadRequest('Failed to parse Uri header.\n')

		try:
			uri = canonical_uri(uri)
		except:
			return HttpResponseBadRequest('Invalid Uri value.\n')

		uri_headers[uri] = params

	info = list()
	results = dict()
	for uri, params in uri_headers.iteritems():
		meta = deepcopy(headers_meta)
		for k, v in params.iteritems():
			meta['HTTP_' + k.upper()] = v

		resp = internal_request(uri, meta)

		ri = get_resourceinfo(resp, uri)
		if ri and ri.empty:
			info.append(ri)
			continue

		resp_headers = dict()
		for k, v in resp.items():
			resp_headers[k] = v

		try:
			resp_body = json.loads(resp.content)
		except:
			return HttpResponseBadRequest('One or more resources produces non-JSON content.\n')

		result = dict()
		result['code'] = resp.status_code
		result['headers'] = resp_headers
		result['body'] = resp_body

		results[uri] = result

	resp = HttpResponse(json.dumps(results), content_type='application/json')

	# to help out the middleware, provide list of ResourceInfo if the response would be empty
	resp.multi_info = info if len(results) == 0 else []
	return resp