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

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions