Skip to content

Commit f096394

Browse files
authored
feat(request-response): allow custom sizes for json and cbor codec
resolves #5791. Pull-Request: #5792.
1 parent 34ac476 commit f096394

File tree

3 files changed

+65
-16
lines changed

3 files changed

+65
-16
lines changed

protocols/request-response/CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
- Add connection id to the events emitted by a request-response `Behaviour`.
44
See [PR 5719](https://github.com/libp2p/rust-libp2p/pull/5719).
55

6+
- Allow configurable request and response sizes for `json` and `cbor` codec.
7+
See [PR 5792](https://github.com/libp2p/rust-libp2p/pull/5792).
8+
69
## 0.27.1
710

811
- Deprecate `void` crate.

protocols/request-response/src/cbor.rs

+31-8
Original file line numberDiff line numberDiff line change
@@ -55,26 +55,45 @@ mod codec {
5555
use libp2p_swarm::StreamProtocol;
5656
use serde::{de::DeserializeOwned, Serialize};
5757

58-
/// Max request size in bytes
59-
const REQUEST_SIZE_MAXIMUM: u64 = 1024 * 1024;
60-
/// Max response size in bytes
61-
const RESPONSE_SIZE_MAXIMUM: u64 = 10 * 1024 * 1024;
62-
6358
pub struct Codec<Req, Resp> {
59+
/// Max request size in bytes.
60+
request_size_maximum: u64,
61+
/// Max response size in bytes.
62+
response_size_maximum: u64,
6463
phantom: PhantomData<(Req, Resp)>,
6564
}
6665

6766
impl<Req, Resp> Default for Codec<Req, Resp> {
6867
fn default() -> Self {
6968
Codec {
69+
request_size_maximum: 1024 * 1024,
70+
response_size_maximum: 10 * 1024 * 1024,
7071
phantom: PhantomData,
7172
}
7273
}
7374
}
7475

7576
impl<Req, Resp> Clone for Codec<Req, Resp> {
7677
fn clone(&self) -> Self {
77-
Self::default()
78+
Self {
79+
request_size_maximum: self.request_size_maximum,
80+
response_size_maximum: self.response_size_maximum,
81+
phantom: PhantomData,
82+
}
83+
}
84+
}
85+
86+
impl<Req, Resp> Codec<Req, Resp> {
87+
/// Sets the limit for request size in bytes.
88+
pub fn set_request_size_maximum(mut self, request_size_maximum: u64) -> Self {
89+
self.request_size_maximum = request_size_maximum;
90+
self
91+
}
92+
93+
/// Sets the limit for response size in bytes.
94+
pub fn set_response_size_maximum(mut self, response_size_maximum: u64) -> Self {
95+
self.response_size_maximum = response_size_maximum;
96+
self
7897
}
7998
}
8099

@@ -94,7 +113,9 @@ mod codec {
94113
{
95114
let mut vec = Vec::new();
96115

97-
io.take(REQUEST_SIZE_MAXIMUM).read_to_end(&mut vec).await?;
116+
io.take(self.request_size_maximum)
117+
.read_to_end(&mut vec)
118+
.await?;
98119

99120
cbor4ii::serde::from_slice(vec.as_slice()).map_err(decode_into_io_error)
100121
}
@@ -105,7 +126,9 @@ mod codec {
105126
{
106127
let mut vec = Vec::new();
107128

108-
io.take(RESPONSE_SIZE_MAXIMUM).read_to_end(&mut vec).await?;
129+
io.take(self.response_size_maximum)
130+
.read_to_end(&mut vec)
131+
.await?;
109132

110133
cbor4ii::serde::from_slice(vec.as_slice()).map_err(decode_into_io_error)
111134
}

protocols/request-response/src/json.rs

+31-8
Original file line numberDiff line numberDiff line change
@@ -54,26 +54,45 @@ mod codec {
5454
use libp2p_swarm::StreamProtocol;
5555
use serde::{de::DeserializeOwned, Serialize};
5656

57-
/// Max request size in bytes
58-
const REQUEST_SIZE_MAXIMUM: u64 = 1024 * 1024;
59-
/// Max response size in bytes
60-
const RESPONSE_SIZE_MAXIMUM: u64 = 10 * 1024 * 1024;
61-
6257
pub struct Codec<Req, Resp> {
58+
/// Max request size in bytes
59+
request_size_maximum: u64,
60+
/// Max response size in bytes
61+
response_size_maximum: u64,
6362
phantom: PhantomData<(Req, Resp)>,
6463
}
6564

6665
impl<Req, Resp> Default for Codec<Req, Resp> {
6766
fn default() -> Self {
6867
Codec {
68+
request_size_maximum: 1024 * 1024,
69+
response_size_maximum: 10 * 1024 * 1024,
6970
phantom: PhantomData,
7071
}
7172
}
7273
}
7374

7475
impl<Req, Resp> Clone for Codec<Req, Resp> {
7576
fn clone(&self) -> Self {
76-
Self::default()
77+
Self {
78+
request_size_maximum: self.request_size_maximum,
79+
response_size_maximum: self.response_size_maximum,
80+
phantom: self.phantom,
81+
}
82+
}
83+
}
84+
85+
impl<Req, Resp> Codec<Req, Resp> {
86+
/// Sets the limit for request size in bytes.
87+
pub fn set_request_size_maximum(mut self, request_size_maximum: u64) -> Self {
88+
self.request_size_maximum = request_size_maximum;
89+
self
90+
}
91+
92+
/// Sets the limit for response size in bytes.
93+
pub fn set_response_size_maximum(mut self, response_size_maximum: u64) -> Self {
94+
self.response_size_maximum = response_size_maximum;
95+
self
7796
}
7897
}
7998

@@ -93,7 +112,9 @@ mod codec {
93112
{
94113
let mut vec = Vec::new();
95114

96-
io.take(REQUEST_SIZE_MAXIMUM).read_to_end(&mut vec).await?;
115+
io.take(self.request_size_maximum)
116+
.read_to_end(&mut vec)
117+
.await?;
97118

98119
Ok(serde_json::from_slice(vec.as_slice())?)
99120
}
@@ -104,7 +125,9 @@ mod codec {
104125
{
105126
let mut vec = Vec::new();
106127

107-
io.take(RESPONSE_SIZE_MAXIMUM).read_to_end(&mut vec).await?;
128+
io.take(self.response_size_maximum)
129+
.read_to_end(&mut vec)
130+
.await?;
108131

109132
Ok(serde_json::from_slice(vec.as_slice())?)
110133
}

0 commit comments

Comments
 (0)