| 
									
										
										
										
											2015-07-01 11:15:48 +08:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2019-04-10 02:39:42 +08:00
										 |  |  |  * MinIO Cloud Storage, (C) 2015, 2016 MinIO, Inc. | 
					
						
							| 
									
										
										
										
											2015-07-01 11:15:48 +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 | 
					
						
							| 
									
										
										
										
											2015-07-01 11:15:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"net/http" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 10:23:54 +08:00
										 |  |  | 	"github.com/gorilla/mux" | 
					
						
							| 
									
										
										
										
											2015-07-01 11:15:48 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | // Composed function registering routers for only distributed Erasure setup.
 | 
					
						
							|  |  |  | func registerDistErasureRouters(router *mux.Router, endpointZones EndpointZones) { | 
					
						
							| 
									
										
										
										
											2019-11-23 04:45:13 +08:00
										 |  |  | 	// Register storage REST router only if its a distributed setup.
 | 
					
						
							| 
									
										
										
										
											2019-11-20 09:42:27 +08:00
										 |  |  | 	registerStorageRESTHandlers(router, endpointZones) | 
					
						
							| 
									
										
										
										
											2016-12-10 16:42:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	// Register peer REST router only if its a distributed setup.
 | 
					
						
							|  |  |  | 	registerPeerRESTHandlers(router) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-23 04:45:13 +08:00
										 |  |  | 	// Register bootstrap REST router for distributed setups.
 | 
					
						
							|  |  |  | 	registerBootstrapRESTHandlers(router) | 
					
						
							| 
									
										
										
										
											2016-12-10 16:42:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-23 04:45:13 +08:00
										 |  |  | 	// Register distributed namespace lock routers.
 | 
					
						
							|  |  |  | 	registerLockRESTHandlers(router, endpointZones) | 
					
						
							| 
									
										
										
										
											2016-12-10 16:42:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-05 10:07:54 +08:00
										 |  |  | // List of some generic handlers which are applied for all incoming requests.
 | 
					
						
							| 
									
										
										
										
											2020-06-11 23:19:55 +08:00
										 |  |  | var globalHandlers = []MiddlewareFunc{ | 
					
						
							| 
									
										
										
										
											2019-07-02 03:22:01 +08:00
										 |  |  | 	// set x-amz-request-id header.
 | 
					
						
							| 
									
										
										
										
											2018-11-20 06:47:03 +08:00
										 |  |  | 	addCustomHeaders, | 
					
						
							| 
									
										
										
										
											2018-04-13 06:57:41 +08:00
										 |  |  | 	// set HTTP security headers such as Content-Security-Policy.
 | 
					
						
							|  |  |  | 	addSecurityHeaders, | 
					
						
							| 
									
										
										
										
											2018-04-05 23:18:42 +08:00
										 |  |  | 	// Forward path style requests to actual host in a bucket federated setup.
 | 
					
						
							| 
									
										
										
										
											2018-02-03 10:18:52 +08:00
										 |  |  | 	setBucketForwardingHandler, | 
					
						
							| 
									
										
										
										
											2019-02-20 13:02:41 +08:00
										 |  |  | 	// Validate all the incoming requests.
 | 
					
						
							|  |  |  | 	setRequestValidityHandler, | 
					
						
							| 
									
										
										
										
											2018-04-05 10:07:54 +08:00
										 |  |  | 	// Network statistics
 | 
					
						
							|  |  |  | 	setHTTPStatsHandler, | 
					
						
							|  |  |  | 	// Limits all requests size to a maximum fixed limit
 | 
					
						
							|  |  |  | 	setRequestSizeLimitHandler, | 
					
						
							|  |  |  | 	// Limits all header sizes to a maximum fixed limit
 | 
					
						
							|  |  |  | 	setRequestHeaderSizeLimitHandler, | 
					
						
							|  |  |  | 	// Adds 'crossdomain.xml' policy handler to serve legacy flash clients.
 | 
					
						
							|  |  |  | 	setCrossDomainPolicy, | 
					
						
							|  |  |  | 	// Redirect some pre-defined browser request paths to a static location prefix.
 | 
					
						
							|  |  |  | 	setBrowserRedirectHandler, | 
					
						
							|  |  |  | 	// Validates if incoming request is for restricted buckets.
 | 
					
						
							|  |  |  | 	setReservedBucketHandler, | 
					
						
							|  |  |  | 	// Adds cache control for all browser requests.
 | 
					
						
							|  |  |  | 	setBrowserCacheControlHandler, | 
					
						
							|  |  |  | 	// Validates all incoming requests to have a valid date header.
 | 
					
						
							|  |  |  | 	setTimeValidityHandler, | 
					
						
							|  |  |  | 	// CORS setting for all browser API requests.
 | 
					
						
							|  |  |  | 	setCorsHandler, | 
					
						
							|  |  |  | 	// Validates all incoming URL resources, for invalid/unsupported
 | 
					
						
							|  |  |  | 	// resources client receives a HTTP error.
 | 
					
						
							|  |  |  | 	setIgnoreResourcesHandler, | 
					
						
							|  |  |  | 	// Auth handler verifies incoming authorization headers and
 | 
					
						
							|  |  |  | 	// routes them accordingly. Client receives a HTTP error for
 | 
					
						
							|  |  |  | 	// invalid/unsupported signatures.
 | 
					
						
							|  |  |  | 	setAuthHandler, | 
					
						
							| 
									
										
										
										
											2018-10-17 10:22:09 +08:00
										 |  |  | 	// Enforce rules specific for TLS requests
 | 
					
						
							|  |  |  | 	setSSETLSHandler, | 
					
						
							| 
									
										
										
										
											2018-04-05 10:07:54 +08:00
										 |  |  | 	// filters HTTP headers which are treated as metadata and are reserved
 | 
					
						
							|  |  |  | 	// for internal use only.
 | 
					
						
							|  |  |  | 	filterReservedMetadata, | 
					
						
							|  |  |  | 	// Add new handlers here.
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												routers: Fix a crash while initializing network fs. (#1382)
Crash happens when 'minio server filename' a file name is
provided instead of a directory on command line argument.
```
panic: runtime error: slice bounds out of range
goroutine 1 [running]:
panic(0x5eb460, 0xc82000e0b0)
	/usr/local/opt/go/libexec/src/runtime/panic.go:464 +0x3e6
main.splitNetPath(0x7fff5fbff9bd, 0x7, 0x0, 0x0, 0x0, 0x0)
	/Users/harsha/mygo/src/github.com/minio/minio/network-fs.go:49 +0xb7
main.newNetworkFS(0x7fff5fbff9bd, 0x7, 0x0, 0x0, 0x0, 0x0)
	/Users/harsha/mygo/src/github.com/minio/minio/network-fs.go:90 +0x20a
main.configureServerHandler(0xc82024e1c8, 0x5, 0xc8200640e0, 0x1, 0x1, 0x0, 0x0)
	/Users/harsha/mygo/src/github.com/minio/minio/routers.go:43 +0x6ce
main.configureServer(0xc82024e1c8, 0x5, 0xc8200640e0, 0x1, 0x1, 0x5)
	/Users/harsha/mygo/src/github.com/minio/minio/server-main.go:86 +0x67
```
											
										 
											2016-04-26 09:10:40 +08:00
										 |  |  | // configureServer handler returns final handler for the http server.
 | 
					
						
							| 
									
										
										
										
											2020-05-25 15:17:52 +08:00
										 |  |  | func configureServerHandler(endpointZones EndpointZones) (http.Handler, error) { | 
					
						
							| 
									
										
										
										
											2016-11-17 08:23:22 +08:00
										 |  |  | 	// Initialize router. `SkipClean(true)` stops gorilla/mux from
 | 
					
						
							|  |  |  | 	// normalizing URL path minio/minio#3256
 | 
					
						
							| 
									
										
										
										
											2020-02-12 11:38:02 +08:00
										 |  |  | 	router := mux.NewRouter().SkipClean(true).UseEncodedPath() | 
					
						
							| 
									
										
										
										
											2016-03-28 03:37:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 05:50:50 +08:00
										 |  |  | 	// Initialize distributed NS lock.
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 	if globalIsDistErasure { | 
					
						
							|  |  |  | 		registerDistErasureRouters(router, endpointZones) | 
					
						
							| 
									
										
										
										
											2016-12-10 16:42:22 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-06 17:30:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-05 05:48:12 +08:00
										 |  |  | 	// Add STS router always.
 | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | 	registerSTSRouter(router) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 05:03:26 +08:00
										 |  |  | 	// Add Admin router, all APIs are enabled in server mode.
 | 
					
						
							| 
									
										
										
										
											2020-05-25 15:17:52 +08:00
										 |  |  | 	registerAdminRouter(router, true, true) | 
					
						
							| 
									
										
										
										
											2018-01-23 06:54:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-12 14:16:53 +08:00
										 |  |  | 	// Add healthcheck router
 | 
					
						
							| 
									
										
										
										
											2018-04-22 10:23:54 +08:00
										 |  |  | 	registerHealthCheckRouter(router) | 
					
						
							| 
									
										
										
										
											2018-03-12 14:16:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-19 07:01:42 +08:00
										 |  |  | 	// Add server metrics router
 | 
					
						
							| 
									
										
										
										
											2018-04-22 10:23:54 +08:00
										 |  |  | 	registerMetricsRouter(router) | 
					
						
							| 
									
										
										
										
											2018-04-19 07:01:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-10 16:42:22 +08:00
										 |  |  | 	// Register web router when its enabled.
 | 
					
						
							| 
									
										
										
										
											2019-10-23 13:59:13 +08:00
										 |  |  | 	if globalBrowserEnabled { | 
					
						
							| 
									
										
										
										
											2018-04-22 10:23:54 +08:00
										 |  |  | 		if err := registerWebRouter(router); err != nil { | 
					
						
							| 
									
										
										
										
											2016-10-13 14:13:24 +08:00
										 |  |  | 			return nil, err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-28 19:00:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-20 08:37:08 +08:00
										 |  |  | 	// Add API router, additionally all server mode support encryption
 | 
					
						
							|  |  |  | 	// but don't allow SSE-KMS.
 | 
					
						
							|  |  |  | 	registerAPIRouter(router, true, false) | 
					
						
							| 
									
										
										
										
											2016-03-28 03:37:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-23 04:45:13 +08:00
										 |  |  | 	// If none of the routes match add default error handler routes
 | 
					
						
							|  |  |  | 	router.NotFoundHandler = http.HandlerFunc(httpTraceAll(errorResponseHandler)) | 
					
						
							|  |  |  | 	router.MethodNotAllowedHandler = http.HandlerFunc(httpTraceAll(errorResponseHandler)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-11 23:19:55 +08:00
										 |  |  | 	router.Use(registerMiddlewares) | 
					
						
							|  |  |  | 	return router, nil | 
					
						
							| 
									
										
										
										
											2015-07-01 11:15:48 +08:00
										 |  |  | } |