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