From a15e257b9e94fa0f57b169643d614920926af5e7 Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Thu, 25 Jan 2018 15:53:43 -0500 Subject: [PATCH] fix a unicode bug in the stdout endpoint when ?content_encoding=base64 see: https://github.com/ansible/awx/issues/1042 --- awx/api/views.py | 2 +- .../functional/api/test_unified_jobs_stdout.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/awx/api/views.py b/awx/api/views.py index 779c689426..ac835a30d0 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -4641,7 +4641,7 @@ class UnifiedJobStdout(RetrieveAPIView): return Response(mark_safe(data)) if target_format == 'json': if content_encoding == 'base64' and content_format == 'ansi': - return Response({'range': {'start': start, 'end': end, 'absolute_end': absolute_end}, 'content': b64encode(content)}) + return Response({'range': {'start': start, 'end': end, 'absolute_end': absolute_end}, 'content': b64encode(content.encode('utf-8'))}) elif content_format == 'html': return Response({'range': {'start': start, 'end': end, 'absolute_end': absolute_end}, 'content': body}) return Response(data) diff --git a/awx/main/tests/functional/api/test_unified_jobs_stdout.py b/awx/main/tests/functional/api/test_unified_jobs_stdout.py index c4a1897b87..99b5619a7f 100644 --- a/awx/main/tests/functional/api/test_unified_jobs_stdout.py +++ b/awx/main/tests/functional/api/test_unified_jobs_stdout.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- +import base64 +import json import re import shutil import tempfile @@ -251,3 +253,19 @@ def test_text_with_unicode_stdout(sqlite_copy_expert, Parent, Child, relation, response = get(url, user=admin, expect=200) assert response.content.splitlines() == ['オ%d' % i for i in range(3)] + + +@pytest.mark.django_db +def test_unicode_with_base64_ansi(sqlite_copy_expert, get, admin): + job = Job() + job.save() + for i in range(3): + JobEvent(job=job, stdout=u'オ{}\n'.format(i), start_line=i).save() + url = reverse( + 'api:job_stdout', + kwargs={'pk': job.pk} + ) + '?format=json&content_encoding=base64&content_format=ansi' + + response = get(url, user=admin, expect=200) + content = base64.b64decode(json.loads(response.content)['content']) + assert content.splitlines() == ['オ%d' % i for i in range(3)]