From babe34d5ee6487882fe6c8e083326e2883dcb877 Mon Sep 17 00:00:00 2001
From: Brandon Rodriguez <brodriguez8774@gmail.com>
Date: Sat, 2 Mar 2024 03:43:16 -0500
Subject: [PATCH] Correct API send view when json content is empty or invalid

---
 django_rest/test_app/views.py | 24 ++++++++++++++++++++----
 django_v4/test_app/views.py   | 24 ++++++++++++++++++++----
 2 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/django_rest/test_app/views.py b/django_rest/test_app/views.py
index 3e1ace1..9bab486 100644
--- a/django_rest/test_app/views.py
+++ b/django_rest/test_app/views.py
@@ -218,6 +218,7 @@ def api_send(request):
     if request.POST:
         # Is POST. Process data.
         print('Is POST submission.')
+        has_error = False
 
         data = request.POST
         form = ApiSendForm(data=data)
@@ -230,7 +231,23 @@ def api_send(request):
             url = str(form.cleaned_data['url']).strip()
             get_params = str(form.cleaned_data.get('get_params', '')).strip()
             header_token = str(form.cleaned_data.get('header_token', '')).strip()
-            payload = json.loads(str(form.cleaned_data.get('payload', {})).strip())
+            payload = str(form.cleaned_data.get('payload', '{}')).strip()
+            if len(payload) > 0:
+                try:
+                    payload = json.loads(payload)
+                except json.decoder.JSONDecodeError:
+                    has_error = True
+                    payload = {}
+                    form.add_error(
+                        'payload',
+                        'Unrecognized/invalid JSON syntax. Please double check syntax and try again.',
+                    )
+            else:
+                has_error = True
+                form.add_error(
+                    'payload',
+                    'Please provide JSON data to send. If API query is meant to be empty, use {}.',
+                )
 
             # Determine url.
             if get_params and len(get_params) > 0:
@@ -250,7 +267,6 @@ def api_send(request):
                 data = json.dumps({'success': True})
 
             # Generate API send object.
-            is_error = False
             try:
                 response = requests.post(
                     url,
@@ -259,7 +275,7 @@ def api_send(request):
                     timeout=5,
                 )
             except Exception as err:
-                is_error = True
+                has_error = True
                 response_error['query_sent'] = False if not err.response else True
                 response_error['message'] = str(err.message) if hasattr(err, 'message') else str(err)
                 if 'Max retries exceeded with url' in response_error['message']:
@@ -268,7 +284,7 @@ def api_send(request):
                         'Are you sure you entered the destination URL correctly?'
                     )
 
-            if not is_error:
+            if not has_error:
                 # Handle for success state.
 
                 response_success['status'] = response.status_code
diff --git a/django_v4/test_app/views.py b/django_v4/test_app/views.py
index b066c80..39d01d8 100644
--- a/django_v4/test_app/views.py
+++ b/django_v4/test_app/views.py
@@ -219,11 +219,28 @@ def api_send(request):
             # Handle for form submission.
             print('Submitted form data:')
             print('{0}'.format(form.cleaned_data))
+            has_error = False
 
             url = str(form.cleaned_data['url']).strip()
             get_params = str(form.cleaned_data.get('get_params', '')).strip()
             header_token = str(form.cleaned_data.get('header_token', '')).strip()
-            payload = json.loads(str(form.cleaned_data.get('payload', {})).strip())
+            payload = str(form.cleaned_data.get('payload', '{}')).strip()
+            if len(payload) > 0:
+                try:
+                    has_error = True
+                    payload = json.loads(payload)
+                except json.decoder.JSONDecodeError:
+                    payload = {}
+                    form.add_error(
+                        'payload',
+                        'Unrecognized/invalid JSON syntax. Please double check syntax and try again.',
+                    )
+            else:
+                has_error = True
+                form.add_error(
+                    'payload',
+                    'Please provide JSON data to send. If API query is meant to be empty, use {}.',
+                )
 
             # Determine url.
             if get_params and len(get_params) > 0:
@@ -243,7 +260,6 @@ def api_send(request):
                 data = json.dumps({'success': True})
 
             # Generate API send object.
-            is_error = False
             try:
                 response = requests.post(
                     url,
@@ -252,7 +268,7 @@ def api_send(request):
                     timeout=5,
                 )
             except Exception as err:
-                is_error = True
+                has_error = True
                 response_error['query_sent'] = False if not err.response else True
                 response_error['message'] = str(err.message) if hasattr(err, 'message') else str(err)
                 if 'Max retries exceeded with url' in response_error['message']:
@@ -261,7 +277,7 @@ def api_send(request):
                         'Are you sure you entered the destination URL correctly?'
                     )
 
-            if not is_error:
+            if not has_error:
                 # Handle for success state.
 
                 response_success['status'] = response.status_code
-- 
GitLab