feat(core): Default encoding/decoding limits (#1335)
* feat(core): Default encoding/decoding limits This PR adds new defaults for both client and server max encoding/decoding message size limits. By default, the max message decoding size is `4MB` and the max message encoding size is `usize::MAX`. This is follow up work from https://github.com/hyperium/tonic/pull/1274 BREAKING: Default max message encoding/decoding limits * update generated code
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
use super::compression::{decompress, CompressionEncoding};
|
||||
use super::{DecodeBuf, Decoder, DEFAULT_MAX_MESSAGE_SIZE, HEADER_SIZE};
|
||||
use super::{DecodeBuf, Decoder, DEFAULT_MAX_RECV_MESSAGE_SIZE, HEADER_SIZE};
|
||||
use crate::{body::BoxBody, metadata::MetadataMap, Code, Status};
|
||||
use bytes::{Buf, BufMut, BytesMut};
|
||||
use futures_core::Stream;
|
||||
@@ -174,7 +174,9 @@ impl StreamingInner {
|
||||
};
|
||||
|
||||
let len = self.buf.get_u32() as usize;
|
||||
let limit = self.max_message_size.unwrap_or(DEFAULT_MAX_MESSAGE_SIZE);
|
||||
let limit = self
|
||||
.max_message_size
|
||||
.unwrap_or(DEFAULT_MAX_RECV_MESSAGE_SIZE);
|
||||
if len > limit {
|
||||
return Err(Status::new(
|
||||
Code::OutOfRange,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use super::compression::{compress, CompressionEncoding, SingleMessageCompressionOverride};
|
||||
use super::{EncodeBuf, Encoder, DEFAULT_MAX_MESSAGE_SIZE, HEADER_SIZE};
|
||||
use super::{EncodeBuf, Encoder, DEFAULT_MAX_SEND_MESSAGE_SIZE, HEADER_SIZE};
|
||||
use crate::{Code, Status};
|
||||
use bytes::{BufMut, Bytes, BytesMut};
|
||||
use futures_core::{Stream, TryStream};
|
||||
@@ -141,7 +141,7 @@ fn finish_encoding(
|
||||
buf: &mut BytesMut,
|
||||
) -> Result<Bytes, Status> {
|
||||
let len = buf.len() - HEADER_SIZE;
|
||||
let limit = max_message_size.unwrap_or(DEFAULT_MAX_MESSAGE_SIZE);
|
||||
let limit = max_message_size.unwrap_or(DEFAULT_MAX_SEND_MESSAGE_SIZE);
|
||||
if len > limit {
|
||||
return Err(Status::new(
|
||||
Code::OutOfRange,
|
||||
|
||||
@@ -30,7 +30,8 @@ const HEADER_SIZE: usize =
|
||||
std::mem::size_of::<u32>();
|
||||
|
||||
// The default maximum uncompressed size in bytes for a message. Defaults to 4MB.
|
||||
const DEFAULT_MAX_MESSAGE_SIZE: usize = 4 * 1024 * 1024;
|
||||
const DEFAULT_MAX_RECV_MESSAGE_SIZE: usize = 4 * 1024 * 1024;
|
||||
const DEFAULT_MAX_SEND_MESSAGE_SIZE: usize = usize::MAX;
|
||||
|
||||
/// Trait that knows how to encode and decode gRPC messages.
|
||||
pub trait Codec {
|
||||
|
||||
@@ -53,6 +53,14 @@
|
||||
//! to build even more feature rich clients and servers. This module also provides the ability to
|
||||
//! enable TLS using [`rustls`], via the `tls` feature flag.
|
||||
//!
|
||||
//! # Code generated client/server configuration
|
||||
//!
|
||||
//! ## Max Message Size
|
||||
//!
|
||||
//! Currently, both servers and clients can be configured to set the max message encoding and
|
||||
//! decoding size. This will ensure that an incoming gRPC message will not exahust the systems
|
||||
//! memory. By default, the decoding message limit is `4MB` and the encoding limit is `usize::MAX`.
|
||||
//!
|
||||
//! [gRPC]: https://grpc.io
|
||||
//! [`tonic`]: https://github.com/hyperium/tonic
|
||||
//! [`tokio`]: https://docs.rs/tokio
|
||||
|
||||
Reference in New Issue
Block a user