| 
									
										
										
										
											2016-07-07 03:50:24 +08:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2019-04-10 02:39:42 +08:00
										 |  |  |  * MinIO Cloud Storage, (C) 2016 MinIO, Inc. | 
					
						
							| 
									
										
										
										
											2016-07-07 03:50:24 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  | package cmd | 
					
						
							| 
									
										
										
										
											2016-07-07 03:50:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | import ( | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2016-07-07 03:50:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | func TestHTTPRequestRangeSpec(t *testing.T) { | 
					
						
							|  |  |  | 	resourceSize := int64(10) | 
					
						
							|  |  |  | 	validRangeSpecs := []struct { | 
					
						
							|  |  |  | 		spec                 string | 
					
						
							|  |  |  | 		expOffset, expLength int64 | 
					
						
							| 
									
										
										
										
											2016-07-07 03:50:24 +08:00
										 |  |  | 	}{ | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 		{"bytes=0-", 0, 10}, | 
					
						
							|  |  |  | 		{"bytes=1-", 1, 9}, | 
					
						
							|  |  |  | 		{"bytes=0-9", 0, 10}, | 
					
						
							|  |  |  | 		{"bytes=1-10", 1, 9}, | 
					
						
							|  |  |  | 		{"bytes=1-1", 1, 1}, | 
					
						
							|  |  |  | 		{"bytes=2-5", 2, 4}, | 
					
						
							|  |  |  | 		{"bytes=-5", 5, 5}, | 
					
						
							|  |  |  | 		{"bytes=-1", 9, 1}, | 
					
						
							|  |  |  | 		{"bytes=-1000", 0, 10}, | 
					
						
							| 
									
										
										
										
											2016-07-07 03:50:24 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 	for i, testCase := range validRangeSpecs { | 
					
						
							|  |  |  | 		rs, err := parseRequestRangeSpec(testCase.spec) | 
					
						
							| 
									
										
										
										
											2016-07-07 03:50:24 +08:00
										 |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 			t.Errorf("unexpected err: %v", err) | 
					
						
							| 
									
										
										
										
											2016-07-07 03:50:24 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 		o, l, err := rs.GetOffsetLength(resourceSize) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			t.Errorf("unexpected err: %v", err) | 
					
						
							| 
									
										
										
										
											2016-07-07 03:50:24 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 		if o != testCase.expOffset || l != testCase.expLength { | 
					
						
							|  |  |  | 			t.Errorf("Case %d: got bad offset/length: %d,%d expected: %d,%d", | 
					
						
							|  |  |  | 				i, o, l, testCase.expOffset, testCase.expLength) | 
					
						
							| 
									
										
										
										
											2016-07-07 03:50:24 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 	unparsableRangeSpecs := []string{ | 
					
						
							| 
									
										
										
										
											2016-07-08 06:05:18 +08:00
										 |  |  | 		"bytes=-", | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 		"bytes==", | 
					
						
							|  |  |  | 		"bytes==1-10", | 
					
						
							|  |  |  | 		"bytes=", | 
					
						
							|  |  |  | 		"bytes=aa", | 
					
						
							|  |  |  | 		"aa", | 
					
						
							| 
									
										
										
										
											2016-07-08 06:05:18 +08:00
										 |  |  | 		"", | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 		"bytes=1-10-", | 
					
						
							|  |  |  | 		"bytes=1--10", | 
					
						
							|  |  |  | 		"bytes=-1-10", | 
					
						
							|  |  |  | 		"bytes=0-+3", | 
					
						
							|  |  |  | 		"bytes=+3-+5", | 
					
						
							| 
									
										
										
										
											2019-04-10 02:39:42 +08:00
										 |  |  | 		"bytes=10-11,12-10", // Unsupported by S3/MinIO (valid in RFC)
 | 
					
						
							| 
									
										
										
										
											2016-07-08 06:05:18 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 	for i, urs := range unparsableRangeSpecs { | 
					
						
							|  |  |  | 		rs, err := parseRequestRangeSpec(urs) | 
					
						
							|  |  |  | 		if err == nil { | 
					
						
							|  |  |  | 			t.Errorf("Case %d: Did not get an expected error - got %v", i, rs) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if err == errInvalidRange { | 
					
						
							|  |  |  | 			t.Errorf("Case %d: Got invalid range error instead of a parse error", i) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if rs != nil { | 
					
						
							|  |  |  | 			t.Errorf("Case %d: Got non-nil rs though err != nil: %v", i, rs) | 
					
						
							| 
									
										
										
										
											2016-07-07 03:50:24 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 	invalidRangeSpecs := []string{ | 
					
						
							|  |  |  | 		"bytes=5-3", | 
					
						
							| 
									
										
										
										
											2016-07-08 06:05:18 +08:00
										 |  |  | 		"bytes=10-10", | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 		"bytes=10-", | 
					
						
							|  |  |  | 		"bytes=100-", | 
					
						
							| 
									
										
										
										
											2016-07-08 06:05:18 +08:00
										 |  |  | 		"bytes=-0", | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 	for i, irs := range invalidRangeSpecs { | 
					
						
							|  |  |  | 		var err1, err2 error | 
					
						
							|  |  |  | 		var rs *HTTPRangeSpec | 
					
						
							|  |  |  | 		var o, l int64 | 
					
						
							|  |  |  | 		rs, err1 = parseRequestRangeSpec(irs) | 
					
						
							|  |  |  | 		if err1 == nil { | 
					
						
							|  |  |  | 			o, l, err2 = rs.GetOffsetLength(resourceSize) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if err1 == errInvalidRange || (err1 == nil && err2 == errInvalidRange) { | 
					
						
							|  |  |  | 			continue | 
					
						
							| 
									
										
										
										
											2016-07-08 06:05:18 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-09-21 10:22:09 +08:00
										 |  |  | 		t.Errorf("Case %d: Expected errInvalidRange but: %v %v %d %d %v", i, rs, err1, o, l, err2) | 
					
						
							| 
									
										
										
										
											2016-07-07 03:50:24 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |