Skip to content

Errors are being swallowed (I think) #72

@gadomski

Description

@gadomski

I believe that exceptions aren't being allowed to propagate up correctly, leading to a server error (instead of a more informative message). The error occurs when attempting to decode the body of a error response. Apologies that I don't have an actual reproducer, I'll try to create one and will post back here if I can.

One guess on the source is that in ProcessLinksMiddleware, should_transform_response doesn't have a guard for status, so it's trying to transform any response with JSON content type?

Here's the traceback from an innocuous /search call to a STAC API w/ stac-auth-proxy in front of it. Notice how we're in the error handling code of starlette when we throw our own error b/c we can't decode the JSON.

Traceback (most recent call last):
  File "/var/task/mangum/protocols/http.py", line 66, in run
    await app(self.scope, self.receive, self.send)
  File "/var/task/fastapi/applications.py", line 1054, in __call__
    await super().__call__(scope, receive, send)
  File "/var/task/starlette/applications.py", line 113, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/var/task/starlette/middleware/errors.py", line 186, in __call__
    raise exc
  File "/var/task/starlette/middleware/errors.py", line 164, in __call__
    await self.app(scope, receive, _send)
  File "/var/task/starlette_cramjam/middleware.py", line 124, in __call__
    await self.app(scope, receive, send)
  File "/var/task/stac_auth_proxy/utils/middleware.py", line 101, in __call__
    return await self.app(scope, receive, transform_response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/task/stac_auth_proxy/middleware/EnforceAuthMiddleware.py", line 113, in __call__
    return await self.app(scope, receive, send)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/task/starlette/middleware/base.py", line 182, in __call__
    with recv_stream, send_stream, collapse_excgroups():
                                   ~~~~~~~~~~~~~~~~~~^^
  File "/var/lang/lib/python3.13/contextlib.py", line 162, in __exit__
    self.gen.throw(value)
    ~~~~~~~~~~~~~~^^^^^^^
  File "/var/task/starlette/_utils.py", line 83, in collapse_excgroups
    raise exc
  File "/var/task/starlette/middleware/base.py", line 184, in __call__
    response = await self.dispatch_func(request, call_next)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/task/stac_auth_proxy/middleware/AddProcessTimeHeaderMiddleware.py", line 15, in dispatch
    response = await call_next(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/task/starlette/middleware/base.py", line 159, in call_next
    raise app_exc
  File "/var/task/starlette/middleware/base.py", line 144, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/var/task/stac_auth_proxy/utils/middleware.py", line 101, in __call__
    return await self.app(scope, receive, transform_response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/task/stac_auth_proxy/utils/middleware.py", line 101, in __call__
    return await self.app(scope, receive, transform_response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/task/starlette/middleware/exceptions.py", line 63, in __call__
    await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
  File "/var/task/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/var/task/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/var/task/starlette/routing.py", line 716, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/var/task/starlette/routing.py", line 736, in app
    await route.handle(scope, receive, send)
  File "/var/task/starlette/routing.py", line 290, in handle
    await self.app(scope, receive, send)
  File "/var/task/starlette/routing.py", line 78, in app
    await wrap_app_handling_exceptions(app, request)(scope, receive, send)
  File "/var/task/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/var/task/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/var/task/starlette/routing.py", line 76, in app
    await response(scope, receive, send)
  File "/var/task/starlette/responses.py", line 165, in __call__
    await send({"type": prefix + "http.response.body", "body": self.body})
  File "/var/task/starlette/_exception_handler.py", line 39, in sender
    await send(message)
  File "/var/task/starlette/_exception_handler.py", line 39, in sender
    await send(message)
  File "/var/task/stac_auth_proxy/utils/middleware.py", line 81, in transform_response
    data = json.loads(body)
  File "/var/lang/lib/python3.13/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ~~~~~~~~~~~~~~~~~~~~~~~^^^
  File "/var/lang/lib/python3.13/json/decoder.py", line 345, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/lang/lib/python3.13/json/decoder.py", line 363, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions