insightconnect-plugin-runtime 6.2.3__tar.gz → 6.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. {insightconnect_plugin_runtime-6.2.3/insightconnect_plugin_runtime.egg-info → insightconnect_plugin_runtime-6.2.4}/PKG-INFO +2 -1
  2. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/README.md +1 -0
  3. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/helper.py +17 -0
  4. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4/insightconnect_plugin_runtime.egg-info}/PKG-INFO +2 -1
  5. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/setup.py +1 -1
  6. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_helpers.py +25 -1
  7. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/utils.py +1 -0
  8. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/MANIFEST.in +0 -0
  9. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect-plugin-swagger.json +0 -0
  10. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/__init__.py +0 -0
  11. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/action.py +0 -0
  12. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/api/__init__.py +0 -0
  13. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/api/endpoints.py +0 -0
  14. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/api/schemas.py +0 -0
  15. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/cli.py +0 -0
  16. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/clients/__init__.py +0 -0
  17. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/clients/aws_client.py +0 -0
  18. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/clients/oauth.py +0 -0
  19. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/connection.py +0 -0
  20. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/data/input_message_schema.json +0 -0
  21. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/data/output_message_schema.json +0 -0
  22. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/dispatcher.py +0 -0
  23. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/exceptions.py +0 -0
  24. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/metrics.py +0 -0
  25. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/plugin.py +0 -0
  26. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/schema.py +0 -0
  27. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/server.py +0 -0
  28. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/step.py +0 -0
  29. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/task.py +0 -0
  30. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/trigger.py +0 -0
  31. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/util.py +0 -0
  32. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime/variables.py +0 -0
  33. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime.egg-info/SOURCES.txt +0 -0
  34. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime.egg-info/dependency_links.txt +0 -0
  35. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime.egg-info/requires.txt +0 -0
  36. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/insightconnect_plugin_runtime.egg-info/top_level.txt +0 -0
  37. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/setup.cfg +0 -0
  38. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/__init__.py +0 -0
  39. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/__init__.py +0 -0
  40. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/__init__.py +0 -0
  41. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/__init__.py +0 -0
  42. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/__init__.py +0 -0
  43. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/actions/__init__.py +0 -0
  44. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/actions/hello/__init__.py +0 -0
  45. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/actions/hello/action.py +0 -0
  46. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/actions/hello/schema.py +0 -0
  47. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/actions/return_bad_json/__init__.py +0 -0
  48. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/actions/return_bad_json/action.py +0 -0
  49. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/actions/return_bad_json/schema.py +0 -0
  50. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/actions/throw_exception/__init__.py +0 -0
  51. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/actions/throw_exception/action.py +0 -0
  52. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/actions/throw_exception/schema.py +0 -0
  53. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/connection/__init__.py +0 -0
  54. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/connection/connection.py +0 -0
  55. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/connection/schema.py +0 -0
  56. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/tasks/__init__.py +0 -0
  57. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/tasks/monitor_events/__init__.py +0 -0
  58. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/tasks/monitor_events/schema.py +0 -0
  59. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/tasks/monitor_events/task.py +0 -0
  60. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/triggers/__init__.py +0 -0
  61. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/triggers/hello_trigger/__init__.py +0 -0
  62. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/triggers/hello_trigger/schema.py +0 -0
  63. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/triggers/hello_trigger/trigger.py +0 -0
  64. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/triggers/return_bad_json_trigger/__init__.py +0 -0
  65. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/triggers/return_bad_json_trigger/schema.py +0 -0
  66. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/triggers/return_bad_json_trigger/trigger.py +0 -0
  67. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/triggers/throw_exception_trigger/__init__.py +0 -0
  68. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/triggers/throw_exception_trigger/schema.py +0 -0
  69. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/triggers/throw_exception_trigger/trigger.py +0 -0
  70. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/komand_hello_world/util/__init__.py +0 -0
  71. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/hello_world/setup.py +0 -0
  72. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/tests/__init__.py +0 -0
  73. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/tests/conftest.py +0 -0
  74. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/tests/test_cli.py +0 -0
  75. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/tests/test_hello_world.py +0 -0
  76. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/plugin/hello_world/tests/test_server.py +0 -0
  77. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/__init__.py +0 -0
  78. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_action.py +0 -0
  79. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_api.py +0 -0
  80. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_aws_action.py +0 -0
  81. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_custom_encoder.py +0 -0
  82. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_endpoints.py +0 -0
  83. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_exceptions.py +0 -0
  84. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_metrics.py +0 -0
  85. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_oauth.py +0 -0
  86. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_plugin.py +0 -0
  87. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_schema.py +0 -0
  88. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_server_cloud_plugins.py +0 -0
  89. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_server_spec.py +0 -0
  90. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_trigger.py +0 -0
  91. {insightconnect_plugin_runtime-6.2.3 → insightconnect_plugin_runtime-6.2.4}/tests/unit/test_variables.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: insightconnect-plugin-runtime
3
- Version: 6.2.3
3
+ Version: 6.2.4
4
4
  Summary: InsightConnect Plugin Runtime
5
5
  Home-page: https://github.com/rapid7/komand-plugin-sdk-python
6
6
  Author: Rapid7 Integrations Alliance
@@ -219,6 +219,7 @@ contributed. Black is installed as a test dependency and the hook can be initial
219
219
  after cloning this repository.
220
220
 
221
221
  ## Changelog
222
+ * 6.2.4 - Update `make_request` helper to support extra parameter of `max_response_size` to cap the response
222
223
  * 6.2.3 - Updated dockerfiles for both `slim` and `full` SDK types to use Python 3.11.11 | Updated dependencies | Removed `pkg_resources` usage due to deprecation
223
224
  * 6.2.2 - Fix instances where logging errors would lead to duplicate entries being output | Add option to hash only on provided keys for `hash_sha1` function
224
225
  * 6.2.1 - Fix instances where logging would lead to duplicate entries being output
@@ -182,6 +182,7 @@ contributed. Black is installed as a test dependency and the hook can be initial
182
182
  after cloning this repository.
183
183
 
184
184
  ## Changelog
185
+ * 6.2.4 - Update `make_request` helper to support extra parameter of `max_response_size` to cap the response
185
186
  * 6.2.3 - Updated dockerfiles for both `slim` and `full` SDK types to use Python 3.11.11 | Updated dependencies | Removed `pkg_resources` usage due to deprecation
186
187
  * 6.2.2 - Fix instances where logging errors would lead to duplicate entries being output | Add option to hash only on provided keys for `hash_sha1` function
187
188
  * 6.2.1 - Fix instances where logging would lead to duplicate entries being output
@@ -21,6 +21,7 @@ from insightconnect_plugin_runtime.exceptions import (
21
21
  PluginException,
22
22
  HTTPStatusCodes,
23
23
  ResponseExceptionData,
24
+ APIException
24
25
  )
25
26
 
26
27
  CAMEL_CASE_REGEX = r"\b[a-z0-9]+([A-Z][a-z]+[0-9]*)*\b"
@@ -111,6 +112,7 @@ def make_request(
111
112
  exception_custom_configs: Dict[int, Exception] = {},
112
113
  exception_data_location: str = None,
113
114
  allowed_status_codes: List[str] = [],
115
+ max_response_size: int = None,
114
116
  ) -> Tuple[requests.Response, Dict]:
115
117
  """
116
118
  Makes a HTTP request while checking for RequestErrors and JSONDecodeErrors
@@ -133,6 +135,8 @@ def make_request(
133
135
  :type str:
134
136
  :param allowed_status_codes: Status codes that will not raise an exception.
135
137
  :type List[str]:
138
+ :param max_response_size: Raise an error if the stream content is bigger than this specified size
139
+ :type int:
136
140
 
137
141
  :return: The request response and the response JSON.
138
142
  :rtype: Tuple[Response, Dict]
@@ -148,6 +152,19 @@ def make_request(
148
152
  cert=cert,
149
153
  stream=stream,
150
154
  )
155
+
156
+ # Before we close this session check and download all content, check if the returned content is too large.
157
+ # This may not be supported on all APIs as they need to support streaming and return the content-length
158
+ # header but adding this extra check will be beneficial for memory usage to those that do support it.
159
+ if stream and max_response_size:
160
+ resp_size = response.headers.get("content-length", "0")
161
+ if int(resp_size) > max_response_size:
162
+ raise APIException(
163
+ status_code=400,
164
+ cause=f"API response is exceeding allowed limit of {max_response_size} bytes.",
165
+ assistance="Please update the parameters to reduce the size of the data being returned.",
166
+ data=f"Content length returned was {resp_size} and max allowed is {max_response_size}",
167
+ )
151
168
  except requests.exceptions.Timeout as exception:
152
169
  raise PluginException(
153
170
  preset=PluginException.Preset.TIMEOUT, data=str(exception)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: insightconnect-plugin-runtime
3
- Version: 6.2.3
3
+ Version: 6.2.4
4
4
  Summary: InsightConnect Plugin Runtime
5
5
  Home-page: https://github.com/rapid7/komand-plugin-sdk-python
6
6
  Author: Rapid7 Integrations Alliance
@@ -219,6 +219,7 @@ contributed. Black is installed as a test dependency and the hook can be initial
219
219
  after cloning this repository.
220
220
 
221
221
  ## Changelog
222
+ * 6.2.4 - Update `make_request` helper to support extra parameter of `max_response_size` to cap the response
222
223
  * 6.2.3 - Updated dockerfiles for both `slim` and `full` SDK types to use Python 3.11.11 | Updated dependencies | Removed `pkg_resources` usage due to deprecation
223
224
  * 6.2.2 - Fix instances where logging errors would lead to duplicate entries being output | Add option to hash only on provided keys for `hash_sha1` function
224
225
  * 6.2.1 - Fix instances where logging would lead to duplicate entries being output
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
5
5
 
6
6
  setup(
7
7
  name="insightconnect-plugin-runtime",
8
- version="6.2.3",
8
+ version="6.2.4",
9
9
  description="InsightConnect Plugin Runtime",
10
10
  long_description=long_description,
11
11
  long_description_content_type="text/markdown",
@@ -4,6 +4,7 @@ from insightconnect_plugin_runtime.exceptions import (
4
4
  HTTPStatusCodes,
5
5
  ResponseExceptionData,
6
6
  PluginException,
7
+ APIException
7
8
  )
8
9
  import requests
9
10
  import os
@@ -378,16 +379,39 @@ class TestRequestsHelpers(TestCase):
378
379
  json={"sample": "value"},
379
380
  headers={"Content-Type": "application/json"},
380
381
  )
381
- response = helper.make_request(_request=request)
382
+ response = helper.make_request(_request=request, stream=True, max_response_size=100)
382
383
  expected = {
383
384
  "json": {"example": "sample"},
384
385
  "status_code": 200,
385
386
  "content": b"example",
386
387
  "url": "https://example.com/success",
388
+ "content-length": "1",
387
389
  }
388
390
  self.assertEqual(response.content, expected.get("content"))
389
391
  self.assertEqual(response.status_code, expected.get("status_code"))
390
392
  self.assertEqual(response.url, expected.get("url"))
393
+ self.assertEqual(response.headers.get("content-length"), expected.get("content-length"))
394
+
395
+ @patch("requests.Session.send")
396
+ def test_make_request_enforces_max_response_size(self, mocked_request):
397
+ returned_max_size, test_max_size = "5000", 1527
398
+
399
+ response = requests.Response()
400
+ response.headers = {"content-length": returned_max_size, "content-type": "application/json"}
401
+ mocked_request.return_value = response
402
+
403
+ test_request = requests.Request(method="GET", url="https://event_source.com/api/v1/logs")
404
+
405
+ with self.assertRaises(APIException) as api_err:
406
+ helper.make_request(_request=test_request, stream=True, max_response_size=test_max_size)
407
+
408
+ self.assertEqual(400, api_err.exception.status_code)
409
+ exp_err_cause = f"API response is exceeding allowed limit of {test_max_size} bytes."
410
+ exp_err_data = f"Content length returned was {returned_max_size} and max allowed is {test_max_size}"
411
+ self.assertEqual(400, api_err.exception.status_code)
412
+ self.assertEqual(exp_err_cause, api_err.exception.cause)
413
+ self.assertEqual(exp_err_data, api_err.exception.data)
414
+
391
415
 
392
416
  @parameterized.expand(
393
417
  [
@@ -34,6 +34,7 @@ def get_mock_response(
34
34
  response._content = bytes_string
35
35
  response.url = url
36
36
  response.reason = reason
37
+ response.headers = {"content-length": "1", "content-type": "application/json"}
37
38
 
38
39
  def return_json():
39
40
  return data