// registerWebRouter - registers web router for serving minio browser. func registerWebRouter(mux *router.Router, web *webAPIHandlers) { // Initialize a new json2 codec. codec := json2.NewCodec() // Minio browser 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/webrpc webBrowserRouter.Methods("POST").Path("/webrpc").Handler(webRPC) webBrowserRouter.Methods("PUT").Path("/upload/{bucket}/{object:.+}").HandlerFunc(web.Upload) webBrowserRouter.Methods("GET").Path("/download/{bucket}/{object:.+}").Queries("token", "{token:.*}").HandlerFunc(web.Download) // 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()))}) }
// registerCloudStorageAPI - register all the handlers to their respective paths func registerCloudStorageAPI(mux *router.Router, a CloudStorageAPI) { root := mux.NewRoute().PathPrefix("/").Subrouter() bucket := root.PathPrefix("/{bucket}").Subrouter() bucket.Methods("HEAD").Path("/{object:.+}").HandlerFunc(a.HeadObjectHandler) bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(a.PutObjectPartHandler).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}") bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(a.ListObjectPartsHandler).Queries("uploadId", "{uploadId:.*}") bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(a.CompleteMultipartUploadHandler).Queries("uploadId", "{uploadId:.*}") bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(a.NewMultipartUploadHandler).Queries("uploads", "") bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(a.AbortMultipartUploadHandler).Queries("uploadId", "{uploadId:.*}") bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(a.GetObjectHandler) bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(a.PutObjectHandler) bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(a.DeleteObjectHandler) bucket.Methods("GET").HandlerFunc(a.GetBucketACLHandler).Queries("acl", "") bucket.Methods("GET").HandlerFunc(a.ListMultipartUploadsHandler).Queries("uploads", "") bucket.Methods("GET").HandlerFunc(a.ListObjectsHandler) bucket.Methods("PUT").HandlerFunc(a.PutBucketACLHandler).Queries("acl", "") bucket.Methods("PUT").HandlerFunc(a.PutBucketHandler) bucket.Methods("HEAD").HandlerFunc(a.HeadBucketHandler) bucket.Methods("POST").HandlerFunc(a.PostPolicyBucketHandler) bucket.Methods("DELETE").HandlerFunc(a.DeleteBucketHandler) root.Methods("GET").HandlerFunc(a.ListBucketsHandler) }
// registerStorageRPCRouter - register storage rpc router. func registerStorageRPCRouter(mux *router.Router, stServer *storageServer) { storageRPCServer := rpc.NewServer() storageRPCServer.RegisterName("Storage", stServer) storageRouter := mux.NewRoute().PathPrefix(reservedBucket).Subrouter() // Add minio storage routes. storageRouter.Path("/storage").Handler(storageRPCServer) }
// Register controller RPC handlers. func registerControllerRPCRouter(mux *router.Router, ctrlHandlers *controllerAPIHandlers) { ctrlRPCServer := rpc.NewServer() ctrlRPCServer.RegisterName("Controller", ctrlHandlers) ctrlRouter := mux.NewRoute().PathPrefix(reservedBucket).Subrouter() ctrlRouter.Path(controlPath).Handler(ctrlRPCServer) }
// registerAdminRPCRouter - registers RPC methods for service status, // stop and restart commands. func registerAdminRPCRouter(mux *router.Router) error { adminRPCHandler := &serviceCmd{} adminRPCServer := rpc.NewServer() err := adminRPCServer.RegisterName("Service", adminRPCHandler) if err != nil { return traceError(err) } adminRouter := mux.NewRoute().PathPrefix(reservedBucket).Subrouter() adminRouter.Path(servicePath).Handler(adminRPCServer) return nil }
// Register RPC router func registerBrowserPeerRPCRouter(mux *router.Router) error { bpHandlers := &browserPeerAPIHandlers{} bpRPCServer := rpc.NewServer() err := bpRPCServer.RegisterName("BrowserPeer", bpHandlers) if err != nil { return traceError(err) } bpRouter := mux.NewRoute().PathPrefix(reservedBucket).Subrouter() bpRouter.Path(browserPeerPath).Handler(bpRPCServer) return nil }
// registerAdminRouter - Add handler functions for each service REST API routes. func registerAdminRouter(mux *router.Router) { adminAPI := adminAPIHandlers{} // Admin router adminRouter := mux.NewRoute().PathPrefix("/").Subrouter() /// Admin operations // Service status adminRouter.Methods("GET").Queries("service", "").Headers(minioAdminOpHeader, "status").HandlerFunc(adminAPI.ServiceStatusHandler) // Service stop adminRouter.Methods("POST").Queries("service", "").Headers(minioAdminOpHeader, "stop").HandlerFunc(adminAPI.ServiceStopHandler) // Service restart adminRouter.Methods("POST").Queries("service", "").Headers(minioAdminOpHeader, "restart").HandlerFunc(adminAPI.ServiceRestartHandler) }
func registerS3PeerRPCRouter(mux *router.Router) error { s3PeerHandlers := &s3PeerAPIHandlers{ &localBucketMetaState{ ObjectAPI: newObjectLayerFn, }, } s3PeerRPCServer := rpc.NewServer() err := s3PeerRPCServer.RegisterName("S3", s3PeerHandlers) if err != nil { return traceError(err) } s3PeerRouter := mux.NewRoute().PathPrefix(reservedBucket).Subrouter() s3PeerRouter.Path(s3Path).Handler(s3PeerRPCServer) return nil }
// registerAPIRouter - registers S3 compatible APIs. func registerAPIRouter(mux *router.Router, api objectAPIHandlers) { // 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", ".*?(\\/|%2F).*?").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", "") // GetBucketNotification bucket.Methods("GET").HandlerFunc(api.GetBucketNotificationHandler).Queries("notification", "") // ListenBucketNotification bucket.Methods("GET").HandlerFunc(api.ListenBucketNotificationHandler).Queries("notificationARN", "{notificationARN:.*}") // ListMultipartUploads bucket.Methods("GET").HandlerFunc(api.ListMultipartUploadsHandler).Queries("uploads", "") // ListObjectsV2 bucket.Methods("GET").HandlerFunc(api.ListObjectsV2Handler).Queries("list-type", "2") // ListObjectsV1 (Legacy) bucket.Methods("GET").HandlerFunc(api.ListObjectsV1Handler) // PutBucketPolicy bucket.Methods("PUT").HandlerFunc(api.PutBucketPolicyHandler).Queries("policy", "") // PutBucketNotification bucket.Methods("PUT").HandlerFunc(api.PutBucketNotificationHandler).Queries("notification", "") // 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) }
// registerPat a pattern with a handler for the given request method. func registerPat(r *mux.Router, meth, pat string, h http.Handler, middleware []func(http.Handler) http.Handler) *mux.Route { return r.NewRoute().Path(pat).Handler(use(h, middleware...)).Methods(meth) }