swagger-py-codegen icon indicating copy to clipboard operation
swagger-py-codegen copied to clipboard

TypeError exception in response validation with falcon framework

Open marco-a-itl opened this issue 5 years ago • 0 comments

Running code generated for falcon framework from the following yaml file

https://forge.etsi.org/gitlab/mec/gs011-app-enablement-api/blob/master/Mp1.yaml

I get an exception for every response that the application tries to send out:

[2019-02-14 09:36:04 +0000] [17948] [ERROR] Error handling request /exampleAPI/mp1/v1/applications/applicazione1/dns_rules
Traceback (most recent call last):
  File "/src/var/mec/prova_venv/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 135, in handle
    self.handle_request(listener, req, client, addr)
  File "/src/var/mec/prova_venv/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 176, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/src/var/mec/prova_venv/lib/python2.7/site-packages/falcon/api.py", line 244, in __call__
    responder(req, resp, **params)
  File "/src/var/mec/prova_venv/lib/python2.7/site-packages/falcon/hooks.py", line 182, in do_after
    shim(req, resp, self, *action_args, **action_kwargs)
  File "/src/var/mec/swagger_test/mp1_ref/mp1_ref/exampleAPI_mp1_v1/validators.py", line 169, in response_filter
    description='`%d` is not a defined status code.' % status)
TypeError: %d format: a number is required, not NoneType

This is due to the fact that in validators.py (function response_filter) the status variable is (in falcon) a string containing the status code and the reason phrase, while filter is a dictionary indexed by status code as integer.

My workaround is the following:

-    status = None
-
-    if len(filter) == 1:
-        if six.PY3:
-            status = list(filter.keys())[0]
-        else:
-            status = filter.keys()[0]
+    status = int(resp.status.split()[0])

marco-a-itl avatar Feb 14 '19 08:02 marco-a-itl