tonic icon indicating copy to clipboard operation
tonic copied to clipboard

I get `h2 protocol error: http2 error` when the message in tonic::Status is too large

Open stevenroose opened this issue 11 months ago • 3 comments

Bug Report

Version

v0.12.3

Platform

Linux <hostname> 6.6.80 #1-NixOS SMP PREEMPT_DYNAMIC Thu Feb 27 12:10:54 UTC 2025 x86_64 GNU/Linux

Description

I'm writing tests to test error handling on bad user arguments and to ensure correct errors are returned. I fire requests sequentially, so nothing racy.

For some of my requests, tonic returns h2 protocol error: http2 error instead of the error I expect. I traced down my server code until I actually return a tonic::Status::invalid_argument from my server implementation method, but somehow it comes back as h2 protocol error: http2 error.

Since I'm dumping the full stack trace into the message passed into tonic::Status::invalid_argument, I thought maybe there are some limits on body size. Which seems to be the case. I shortened the message and it works fine.

This seems to be quite unintuitive. Why is there a limit on error body? Why is this not documented anywhere, but instead silently results in a weird internal http2 error?

stevenroose avatar Mar 09 '25 12:03 stevenroose

Thats a good question I can't think off the top of my head where that might be and we should def document that. I think it would be good to figure out where that is happening and to then add the appropriate docs for it.

LucioFranco avatar Mar 20 '25 12:03 LucioFranco

@LucioFranco FYI The issue occurs in tonic/src/status.rs in the from_hyper_error method. This is because gRPC status messages are sent via HTTP/2 headers, and HTTP/2 default maximum header size is 16 KB.

@stevenroose It is possible to configure the http2_max_header_list_size since 0.12.2.

victornguen avatar Jul 06 '25 12:07 victornguen

Ah nice catch, we should probably limit the output size of the error to work with the default size of h2 headers.

LucioFranco avatar Jul 06 '25 14:07 LucioFranco