Skip to content

Bug: Registering a protobuf schema with non-asci characters causes an 500 Internal Server Error #1171

@rtbe

Description

@rtbe

What happened?

Registering a protobuf schema with non-asci characters causes an 500 Internal Server Error.

What did you expect to happen?

Schema to be registered.

What else do we need to know?

Tried with ghcr.io/aiven-open/karapace:latest image to register schema with non-acsi characters, for example:

syntax = "proto3";

package example;

// Event событие
message Event {
  string id = 1; // идентификатор события
}

Stack trace with an error from container logs:

uvicorn.error        MainThread      ERROR           Exception in ASGI application
  + Exception Group Traceback (most recent call last):
  |   File "/venv/lib/python3.10/site-packages/starlette/_utils.py", line 76, in collapse_excgroups
  |     yield
  |   File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 186, in __call__
  |     async with anyio.create_task_group() as task_group:
  |   File "/venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 772, in __aexit__
  |     raise BaseExceptionGroup(
  | exceptiongroup.ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "/venv/lib/python3.10/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi
    |     result = await app(  # type: ignore[func-returns-value]
    |   File "/venv/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__
    |     return await self.app(scope, receive, send)
    |   File "/venv/lib/python3.10/site-packages/fastapi/applications.py", line 1054, in __call__
    |     await super().__call__(scope, receive, send)
    |   File "/venv/lib/python3.10/site-packages/starlette/applications.py", line 113, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/venv/lib/python3.10/site-packages/starlette/middleware/errors.py", line 187, in __call__
    |     raise exc
    |   File "/venv/lib/python3.10/site-packages/starlette/middleware/errors.py", line 165, in __call__
    |     await self.app(scope, receive, _send)
    |   File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 185, in __call__
    |     with collapse_excgroups():
    |   File "/usr/local/lib/python3.10/contextlib.py", line 153, in __exit__
    |     self.gen.throw(typ, value, traceback)
    |   File "/venv/lib/python3.10/site-packages/starlette/_utils.py", line 82, in collapse_excgroups
    |     raise exc
    |   File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 187, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |   File "/venv/lib/python3.10/site-packages/dependency_injector/wiring.py", line 994, in _patched
    |     return await _async_inject(
    |   File "src/dependency_injector/_cwiring.pyx", line 66, in _async_inject
    |   File "/venv/lib/python3.10/site-packages/karapace/api/telemetry/middleware.py", line 39, in telemetry_middleware
    |     raise exc
    |   File "/venv/lib/python3.10/site-packages/karapace/api/telemetry/middleware.py", line 32, in telemetry_middleware
    |     response: Response = await call_next(request)
    |   File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 163, in call_next
    |     raise app_exc
    |   File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 149, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 185, in __call__
    |     with collapse_excgroups():
    |   File "/usr/local/lib/python3.10/contextlib.py", line 153, in __exit__
    |     self.gen.throw(typ, value, traceback)
    |   File "/venv/lib/python3.10/site-packages/starlette/_utils.py", line 82, in collapse_excgroups
    |     raise exc
    |   File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 187, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |   File "/venv/lib/python3.10/site-packages/karapace/api/middlewares/__init__.py", line 77, in set_content_types
    |     response = await call_next(request)
    |   File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 163, in call_next
    |     raise app_exc
    |   File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 149, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/venv/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
    |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
    |   File "/venv/lib/python3.10/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/venv/lib/python3.10/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/venv/lib/python3.10/site-packages/starlette/routing.py", line 715, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/venv/lib/python3.10/site-packages/starlette/routing.py", line 735, in app
    |     await route.handle(scope, receive, send)
    |   File "/venv/lib/python3.10/site-packages/starlette/routing.py", line 288, in handle
    |     await self.app(scope, receive, send)
    |   File "/venv/lib/python3.10/site-packages/starlette/routing.py", line 76, in app
    |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
    |   File "/venv/lib/python3.10/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/venv/lib/python3.10/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/venv/lib/python3.10/site-packages/starlette/routing.py", line 73, in app
    |     response = await f(request)
    |   File "/venv/lib/python3.10/site-packages/fastapi/routing.py", line 301, in app
    |     raw_response = await run_endpoint_function(
    |   File "/venv/lib/python3.10/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
    |     return await dependant.call(**values)
    |   File "/venv/lib/python3.10/site-packages/dependency_injector/wiring.py", line 994, in _patched
    |     return await _async_inject(
    |   File "src/dependency_injector/_cwiring.pyx", line 66, in _async_inject
    |   File "/venv/lib/python3.10/site-packages/karapace/api/routers/subjects.py", line 117, in subjects_subject_versions_post
    |     return await controller.subject_post(
    |   File "/venv/lib/python3.10/site-packages/karapace/api/controller.py", line 809, in subject_post
    |     new_schema = ValidatedTypedSchema.parse(
    |   File "/venv/lib/python3.10/site-packages/karapace/core/schema_models.py", line 395, in parse
    |     parsed_schema = parse(
    |   File "/venv/lib/python3.10/site-packages/karapace/core/schema_models.py", line 232, in parse
    |     parsed_schema = parse_protobuf_schema_definition(
    |   File "/venv/lib/python3.10/site-packages/karapace/core/schema_models.py", line 91, in parse_protobuf_schema_definition
    |     ProtobufSchema(schema_definition, references, dependencies)
    |   File "/venv/lib/python3.10/site-packages/karapace/core/protobuf/schema.py", line 186, in __init__
    |     self.proto_file_element = deserialize(schema)
    |   File "/venv/lib/python3.10/site-packages/karapace/core/protobuf/serialization.py", line 173, in deserialize
    |     serialized_pb = base64.b64decode(schema_b64, validate=True)
    |   File "/usr/local/lib/python3.10/base64.py", line 80, in b64decode
    |     s = _bytes_from_decode_data(s)
    |   File "/usr/local/lib/python3.10/base64.py", line 39, in _bytes_from_decode_data
    |     raise ValueError('string argument should contain only ASCII characters')
    | ValueError: string argument should contain only ASCII characters
    +------------------------------------

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/venv/lib/python3.10/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
  File "/venv/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__
    return await self.app(scope, receive, send)
  File "/venv/lib/python3.10/site-packages/fastapi/applications.py", line 1054, in __call__
    await super().__call__(scope, receive, send)
  File "/venv/lib/python3.10/site-packages/starlette/applications.py", line 113, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/venv/lib/python3.10/site-packages/starlette/middleware/errors.py", line 187, in __call__
    raise exc
  File "/venv/lib/python3.10/site-packages/starlette/middleware/errors.py", line 165, in __call__
    await self.app(scope, receive, _send)
  File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 185, in __call__
    with collapse_excgroups():
  File "/usr/local/lib/python3.10/contextlib.py", line 153, in __exit__
    self.gen.throw(typ, value, traceback)
  File "/venv/lib/python3.10/site-packages/starlette/_utils.py", line 82, in collapse_excgroups
    raise exc
  File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 187, in __call__
    response = await self.dispatch_func(request, call_next)
  File "/venv/lib/python3.10/site-packages/dependency_injector/wiring.py", line 994, in _patched
    return await _async_inject(
  File "src/dependency_injector/_cwiring.pyx", line 66, in _async_inject
  File "/venv/lib/python3.10/site-packages/karapace/api/telemetry/middleware.py", line 39, in telemetry_middleware
    raise exc
  File "/venv/lib/python3.10/site-packages/karapace/api/telemetry/middleware.py", line 32, in telemetry_middleware
    response: Response = await call_next(request)
  File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 163, in call_next
    raise app_exc
  File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 149, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 185, in __call__
    with collapse_excgroups():
  File "/usr/local/lib/python3.10/contextlib.py", line 153, in __exit__
    self.gen.throw(typ, value, traceback)
  File "/venv/lib/python3.10/site-packages/starlette/_utils.py", line 82, in collapse_excgroups
    raise exc
  File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 187, in __call__
    response = await self.dispatch_func(request, call_next)
  File "/venv/lib/python3.10/site-packages/karapace/api/middlewares/__init__.py", line 77, in set_content_types
    response = await call_next(request)
  File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 163, in call_next
    raise app_exc
  File "/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 149, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/venv/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
    await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
  File "/venv/lib/python3.10/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/venv/lib/python3.10/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/venv/lib/python3.10/site-packages/starlette/routing.py", line 715, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/venv/lib/python3.10/site-packages/starlette/routing.py", line 735, in app
    await route.handle(scope, receive, send)
  File "/venv/lib/python3.10/site-packages/starlette/routing.py", line 288, in handle
    await self.app(scope, receive, send)
  File "/venv/lib/python3.10/site-packages/starlette/routing.py", line 76, in app
    await wrap_app_handling_exceptions(app, request)(scope, receive, send)
  File "/venv/lib/python3.10/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/venv/lib/python3.10/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/venv/lib/python3.10/site-packages/starlette/routing.py", line 73, in app
    response = await f(request)
  File "/venv/lib/python3.10/site-packages/fastapi/routing.py", line 301, in app
    raw_response = await run_endpoint_function(
  File "/venv/lib/python3.10/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
    return await dependant.call(**values)
  File "/venv/lib/python3.10/site-packages/dependency_injector/wiring.py", line 994, in _patched
    return await _async_inject(
  File "src/dependency_injector/_cwiring.pyx", line 66, in _async_inject
  File "/venv/lib/python3.10/site-packages/karapace/api/routers/subjects.py", line 117, in subjects_subject_versions_post
    return await controller.subject_post(
  File "/venv/lib/python3.10/site-packages/karapace/api/controller.py", line 809, in subject_post
    new_schema = ValidatedTypedSchema.parse(
  File "/venv/lib/python3.10/site-packages/karapace/core/schema_models.py", line 395, in parse
    parsed_schema = parse(
  File "/venv/lib/python3.10/site-packages/karapace/core/schema_models.py", line 232, in parse
    parsed_schema = parse_protobuf_schema_definition(
  File "/venv/lib/python3.10/site-packages/karapace/core/schema_models.py", line 91, in parse_protobuf_schema_definition
    ProtobufSchema(schema_definition, references, dependencies)
  File "/venv/lib/python3.10/site-packages/karapace/core/protobuf/schema.py", line 186, in __init__
    self.proto_file_element = deserialize(schema)
  File "/venv/lib/python3.10/site-packages/karapace/core/protobuf/serialization.py", line 173, in deserialize
    serialized_pb = base64.b64decode(schema_b64, validate=True)
  File "/usr/local/lib/python3.10/base64.py", line 80, in b64decode
    s = _bytes_from_decode_data(s)
  File "/usr/local/lib/python3.10/base64.py", line 39, in _bytes_from_decode_data
    raise ValueError('string argument should contain only ASCII characters')
ValueError: string argument should contain only ASCII characters

Metadata

Metadata

Assignees

No one assigned

    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