Skip to content

Comments

fix: gRPC metadata header casing and invocation_metadata() call#676

Merged
ishymko merged 9 commits intoa2aproject:mainfrom
guglielmo-san:guglielmoc/fix_grpc_metadata
Feb 11, 2026
Merged

fix: gRPC metadata header casing and invocation_metadata() call#676
ishymko merged 9 commits intoa2aproject:mainfrom
guglielmo-san:guglielmoc/fix_grpc_metadata

Conversation

@guglielmo-san
Copy link
Member

@guglielmo-san guglielmo-san commented Feb 9, 2026

This PR fixes two issues related to the grpc support:

  1. The extension headers key in the metadata are supposed to be lower key (ref)
  2. Invokes correctly the servicer_context.invocation_metadata as a method instead of as a property

For each of these issues was respectively opened a community PR (#635 , #673). To speed up the integration of these changes, this new PR has been created to integrate both changes at the same time.

Fixes #656

@guglielmo-san guglielmo-san requested a review from a team as a code owner February 9, 2026 15:00
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @guglielmo-san, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses two critical issues in the gRPC support: ensuring that extension header keys are always lowercase for compliance with gRPC standards and correcting the invocation of the invocation_metadata method on ServicerContext. These changes improve the robustness and correctness of gRPC communication within the system, resolving potential interoperability problems and API misuse.

Highlights

Changelog
  • src/a2a/client/transports/grpc.py
    • Ensured HTTP_EXTENSION_HEADER is converted to lowercase when constructing gRPC metadata.
    • Refactored logic for determining which extensions to use for metadata creation.
  • src/a2a/server/request_handlers/grpc_handler.py
    • Changed context.invocation_metadata to context.invocation_metadata() to correctly call it as a method.
    • Applied .lower() to HTTP_EXTENSION_HEADER when retrieving and setting metadata to ensure lowercase keys.
    • Adjusted the placement of lower_key = key.lower() for improved consistency.
  • tests/client/transports/test_grpc_client.py
    • Updated test assertions to reflect the change in HTTP_EXTENSION_HEADER to its lowercase form in metadata.
  • tests/integration/test_client_server_integration.py
    • Added an extensions parameter to transport.send_message calls in integration tests.
    • Included an assertion to verify that received_context.requested_extensions correctly captures the sent extensions.
  • tests/server/request_handlers/test_grpc_handler.py
    • Modified mock invocation_metadata to be a mock method returning grpc.aio.Metadata.
    • Updated mock metadata creation and assertions to use HTTP_EXTENSION_HEADER.lower().
Activity
  • No human activity has occurred on this pull request yet.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This PR addresses two issues in the gRPC support: standardizing extension headers to lowercase and correcting the invocation of servicer_context.invocation_metadata as a method. The changes involve modifying the client and server-side code to ensure consistency in header casing and proper method invocation, along with updating the corresponding tests to reflect these changes.

@guglielmo-san guglielmo-san requested a review from ishymko February 9, 2026 15:16
guglielmo-san and others added 4 commits February 9, 2026 16:22
Co-authored-by: Holt Skinner <13262395+holtskinner@users.noreply.github.com>
Co-authored-by: Holt Skinner <13262395+holtskinner@users.noreply.github.com>
@ishymko ishymko changed the title fix: Standardize gRPC extension header to lowercase and update invocation metadata from grpc.aio.ServicerContext to use the correct syntax fix: gRPC metadata header casing and invocation_metadata() call Feb 11, 2026
@ishymko ishymko merged commit 390b763 into a2aproject:main Feb 11, 2026
9 checks passed
ishymko added a commit that referenced this pull request Feb 12, 2026
[`Metadata` is a
`Collection`](https://grpc.github.io/grpc/python/_modules/grpc/aio/_metadata.html)
so iterating over key-value tuples is possible, there are existing tests
in `test_grpc_handler.py`.

Re #676
@guglielmo-san guglielmo-san deleted the guglielmoc/fix_grpc_metadata branch February 13, 2026 16:33
ishymko pushed a commit that referenced this pull request Feb 17, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.3.23](v0.3.22...v0.3.23)
(2026-02-13)


### Features

* add async context manager support to BaseClient
([#688](#688))
([ae9dc88](ae9dc88))
* add async context manager support to ClientTransport
([#682](#682))
([2e45c0d](2e45c0d))
* support async card modifiers
([#654](#654))
([a802500](a802500))
* support disabling OTel instrumentation via env var
([#611](#611))
([72216b9](72216b9))


### Bug Fixes

* do not crash on SSE comment line
([#636](#636))
([3dcb847](3dcb847))
* gRPC metadata header casing and invocation_metadata() call
([#676](#676))
([390b763](390b763))
* Improve error handling for Timeout exceptions on REST and JSON-RPC
clients ([#690](#690))
([2acd838](2acd838))
* map rejected task state in proto converters
([#668](#668))
([957e92b](957e92b)),
closes [#625](#625)
* **server:** fix deadlocks on agent execution failure in non-streaming
([#614](#614))
([d3c973f](d3c973f))


### Documentation

* explicitly mention supported spec version and transports in readme
([#681](#681))
([c91d4fb](c91d4fb)),
closes [#677](#677)
* Update README to include Code Wiki badge
([2698cc0](2698cc0))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Metadata key 'X-A2A-Extensions' is invalid: INTERNAL: Illegal header key ( gRPC metadata key X-A2A-Extensions is invalid )

3 participants