feat(client): add conn::Builder::max_buf_size()
				
					
				
			This allows users to configure a limit to client connections' read and write buffers. Closes #1748
This commit is contained in:
		
				
					committed by
					
						 Sean McArthur
						Sean McArthur
					
				
			
			
				
	
			
			
			
						parent
						
							4dd9437560
						
					
				
				
					commit
					078ed82dd5
				
			| @@ -75,6 +75,7 @@ pub struct Builder { | |||||||
|     h1_writev: bool, |     h1_writev: bool, | ||||||
|     h1_title_case_headers: bool, |     h1_title_case_headers: bool, | ||||||
|     h1_read_buf_exact_size: Option<usize>, |     h1_read_buf_exact_size: Option<usize>, | ||||||
|  |     h1_max_buf_size: Option<usize>, | ||||||
|     http2: bool, |     http2: bool, | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -435,6 +436,7 @@ impl Builder { | |||||||
|             h1_writev: true, |             h1_writev: true, | ||||||
|             h1_read_buf_exact_size: None, |             h1_read_buf_exact_size: None, | ||||||
|             h1_title_case_headers: false, |             h1_title_case_headers: false, | ||||||
|  |             h1_max_buf_size: None, | ||||||
|             http2: false, |             http2: false, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -460,8 +462,21 @@ impl Builder { | |||||||
|  |  | ||||||
|     pub(super) fn h1_read_buf_exact_size(&mut self, sz: Option<usize>) -> &mut Builder { |     pub(super) fn h1_read_buf_exact_size(&mut self, sz: Option<usize>) -> &mut Builder { | ||||||
|         self.h1_read_buf_exact_size = sz; |         self.h1_read_buf_exact_size = sz; | ||||||
|  |         self.h1_max_buf_size = None; | ||||||
|         self |         self | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     pub(super) fn h1_max_buf_size(&mut self, max: usize) -> &mut Self { | ||||||
|  |         assert!( | ||||||
|  |             max >= proto::h1::MINIMUM_MAX_BUFFER_SIZE, | ||||||
|  |             "the max_buf_size cannot be smaller than the minimum that h1 specifies." | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  |         self.h1_max_buf_size = Some(max); | ||||||
|  |         self.h1_read_buf_exact_size = None; | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /// Sets whether HTTP2 is required. |     /// Sets whether HTTP2 is required. | ||||||
|     /// |     /// | ||||||
|     /// Default is false. |     /// Default is false. | ||||||
| @@ -510,6 +525,9 @@ where | |||||||
|             if let Some(sz) = self.builder.h1_read_buf_exact_size { |             if let Some(sz) = self.builder.h1_read_buf_exact_size { | ||||||
|                 conn.set_read_buf_exact_size(sz); |                 conn.set_read_buf_exact_size(sz); | ||||||
|             } |             } | ||||||
|  |             if let Some(max) = self.builder.h1_max_buf_size { | ||||||
|  |                 conn.set_max_buf_size(max); | ||||||
|  |             } | ||||||
|             let cd = proto::h1::dispatch::Client::new(rx); |             let cd = proto::h1::dispatch::Client::new(rx); | ||||||
|             let dispatch = proto::h1::Dispatcher::new(cd, conn); |             let dispatch = proto::h1::Dispatcher::new(cd, conn); | ||||||
|             Either::A(dispatch) |             Either::A(dispatch) | ||||||
|   | |||||||
| @@ -901,6 +901,8 @@ impl Builder { | |||||||
|  |  | ||||||
|     /// Sets the exact size of the read buffer to *always* use. |     /// Sets the exact size of the read buffer to *always* use. | ||||||
|     /// |     /// | ||||||
|  |     /// Note that setting this option unsets the `http1_max_buf_size` option. | ||||||
|  |     /// | ||||||
|     /// Default is an adaptive read buffer. |     /// Default is an adaptive read buffer. | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn http1_read_buf_exact_size(&mut self, sz: usize) -> &mut Self { |     pub fn http1_read_buf_exact_size(&mut self, sz: usize) -> &mut Self { | ||||||
| @@ -908,6 +910,21 @@ impl Builder { | |||||||
|         self |         self | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /// Set the maximum buffer size for the connection. | ||||||
|  |     /// | ||||||
|  |     /// Default is ~400kb. | ||||||
|  |     /// | ||||||
|  |     /// Note that setting this option unsets the `http1_read_exact_buf_size` option. | ||||||
|  |     /// | ||||||
|  |     /// # Panics | ||||||
|  |     /// | ||||||
|  |     /// The minimum value allowed is 8192. This method panics if the passed `max` is less than the minimum. | ||||||
|  |     #[inline] | ||||||
|  |     pub fn http1_max_buf_size(&mut self, max: usize) -> &mut Self { | ||||||
|  |         self.conn_builder.h1_max_buf_size(max); | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /// Set whether HTTP/1 connections will write header names as title case at |     /// Set whether HTTP/1 connections will write header names as title case at | ||||||
|     /// the socket level. |     /// the socket level. | ||||||
|     /// |     /// | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user