@@ -20,15 +20,35 @@ use std::sync::Arc;
2020
2121const MAXIMUM_REQUEST_BODY_SIZE : usize = 1024 * 1024 * 1024 ;
2222
23+ #[ derive( Clone ) ]
24+ pub ( crate ) struct VssServiceConfig {
25+ maximum_request_body_size : usize ,
26+ }
27+
28+ impl VssServiceConfig {
29+ pub fn new ( maximum_request_body_size : usize ) -> Self {
30+ Self { maximum_request_body_size : maximum_request_body_size. min ( MAXIMUM_REQUEST_BODY_SIZE ) }
31+ }
32+ }
33+
34+ impl Default for VssServiceConfig {
35+ fn default ( ) -> Self {
36+ Self { maximum_request_body_size : MAXIMUM_REQUEST_BODY_SIZE }
37+ }
38+ }
39+
2340#[ derive( Clone ) ]
2441pub struct VssService {
2542 store : Arc < dyn KvStore > ,
2643 authorizer : Arc < dyn Authorizer > ,
44+ config : VssServiceConfig ,
2745}
2846
2947impl VssService {
30- pub ( crate ) fn new ( store : Arc < dyn KvStore > , authorizer : Arc < dyn Authorizer > ) -> Self {
31- Self { store, authorizer }
48+ pub ( crate ) fn new (
49+ store : Arc < dyn KvStore > , authorizer : Arc < dyn Authorizer > , config : VssServiceConfig ,
50+ ) -> Self {
51+ Self { store, authorizer, config }
3252 }
3353}
3454
@@ -43,22 +63,51 @@ impl Service<Request<Incoming>> for VssService {
4363 let store = Arc :: clone ( & self . store ) ;
4464 let authorizer = Arc :: clone ( & self . authorizer ) ;
4565 let path = req. uri ( ) . path ( ) . to_owned ( ) ;
66+ let maximum_request_body_size = self . config . maximum_request_body_size ;
4667
4768 Box :: pin ( async move {
4869 let prefix_stripped_path = path. strip_prefix ( BASE_PATH_PREFIX ) . unwrap_or_default ( ) ;
4970
5071 match prefix_stripped_path {
5172 "/getObject" => {
52- handle_request ( store, authorizer, req, handle_get_object_request) . await
73+ handle_request (
74+ store,
75+ authorizer,
76+ req,
77+ maximum_request_body_size,
78+ handle_get_object_request,
79+ )
80+ . await
5381 } ,
5482 "/putObjects" => {
55- handle_request ( store, authorizer, req, handle_put_object_request) . await
83+ handle_request (
84+ store,
85+ authorizer,
86+ req,
87+ maximum_request_body_size,
88+ handle_put_object_request,
89+ )
90+ . await
5691 } ,
5792 "/deleteObject" => {
58- handle_request ( store, authorizer, req, handle_delete_object_request) . await
93+ handle_request (
94+ store,
95+ authorizer,
96+ req,
97+ maximum_request_body_size,
98+ handle_delete_object_request,
99+ )
100+ . await
59101 } ,
60102 "/listKeyVersions" => {
61- handle_request ( store, authorizer, req, handle_list_object_request) . await
103+ handle_request (
104+ store,
105+ authorizer,
106+ req,
107+ maximum_request_body_size,
108+ handle_list_object_request,
109+ )
110+ . await
62111 } ,
63112 _ => {
64113 let error_msg = "Invalid request path." . as_bytes ( ) ;
@@ -99,7 +148,7 @@ async fn handle_request<
99148 Fut : Future < Output = Result < R , VssError > > + Send ,
100149> (
101150 store : Arc < dyn KvStore > , authorizer : Arc < dyn Authorizer > , request : Request < Incoming > ,
102- handler : F ,
151+ maximum_request_body_size : usize , handler : F ,
103152) -> Result < <VssService as Service < Request < Incoming > > >:: Response , hyper:: Error > {
104153 let ( parts, body) = request. into_parts ( ) ;
105154 let headers_map = parts
@@ -113,7 +162,7 @@ async fn handle_request<
113162 Err ( e) => return Ok ( build_error_response ( e) ) ,
114163 } ;
115164
116- let limited_body = Limited :: new ( body, MAXIMUM_REQUEST_BODY_SIZE . into ( ) ) ;
165+ let limited_body = Limited :: new ( body, maximum_request_body_size ) ;
117166 let bytes = match limited_body. collect ( ) . await {
118167 Ok ( body) => body. to_bytes ( ) ,
119168 Err ( _) => {
0 commit comments