api: Fix UnicodeEncodeError when parsing and rendering results
This is an attempt to prevent encoding errors when posting results or when rendering them in the API and built-in interface. Setting UNICODE_JSON [1] to false allows the callback to post results' content and allows the API browsing interface to render the result. The built-in UI had a similar problem but isn't fixed by the UNICODE_JSON because we are using a Response object so use "surrogateescape" instead. Related: https://github.com/ansible-community/ara/issues/48 [1]: https://www.django-rest-framework.org/api-guide/settings/#unicode_json Change-Id: I48bcef440a1ee9c8574fdd24d5c05ef0f13ca666
This commit is contained in:
parent
a87bd88437
commit
5bd2447257
|
@ -230,6 +230,7 @@ REST_FRAMEWORK = {
|
||||||
"DEFAULT_AUTHENTICATION_CLASSES": ("rest_framework.authentication.BasicAuthentication",),
|
"DEFAULT_AUTHENTICATION_CLASSES": ("rest_framework.authentication.BasicAuthentication",),
|
||||||
"DEFAULT_PERMISSION_CLASSES": ("ara.api.auth.APIAccessPermission",),
|
"DEFAULT_PERMISSION_CLASSES": ("ara.api.auth.APIAccessPermission",),
|
||||||
"TEST_REQUEST_DEFAULT_FORMAT": "json",
|
"TEST_REQUEST_DEFAULT_FORMAT": "json",
|
||||||
|
"UNICODE_JSON": False,
|
||||||
}
|
}
|
||||||
|
|
||||||
ARA_SETTINGS = os.getenv("ARA_SETTINGS", DEFAULT_SETTINGS)
|
ARA_SETTINGS = os.getenv("ARA_SETTINGS", DEFAULT_SETTINGS)
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import codecs
|
||||||
|
|
||||||
from rest_framework import generics
|
from rest_framework import generics
|
||||||
from rest_framework.renderers import TemplateHTMLRenderer
|
from rest_framework.renderers import TemplateHTMLRenderer
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
@ -90,6 +92,8 @@ class Result(generics.RetrieveAPIView):
|
||||||
template_name = "result.html"
|
template_name = "result.html"
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
|
# Results can contain a wide array of non-ascii or binary characters, escape them
|
||||||
|
codecs.register_error("strict", codecs.lookup_error("surrogateescape"))
|
||||||
result = self.get_object()
|
result = self.get_object()
|
||||||
serializer = serializers.DetailedResultSerializer(result)
|
serializer = serializers.DetailedResultSerializer(result)
|
||||||
return Response({"result": serializer.data})
|
return Response({"result": serializer.data})
|
||||||
|
|
|
@ -65,6 +65,6 @@
|
||||||
- untag
|
- untag
|
||||||
- verytag
|
- verytag
|
||||||
|
|
||||||
- name: Echo a binary string
|
- name: Echo the <20>abc binary string
|
||||||
command: echo -e '\x80abc'
|
command: echo -e '\x80abc'
|
||||||
changed_when: false
|
changed_when: false
|
||||||
|
|
Loading…
Reference in New Issue