Skip to content

Invalid request body #37

@lukaszlacinski

Description

@lukaszlacinski
INFO:     128.55.64.29:0 - "PATCH /collections/CMIP6/items/CMIP6.CMIP.MOHC.UKESM1-1-LL.piControl.r1i1p1f2.Amon.tauu.gn.v20220505 HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
  + Exception Group Traceback (most recent call last):
  |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/_utils.py", line 77, in collapse_excgroups
  |     yield
  |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/middleware/base.py", line 186, in __call__
  |     async with anyio.create_task_group() as task_group:
  |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/anyio/_backends/_asyncio.py", line 763, in __aexit__
  |     raise BaseExceptionGroup(
  | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/uvicorn/protocols/http/h11_impl.py", line 406, in run_asgi
    |     result = await app(  # type: ignore[func-returns-value]
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__
    |     return await self.app(scope, receive, send)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/fastapi/applications.py", line 1054, in __call__
    |     await super().__call__(scope, receive, send)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/applications.py", line 113, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/middleware/errors.py", line 187, in __call__
    |     raise exc
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/middleware/errors.py", line 165, in __call__
    |     await self.app(scope, receive, _send)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/middleware/base.py", line 185, in __call__
    |     with collapse_excgroups():
    |   File "/usr/lib64/python3.11/contextlib.py", line 158, in __exit__
    |     self.gen.throw(typ, value, traceback)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/_utils.py", line 83, in collapse_excgroups
    |     raise exc
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/middleware/base.py", line 187, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/src/authorizer.py", line 72, in dispatch
    |     return await call_next(request)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/middleware/base.py", line 163, in call_next
    |     raise app_exc
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/middleware/base.py", line 149, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
    |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/_exception_handler.py", line 62, in wrapped_app
    |     raise exc
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/_exception_handler.py", line 51, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/routing.py", line 715, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/routing.py", line 735, in app
    |     await route.handle(scope, receive, send)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/routing.py", line 288, in handle
    |     await self.app(scope, receive, send)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/routing.py", line 76, in app
    |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/_exception_handler.py", line 62, in wrapped_app
    |     raise exc
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/_exception_handler.py", line 51, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/starlette/routing.py", line 73, in app
    |     response = await f(request)
    |                ^^^^^^^^^^^^^^^^
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/fastapi/routing.py", line 301, in app
    |     raw_response = await run_endpoint_function(
    |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
    |     return await dependant.call(**values)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/venv/lib64/python3.11/site-packages/stac_fastapi/api/routes.py", line 63, in _endpoint
    |     return _wrap_response(await func(request=request, **request_data.kwargs()))
    |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/src/client.py", line 287, in patch_item
    |     validate_patch(event_id=event_id, request_id=request_id, item_id=item_id, item=item, extensions=item_extensions)
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/src/utils.py", line 182, in validate_patch
    |     item, null_keys = get_null_keys(item)
    |                       ^^^^^^^^^^^^^^^^^^^
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/src/utils.py", line 139, in get_null_keys
    |     item_dict, null_keys = nested_null_keys(item.model_dump())
    |                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/src/utils.py", line 133, in nested_null_keys
    |     sub_dict, sub_null_keys = get_null_keys(v)
    |                               ^^^^^^^^^^^^^^^^
    |   File "/home/ec2-user/esgfng/client_integration/stac-transaction-api/src/utils.py", line 139, in get_null_keys
    |     item_dict, null_keys = nested_null_keys(item.model_dump())
    |                                             ^^^^^^^^^^^^^^^
    | AttributeError: 'dict' object has no attribute 'model_dump'
    +------------------------------------

The exception is thrown when the PATCH request body is invalid. It should be handled in a more client-friendly way.

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions