async def handle_http_query( request: Request, response: Response, context=Depends(self.context_getter), root_value=Depends(self.root_value_getter), ) -> Response: actual_response: Response content_type = request.headers.get("content-type", "") if "application/json" in content_type: try: data = await request.json() except json.JSONDecodeError: actual_response = PlainTextResponse( "Unable to parse request body as JSON", status_code=status.HTTP_400_BAD_REQUEST, ) return self._merge_responses(response, actual_response) elif content_type.startswith("multipart/form-data"): multipart_data = await request.form() operations = json.loads(multipart_data.get("operations", {})) files_map = json.loads(multipart_data.get("map", {})) data = replace_placeholders_with_files( operations, files_map, multipart_data ) else: actual_response = PlainTextResponse( "Unsupported Media Type", status_code=status.HTTP_415_UNSUPPORTED_MEDIA_TYPE, ) return self._merge_responses(response, actual_response) try: request_data = parse_request_data(data) except MissingQueryError: actual_response = PlainTextResponse( "No GraphQL query found in the request", status_code=status.HTTP_400_BAD_REQUEST, ) return self._merge_responses(response, actual_response) result = await self.execute( request_data.query, variables=request_data.variables, context=context, operation_name=request_data.operation_name, root_value=root_value, ) response_data = await self.process_result(request, result) actual_response = JSONResponse( response_data, status_code=status.HTTP_200_OK, ) return self._merge_responses(response, actual_response)
async def get_request_data(self, request: web.Request) -> GraphQLRequestData: data = await self.parse_body(request) try: request_data = parse_request_data(data) except MissingQueryError: raise web.HTTPBadRequest(reason="No GraphQL query found in the request") return request_data
async def get_http_response( self, request: Request, execute: typing.Callable, process_result: typing.Callable, graphiql: bool, root_value: typing.Optional[typing.Any], context: typing.Optional[typing.Any], ) -> Response: if request.method == "GET": if not graphiql: return HTMLResponse(status_code=status.HTTP_404_NOT_FOUND) return self.get_graphiql_response() if request.method == "POST": content_type = request.headers.get("Content-Type", "") if "application/json" in content_type: data = await request.json() elif content_type.startswith("multipart/form-data"): multipart_data = await request.form() operations = json.loads(multipart_data.get("operations", "{}")) files_map = json.loads(multipart_data.get("map", "{}")) data = replace_placeholders_with_files(operations, files_map, multipart_data) else: return PlainTextResponse( "Unsupported Media Type", status_code=status.HTTP_415_UNSUPPORTED_MEDIA_TYPE, ) else: return PlainTextResponse( "Method Not Allowed", status_code=status.HTTP_405_METHOD_NOT_ALLOWED, ) try: request_data = parse_request_data(data) except MissingQueryError: return PlainTextResponse( "No GraphQL query found in the request", status_code=status.HTTP_400_BAD_REQUEST, ) result = await execute( request_data.query, variables=request_data.variables, context=context, operation_name=request_data.operation_name, root_value=root_value, ) response_data = await process_result(request=request, result=result) return JSONResponse(response_data, status_code=status.HTTP_200_OK)
def get_request_data(self, request: HttpRequest) -> GraphQLRequestData: try: data = self.parse_body(request) except json.decoder.JSONDecodeError: raise SuspiciousOperation("Unable to parse request body as JSON") try: request_data = parse_request_data(data) except MissingQueryError: raise SuspiciousOperation("No GraphQL query found in the request") return request_data
def get_request_data(self, request: Request) -> GraphQLRequestData: try: data = self.parse_body(request) except json.JSONDecodeError: raise ServerError("Unable to parse request body as JSON", status_code=400) try: request_data = parse_request_data(data) except MissingQueryError: raise ServerError("No GraphQL query found in the request", status_code=400) return request_data
def dispatch_request(self): if "text/html" in request.environ.get("HTTP_ACCEPT", ""): if not self.graphiql: abort(404) template = render_graphiql_page() return self.render_template(template=template) if request.content_type.startswith("multipart/form-data"): operations = json.loads(request.form.get("operations", "{}")) files_map = json.loads(request.form.get("map", "{}")) data = replace_placeholders_with_files(operations, files_map, request.files) else: data = request.json try: request_data = parse_request_data(data) except MissingQueryError: return Response("No valid query was provided for the request", 400) context = self.get_context() result = self.schema.execute_sync( request_data.query, variable_values=request_data.variables, context_value=context, operation_name=request_data.operation_name, root_value=self.get_root_value(), ) response_data = self.process_result(result) return Response( json.dumps(response_data), status=200, content_type="application/json", )