11pub struct ContentIterator < ' s > {
2- boundary : & ' s [ u8 ] ,
2+ boundary_data : [ u8 ; 255 ] ,
3+ boundary_len : usize ,
34 payload : & ' s [ u8 ] ,
45 pos : usize ,
56}
67
78impl < ' s > ContentIterator < ' s > {
8- pub fn new ( boundary : & ' s [ u8 ] , payload : & ' s [ u8 ] ) -> Self {
9- Self {
10- boundary,
9+ pub fn new ( boundary : & [ u8 ] , payload : & ' s [ u8 ] ) -> Self {
10+ let mut result = Self {
11+ boundary_data : [ b'-' ; 255 ] ,
12+ boundary_len : boundary. len ( ) + 2 ,
1113 payload,
1214 pos : 0 ,
13- }
15+ } ;
16+
17+ result. boundary_data [ 2 ..2 + boundary. len ( ) ] . copy_from_slice ( boundary) ;
18+
19+ result
20+ }
21+
22+ pub fn get_boundary ( & ' s self ) -> & ' s [ u8 ] {
23+ & self . boundary_data [ ..self . boundary_len ]
1424 }
1525}
1626
1727impl < ' s > Iterator for ContentIterator < ' s > {
1828 type Item = & ' s [ u8 ] ;
1929
2030 fn next ( & mut self ) -> Option < Self :: Item > {
21- self . pos += self . boundary . len ( ) ;
31+ self . pos += self . boundary_len ;
2232 self . pos = find_non_space ( self . payload , self . pos ) ?;
2333
2434 let next_pos = rust_extensions:: slice_of_u8_utils:: find_sequence_pos (
2535 self . payload ,
26- self . boundary ,
36+ self . get_boundary ( ) ,
2737 self . pos ,
2838 ) ?;
2939
@@ -52,28 +62,37 @@ mod tests {
5262
5363 #[ test]
5464 fn test_splitting ( ) {
55- let boundary = "------WebKitFormBoundaryvrDBuVcszaZRkg3v " ;
65+ let boundary = "----WebKitFormBoundaryu7oxE5T3UC2xY2Q9 " ;
5666 let payload: Vec < u8 > = vec ! [
5767 45 , 45 , 45 , 45 , 45 , 45 , 87 , 101 , 98 , 75 , 105 , 116 , 70 , 111 , 114 , 109 , 66 , 111 , 117 ,
58- 110 , 100 , 97 , 114 , 121 , 118 , 114 , 68 , 66 , 117 , 86 , 99 , 115 , 122 , 97 , 90 , 82 , 107 , 103 ,
59- 51 , 118 , 13 , 10 , // Boundary End
60- // Payload ----------------------
68+ 110 , 100 , 97 , 114 , 121 , 117 , 55 , 111 , 120 , 69 , 53 , 84 , 51 , 85 , 67 , 50 , 120 , 89 , 50 , 81 ,
69+ 57 , 13 , 10 , //End of boundary
70+ //Message-0
6171 67 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 68 , 105 , 115 , 112 , 111 , 115 , 105 , 116 , 105 , 111 ,
6272 110 , 58 , 32 , 102 , 111 , 114 , 109 , 45 , 100 , 97 , 116 , 97 , 59 , 32 , 110 , 97 , 109 , 101 , 61 ,
6373 34 , 100 , 116 , 70 , 114 , 111 , 109 , 34 , 13 , 10 , 13 , 10 , 50 , 13 , 10 ,
64- // Next Boundary
74+ //Start of boundary
6575 45 , 45 , 45 , 45 , 45 , 45 , 87 , 101 , 98 , 75 , 105 , 116 , 70 , 111 , 114 , 109 , 66 , 111 , 117 , 110 ,
66- 100 , 97 , 114 , 121 , 118 , 114 , 68 , 66 , 117 , 86 , 99 , 115 , 122 , 97 , 90 , 82 , 107 , 103 , 51 ,
67- 118 , 13 , 10 , // Boundary End
68- // Next Message
76+ 100 , 97 , 114 , 121 , 117 , 55 , 111 , 120 , 69 , 53 , 84 , 51 , 85 , 67 , 50 , 120 , 89 , 50 , 81 , 57 ,
77+ 13 , 10 , //End of boundary
78+ //Message-1
6979 67 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 68 , 105 , 115 , 112 , 111 , 115 , 105 , 116 , 105 , 111 ,
7080 110 , 58 , 32 , 102 , 111 , 114 , 109 , 45 , 100 , 97 , 116 , 97 , 59 , 32 , 110 , 97 , 109 , 101 , 61 ,
71- 34 , 100 , 116 , 70 , 114 , 111 , 109 , 79 , 112 , 116 , 34 , 13 , 10 , 13 , 10 , 51 , 13 ,
72- 10 , //Message End
73- // Next Boundary
81+ 34 , 100 , 116 , 70 , 114 , 111 , 109 , 79 , 112 , 116 , 34 , 13 , 10 , 13 , 10 , 51 , 13 , 10 ,
82+ //Start of boundary
7483 45 , 45 , 45 , 45 , 45 , 45 , 87 , 101 , 98 , 75 , 105 , 116 , 70 , 111 , 114 , 109 , 66 , 111 , 117 , 110 ,
75- 100 , 97 , 114 , 121 , 118 , 114 , 68 , 66 , 117 , 86 , 99 , 115 , 122 , 97 , 90 , 82 , 107 , 103 , 51 ,
76- 118 , 45 , 45 , 13 , 10 ,
84+ 100 , 97 , 114 , 121 , 117 , 55 , 111 , 120 , 69 , 53 , 84 , 51 , 85 , 67 , 50 , 120 , 89 , 50 , 81 , 57 ,
85+ 13 , 10 , //Message-2
86+ 67 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 68 , 105 , 115 , 112 , 111 , 115 , 105 , 116 , 105 , 111 ,
87+ 110 , 58 , 32 , 102 , 111 , 114 , 109 , 45 , 100 , 97 , 116 , 97 , 59 , 32 , 110 , 97 , 109 , 101 , 61 ,
88+ 34 , 102 , 105 , 108 , 101 , 34 , 59 , 32 , 102 , 105 , 108 , 101 , 110 , 97 , 109 , 101 , 61 , 34 , 116 ,
89+ 101 , 115 , 116 , 45 , 112 , 97 , 121 , 108 , 111 , 97 , 100 , 46 , 116 , 120 , 116 , 34 , 13 , 10 , 67 ,
90+ 111 , 110 , 116 , 101 , 110 , 116 , 45 , 84 , 121 , 112 , 101 , 58 , 32 , 116 , 101 , 120 , 116 , 47 ,
91+ 112 , 108 , 97 , 105 , 110 , 13 , 10 , 13 , 10 , 49 , 50 , 51 , 13 , 10 ,
92+ //Start of boundary
93+ 45 , 45 , 45 , 45 , 45 , 45 , 87 , 101 , 98 , 75 , 105 , 116 , 70 , 111 , 114 , 109 , 66 , 111 , 117 , 110 ,
94+ 100 , 97 , 114 , 121 , 117 , 55 , 111 , 120 , 69 , 53 , 84 , 51 , 85 , 67 , 50 , 120 , 89 , 50 , 81 , 57 ,
95+ 45 , 45 , 13 , 10 ,
7796 ] ;
7897
7998 let result: Vec < & [ u8 ] > =
@@ -91,7 +110,17 @@ mod tests {
91110 34 , 100 , 116 , 70 , 114 , 111 , 109 , 79 , 112 , 116 , 34 , 13 , 10 , 13 , 10 , 51 , 13 , 10 ,
92111 ] ;
93112
113+ let expected_payload_2: Vec < u8 > = vec ! [
114+ 67 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 68 , 105 , 115 , 112 , 111 , 115 , 105 , 116 , 105 , 111 ,
115+ 110 , 58 , 32 , 102 , 111 , 114 , 109 , 45 , 100 , 97 , 116 , 97 , 59 , 32 , 110 , 97 , 109 , 101 , 61 ,
116+ 34 , 102 , 105 , 108 , 101 , 34 , 59 , 32 , 102 , 105 , 108 , 101 , 110 , 97 , 109 , 101 , 61 , 34 , 116 ,
117+ 101 , 115 , 116 , 45 , 112 , 97 , 121 , 108 , 111 , 97 , 100 , 46 , 116 , 120 , 116 , 34 , 13 , 10 , 67 ,
118+ 111 , 110 , 116 , 101 , 110 , 116 , 45 , 84 , 121 , 112 , 101 , 58 , 32 , 116 , 101 , 120 , 116 , 47 ,
119+ 112 , 108 , 97 , 105 , 110 , 13 , 10 , 13 , 10 , 49 , 50 , 51 , 13 , 10 ,
120+ ] ;
121+
94122 assert_eq ! ( result. get( 0 ) . unwrap( ) , & expected_payload_0) ;
95123 assert_eq ! ( result. get( 1 ) . unwrap( ) , & expected_payload_1) ;
124+ assert_eq ! ( result. get( 2 ) . unwrap( ) , & expected_payload_2) ;
96125 }
97126}
0 commit comments