This is done to ensure we have a clean way to add new routers such as - diskRouter - configRouter - lockRoutermaster
parent
1502e2f29f
commit
aa8c9bad54
@ -0,0 +1,90 @@ |
|||||||
|
/* |
||||||
|
* Minio Cloud Storage, (C) 2016 Minio, Inc. |
||||||
|
* |
||||||
|
* 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. |
||||||
|
*/ |
||||||
|
|
||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
router "github.com/gorilla/mux" |
||||||
|
"github.com/minio/minio/pkg/fs" |
||||||
|
) |
||||||
|
|
||||||
|
// storageAPI container for S3 compatible API.
|
||||||
|
type storageAPI struct { |
||||||
|
// Filesystem instance.
|
||||||
|
Filesystem fs.Filesystem |
||||||
|
} |
||||||
|
|
||||||
|
// registerAPIRouter - registers S3 compatible APIs.
|
||||||
|
func registerAPIRouter(mux *router.Router, api storageAPI) { |
||||||
|
// API Router
|
||||||
|
apiRouter := mux.NewRoute().PathPrefix("/").Subrouter() |
||||||
|
|
||||||
|
// Bucket router
|
||||||
|
bucket := apiRouter.PathPrefix("/{bucket}").Subrouter() |
||||||
|
|
||||||
|
/// Object operations
|
||||||
|
|
||||||
|
// HeadObject
|
||||||
|
bucket.Methods("HEAD").Path("/{object:.+}").HandlerFunc(api.HeadObjectHandler) |
||||||
|
// PutObjectPart
|
||||||
|
bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(api.PutObjectPartHandler).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}") |
||||||
|
// ListObjectPxarts
|
||||||
|
bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(api.ListObjectPartsHandler).Queries("uploadId", "{uploadId:.*}") |
||||||
|
// CompleteMultipartUpload
|
||||||
|
bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(api.CompleteMultipartUploadHandler).Queries("uploadId", "{uploadId:.*}") |
||||||
|
// NewMultipartUpload
|
||||||
|
bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(api.NewMultipartUploadHandler).Queries("uploads", "") |
||||||
|
// AbortMultipartUpload
|
||||||
|
bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(api.AbortMultipartUploadHandler).Queries("uploadId", "{uploadId:.*}") |
||||||
|
// GetObject
|
||||||
|
bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(api.GetObjectHandler) |
||||||
|
// CopyObject
|
||||||
|
bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/).*?").HandlerFunc(api.CopyObjectHandler) |
||||||
|
// PutObject
|
||||||
|
bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(api.PutObjectHandler) |
||||||
|
// DeleteObject
|
||||||
|
bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(api.DeleteObjectHandler) |
||||||
|
|
||||||
|
/// Bucket operations
|
||||||
|
|
||||||
|
// GetBucketLocation
|
||||||
|
bucket.Methods("GET").HandlerFunc(api.GetBucketLocationHandler).Queries("location", "") |
||||||
|
// GetBucketPolicy
|
||||||
|
bucket.Methods("GET").HandlerFunc(api.GetBucketPolicyHandler).Queries("policy", "") |
||||||
|
// ListMultipartUploads
|
||||||
|
bucket.Methods("GET").HandlerFunc(api.ListMultipartUploadsHandler).Queries("uploads", "") |
||||||
|
// ListObjects
|
||||||
|
bucket.Methods("GET").HandlerFunc(api.ListObjectsHandler) |
||||||
|
// PutBucketPolicy
|
||||||
|
bucket.Methods("PUT").HandlerFunc(api.PutBucketPolicyHandler).Queries("policy", "") |
||||||
|
// PutBucket
|
||||||
|
bucket.Methods("PUT").HandlerFunc(api.PutBucketHandler) |
||||||
|
// HeadBucket
|
||||||
|
bucket.Methods("HEAD").HandlerFunc(api.HeadBucketHandler) |
||||||
|
// PostPolicy
|
||||||
|
bucket.Methods("POST").HeadersRegexp("Content-Type", "multipart/form-data*").HandlerFunc(api.PostPolicyBucketHandler) |
||||||
|
// DeleteMultipleObjects
|
||||||
|
bucket.Methods("POST").HandlerFunc(api.DeleteMultipleObjectsHandler) |
||||||
|
// DeleteBucketPolicy
|
||||||
|
bucket.Methods("DELETE").HandlerFunc(api.DeleteBucketPolicyHandler).Queries("policy", "") |
||||||
|
// DeleteBucket
|
||||||
|
bucket.Methods("DELETE").HandlerFunc(api.DeleteBucketHandler) |
||||||
|
|
||||||
|
/// Root operation
|
||||||
|
|
||||||
|
// ListBuckets
|
||||||
|
apiRouter.Methods("GET").HandlerFunc(api.ListBucketsHandler) |
||||||
|
} |
@ -0,0 +1,95 @@ |
|||||||
|
/* |
||||||
|
* Minio Cloud Storage, (C) 2016 Minio, Inc. |
||||||
|
* |
||||||
|
* 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. |
||||||
|
*/ |
||||||
|
|
||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"net/http" |
||||||
|
|
||||||
|
"github.com/elazarl/go-bindata-assetfs" |
||||||
|
"github.com/gorilla/handlers" |
||||||
|
router "github.com/gorilla/mux" |
||||||
|
jsonrpc "github.com/gorilla/rpc/v2" |
||||||
|
"github.com/gorilla/rpc/v2/json2" |
||||||
|
"github.com/minio/minio-go" |
||||||
|
"github.com/minio/miniobrowser" |
||||||
|
) |
||||||
|
|
||||||
|
// webAPI container for Web API.
|
||||||
|
type webAPI struct { |
||||||
|
// FSPath filesystem path.
|
||||||
|
FSPath string |
||||||
|
// Minio client instance.
|
||||||
|
Client *minio.Client |
||||||
|
|
||||||
|
// private params.
|
||||||
|
apiAddress string // api destination address.
|
||||||
|
// credential kept to be used internally.
|
||||||
|
accessKeyID string |
||||||
|
secretAccessKey string |
||||||
|
} |
||||||
|
|
||||||
|
// indexHandler - Handler to serve index.html
|
||||||
|
type indexHandler struct { |
||||||
|
handler http.Handler |
||||||
|
} |
||||||
|
|
||||||
|
func (h indexHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { |
||||||
|
r.URL.Path = reservedBucket + "/" |
||||||
|
h.handler.ServeHTTP(w, r) |
||||||
|
} |
||||||
|
|
||||||
|
const assetPrefix = "production" |
||||||
|
|
||||||
|
func assetFS() *assetfs.AssetFS { |
||||||
|
return &assetfs.AssetFS{ |
||||||
|
Asset: miniobrowser.Asset, |
||||||
|
AssetDir: miniobrowser.AssetDir, |
||||||
|
AssetInfo: miniobrowser.AssetInfo, |
||||||
|
Prefix: assetPrefix, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// specialAssets are files which are unique files not embedded inside index_bundle.js.
|
||||||
|
const specialAssets = "loader.css|logo.svg|firefox.png|safari.png|chrome.png|favicon.ico" |
||||||
|
|
||||||
|
// registerWebRouter - registers web router for serving minio browser.
|
||||||
|
func registerWebRouter(mux *router.Router, web *webAPI) { |
||||||
|
// Initialize a new json2 codec.
|
||||||
|
codec := json2.NewCodec() |
||||||
|
|
||||||
|
// Minio rpc router
|
||||||
|
webBrowserRouter := mux.NewRoute().PathPrefix(reservedBucket).Subrouter() |
||||||
|
|
||||||
|
// Initialize json rpc handlers.
|
||||||
|
webRPC := jsonrpc.NewServer() |
||||||
|
webRPC.RegisterCodec(codec, "application/json") |
||||||
|
webRPC.RegisterCodec(codec, "application/json; charset=UTF-8") |
||||||
|
webRPC.RegisterService(web, "Web") |
||||||
|
|
||||||
|
// RPC handler at URI - /minio/rpc
|
||||||
|
webBrowserRouter.Path("/rpc").Handler(webRPC) |
||||||
|
|
||||||
|
// Add compression for assets.
|
||||||
|
compressedAssets := handlers.CompressHandler(http.StripPrefix(reservedBucket, http.FileServer(assetFS()))) |
||||||
|
|
||||||
|
// Serve javascript files and favicon from assets.
|
||||||
|
webBrowserRouter.Path(fmt.Sprintf("/{assets:[^/]+.js|%s}", specialAssets)).Handler(compressedAssets) |
||||||
|
|
||||||
|
// Serve index.html for rest of the requests.
|
||||||
|
webBrowserRouter.Path("/{index:.*}").Handler(indexHandler{http.StripPrefix(reservedBucket, http.FileServer(assetFS()))}) |
||||||
|
} |
Loading…
Reference in new issue