@@ -10,6 +10,9 @@ use std::borrow::Cow;
10
10
use std:: convert:: Into ;
11
11
pub use url:: { ParseError , Url } ;
12
12
13
+ const DEFAULT_MAX_DATAFRAME_SIZE : usize =1024 * 1024 * 100 ;
14
+ const DEFAULT_MAX_MESSAGE_SIZE : usize =1024 * 1024 * 200 ;
15
+
13
16
#[ cfg( any( feature ="sync" , feature ="async" ) ) ]
14
17
mod common_imports{
15
18
pub use crate :: header:: WebSocketAccept ;
@@ -114,6 +117,8 @@ pub struct ClientBuilder<'u> {
114
117
headers : Headers ,
115
118
version_set : bool ,
116
119
key_set : bool ,
120
+ max_dataframe_size : usize ,
121
+ max_message_size : usize ,
117
122
}
118
123
119
124
impl < ' u > ClientBuilder < ' u > {
@@ -161,6 +166,8 @@ impl<'u> ClientBuilder<'u> {
161
166
version_set : false ,
162
167
key_set : false ,
163
168
headers : Headers :: new ( ) ,
169
+ max_dataframe_size : DEFAULT_MAX_DATAFRAME_SIZE ,
170
+ max_message_size : DEFAULT_MAX_MESSAGE_SIZE ,
164
171
}
165
172
}
166
173
@@ -289,6 +296,21 @@ impl<'u> ClientBuilder<'u> {
289
296
self
290
297
}
291
298
299
+ /// Set maximum dataframe size. Client will abort connection with error if it is exceed.
300
+ /// Values larger than `u32::MAX` are not supported.
301
+ pub fn max_dataframe_size ( mut self , value : usize ) ->Self {
302
+ self . max_dataframe_size = value;
303
+ self
304
+ }
305
+
306
+ /// Set maximum message size for which no more continuation dataframes are accepted.
307
+ /// Client will abort connection with error if it is exceed.
308
+ /// Values larger than `u32::MAX` are not supported.
309
+ pub fn max_message_size ( mut self , value : usize ) ->Self {
310
+ self . max_message_size = value;
311
+ self
312
+ }
313
+
292
314
/// Add a custom `Sec-WebSocket-Key` header.
293
315
/// Use this only if you know what you're doing, and this almost
294
316
/// never has to be used.
@@ -493,7 +515,7 @@ impl<'u> ClientBuilder<'u> {
493
515
// validate
494
516
self . validate ( & response) ?;
495
517
496
- Ok ( Client :: unchecked ( reader, response. headers , true , false ) )
518
+ Ok ( Client :: unchecked_with_limits ( reader, response. headers , true , false , self . max_dataframe_size , self . max_dataframe_size ) )
497
519
}
498
520
499
521
/// Connect to a websocket server asynchronously.
@@ -553,6 +575,8 @@ impl<'u> ClientBuilder<'u> {
553
575
headers : self . headers ,
554
576
version_set : self . version_set ,
555
577
key_set : self . key_set ,
578
+ max_dataframe_size : self . max_dataframe_size ,
579
+ max_message_size : self . max_message_size ,
556
580
} ;
557
581
558
582
// check if we should connect over ssl or not
@@ -637,6 +661,8 @@ impl<'u> ClientBuilder<'u> {
637
661
headers : self . headers ,
638
662
version_set : self . version_set ,
639
663
key_set : self . key_set ,
664
+ max_dataframe_size : self . max_dataframe_size ,
665
+ max_message_size : self . max_message_size ,
640
666
} ;
641
667
642
668
// put it all together
@@ -687,6 +713,8 @@ impl<'u> ClientBuilder<'u> {
687
713
headers : self . headers ,
688
714
version_set : self . version_set ,
689
715
key_set : self . key_set ,
716
+ max_dataframe_size : self . max_dataframe_size ,
717
+ max_message_size : self . max_message_size ,
690
718
} ;
691
719
692
720
let future = tcp_stream. and_then ( move |stream| builder. async_connect_on ( stream) ) ;
@@ -746,6 +774,8 @@ impl<'u> ClientBuilder<'u> {
746
774
headers : self . headers ,
747
775
version_set : self . version_set ,
748
776
key_set : self . key_set ,
777
+ max_dataframe_size : self . max_dataframe_size ,
778
+ max_message_size : self . max_message_size ,
749
779
} ;
750
780
let resource = builder. build_request ( ) ;
751
781
let framed =crate :: codec:: http:: HttpClientCodec . framed ( stream) ;
@@ -755,6 +785,8 @@ impl<'u> ClientBuilder<'u> {
755
785
subject : ( Method :: Get , RequestUri :: AbsolutePath ( resource) ) ,
756
786
} ;
757
787
788
+ let max_dataframe_size =self . max_dataframe_size ;
789
+ let max_message_size =self . max_message_size ;
758
790
let future = framed
759
791
// send request
760
792
. send ( request)
@@ -770,8 +802,8 @@ impl<'u> ClientBuilder<'u> {
770
802
. and_then ( |message| builder. validate ( & message) . map ( |( ) |( message, stream) ) )
771
803
} )
772
804
// output the final client and metadata
773
- . map ( |( message, stream) |{
774
- let codec =MessageCodec :: default ( Context :: Client ) ;
805
+ . map ( move |( message, stream) |{
806
+ let codec =MessageCodec :: new_with_limits ( Context :: Client , max_dataframe_size , max_message_size ) ;
775
807
let client =update_framed_codec ( stream, codec) ;
776
808
( client, message. headers )
777
809
} ) ;