func Init(router *httprouter.Router) { router.NotFound = http.FileServer(http.Dir(devsatic)).ServeHTTP env := os.Getenv("production") if env != "" { router.NotFound = http.FileServer(http.Dir(diststatic)).ServeHTTP } }
// LaunchWebInterface begins listening on http://$host, for enabling remote web access // Does NOT use HTTPS func LaunchWebInterface(host, staticDir string, rt *httprouter.Router) error { logger.Info("Starting web interface on http://%s", host) logger.Warning("HTTPS not in use!") // logger.Info("Web resources directory: %s", staticDir) appLoc, err := determineResourcePath(staticDir) if err != nil { return err } logger.Debug("static dir:%s", appLoc) rt.NotFound = http.FileServer(http.Dir(appLoc)) go func() { log.Panic(http.ListenAndServe(host, rt)) }() return nil }
// setupHTTP attaches all the needed handlers to provide the HTTP API. func (m *Manta) SetupHTTP(mux *httprouter.Router) { baseRoute := "/" + m.ServiceInstance.UserAccount mux.NotFound = ErrNotFound mux.MethodNotAllowed = ErrNotAllowed mux.RedirectFixedPath = true mux.RedirectTrailingSlash = true mux.HandleMethodNotAllowed = true // this particular route can't be handled by httprouter correctly due to its // handling of positional parameters but we can't just pass in ErrNotAllowed // either because it's the wrong type handleNotAllowed := func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { w.WriteHeader(http.StatusMethodNotAllowed) w.Header().Set("Content-Type", "text/plain; charset=UTF-8") w.Write([]byte("Method is not allowed")) } mux.POST(baseRoute+"/stor", handleNotAllowed) // storage APIs // PutSnapLink and PutMetaData have the same route spec as other routes // in this group, which isn't permitted by httprouter. We pick up the // correct path in the handler mux.PUT(baseRoute+"/stor/:dir", m.handler((*Manta).handleStorage)) // PutDirectory mux.GET(baseRoute+"/stor/:dir", m.handler((*Manta).handleStorage)) // ListDirectory mux.DELETE(baseRoute+"/stor/:dir", m.handler((*Manta).handleStorage)) // DeleteDirectory mux.PUT(baseRoute+"/stor/:dir/:obj", m.handler((*Manta).handleStorage)) // PutObject mux.GET(baseRoute+"/stor/:dir/:obj", m.handler((*Manta).handleStorage)) // GetObject mux.DELETE(baseRoute+"/stor/:dir/:obj", m.handler((*Manta).handleStorage)) // DeleteObject // job APIs mux.POST(baseRoute+"/jobs", m.handler((*Manta).handleJobs)) // CreateJob mux.POST(baseRoute+"/jobs/:id/live/in", m.handler((*Manta).handleJobs)) // AddJobInputs mux.POST(baseRoute+"/jobs/:id/live/in/end", m.handler((*Manta).handleJobs)) // EndJobInput mux.POST(baseRoute+"/jobs/:id/live/cancel", m.handler((*Manta).handleJobs)) // CancelJob mux.GET(baseRoute+"/jobs", m.handler((*Manta).handleJobs)) // ListJobs mux.GET(baseRoute+"/jobs/:id/live/status", m.handler((*Manta).handleJobs)) // GetJob mux.GET(baseRoute+"/jobs/:id/live/out", m.handler((*Manta).handleJobs)) // GetJobOutput mux.GET(baseRoute+"/jobs/:id/live/in", m.handler((*Manta).handleJobs)) // GetJobInput mux.GET(baseRoute+"/jobs/:id/live/fail", m.handler((*Manta).handleJobs)) // GetJobFailures mux.GET(baseRoute+"/jobs/:id/live/err", m.handler((*Manta).handleJobs)) // GetJobErrors }
// SetupHTTP attaches all the needed handlers to provide the HTTP API. func (c *CloudAPI) SetupHTTP(mux *httprouter.Router) { baseRoute := "/" + c.ServiceInstance.UserAccount mux.NotFound = NotFound{} mux.MethodNotAllowed = MethodNotAllowed{} // keys keysRoute := baseRoute + "/keys" mux.GET(keysRoute, c.handler((*CloudAPI).handleListKeys)) mux.POST(keysRoute, c.handler((*CloudAPI).handleCreateKey)) // key keyRoute := keysRoute + "/:id" mux.GET(keyRoute, c.handler((*CloudAPI).handleGetKey)) mux.DELETE(keyRoute, c.handler((*CloudAPI).handleDeleteKey)) // images imagesRoute := baseRoute + "/images" mux.GET(imagesRoute, c.handler((*CloudAPI).handleListImages)) // image imageRoute := imagesRoute + "/:id" mux.GET(imageRoute, c.handler((*CloudAPI).handleGetImage)) mux.POST(imageRoute, c.handler((*CloudAPI).handleCreateImageFromMachine)) mux.DELETE(imageRoute, c.handler((*CloudAPI).handleDeleteImage)) // packages packagesRoute := baseRoute + "/packages" mux.GET(packagesRoute, c.handler((*CloudAPI).handleListPackages)) // package packageRoute := packagesRoute + "/:id" mux.GET(packageRoute, c.handler((*CloudAPI).handleGetPackage)) // machines machinesRoute := baseRoute + "/machines" mux.GET(machinesRoute, c.handler((*CloudAPI).handleListMachines)) mux.HEAD(machinesRoute, c.handler((*CloudAPI).handleCountMachines)) mux.POST(machinesRoute, c.handler((*CloudAPI).handleCreateMachine)) // machine machineRoute := machinesRoute + "/:id" mux.GET(machineRoute, c.handler((*CloudAPI).handleGetMachine)) mux.POST(machineRoute, c.handler((*CloudAPI).handleUpdateMachine)) mux.DELETE(machineRoute, c.handler((*CloudAPI).handleDeleteMachine)) // machine metadata machineMetadataRoute := machineRoute + "/metadata" mux.GET(machineMetadataRoute, c.handler((*CloudAPI).handleGetMachineMetadata)) mux.POST(machineMetadataRoute, c.handler((*CloudAPI).handleUpdateMachineMetadata)) mux.DELETE(machineMetadataRoute, c.handler((*CloudAPI).handleDeleteAllMachineMetadata)) // machine metadata (individual key) machineMetadataKeyRoute := machineMetadataRoute + "/:key" mux.DELETE(machineMetadataKeyRoute, c.handler((*CloudAPI).handleDeleteMachineMetadata)) // machine tags machineTagsRoute := machineRoute + "/tags" mux.GET(machineTagsRoute, c.handler((*CloudAPI).handleListMachineTags)) mux.POST(machineTagsRoute, c.handler((*CloudAPI).handleAddMachineTags)) mux.PUT(machineTagsRoute, c.handler((*CloudAPI).handleReplaceMachineTags)) mux.DELETE(machineTagsRoute, c.handler((*CloudAPI).handleDeleteMachineTags)) // machine tag machineTagRoute := machineTagsRoute + "/:tag" mux.GET(machineTagRoute, c.handler((*CloudAPI).handleGetMachineTag)) mux.DELETE(machineTagRoute, c.handler((*CloudAPI).handleDeleteMachineTag)) // machine firewall rules machineFWRulesRoute := machineRoute + "/fwrules" mux.GET(machineFWRulesRoute, c.handler((*CloudAPI).handleMachineFirewallRules)) // machine NICs machineNICsRoute := machineRoute + "/nics" mux.GET(machineNICsRoute, c.handler((*CloudAPI).handleListNICs)) mux.POST(machineNICsRoute, c.handler((*CloudAPI).handleAddNIC)) // machine NIC machineNICRoute := machineNICsRoute + "/:mac" mux.GET(machineNICRoute, c.handler((*CloudAPI).handleGetNIC)) mux.DELETE(machineNICRoute, c.handler((*CloudAPI).handleRemoveNIC)) // firewall rules firewallRulesRoute := baseRoute + "/fwrules" mux.GET(firewallRulesRoute, c.handler((*CloudAPI).handleListFirewallRules)) mux.POST(firewallRulesRoute, c.handler((*CloudAPI).handleCreateFirewallRule)) // firewall rule firewallRuleRoute := firewallRulesRoute + "/:id" mux.GET(firewallRuleRoute, c.handler((*CloudAPI).handleGetFirewallRule)) mux.POST(firewallRuleRoute, c.handler((*CloudAPI).handleUpdateFirewallRule)) mux.DELETE(firewallRuleRoute, c.handler((*CloudAPI).handleDeleteFirewallRule)) mux.POST(firewallRuleRoute+"/enable", c.handler((*CloudAPI).handleEnableFirewallRule)) mux.POST(firewallRuleRoute+"/disable", c.handler((*CloudAPI).handleDisableFirewallRule)) // networks networksRoute := baseRoute + "/networks" mux.GET(networksRoute, c.handler((*CloudAPI).handleListNetworks)) // network networkRoute := networksRoute + "/:id" mux.GET(networkRoute, c.handler((*CloudAPI).handleGetNetwork)) // fabric VLANs fabricVLANsRoute := baseRoute + "/fabrics/:fabric/vlans" mux.GET(fabricVLANsRoute, c.handler((*CloudAPI).handleListFabricVLANs)) mux.POST(fabricVLANsRoute, c.handler((*CloudAPI).handleCreateFabricVLAN)) // fabric VLAN fabricVLANRoute := fabricVLANsRoute + "/:id" mux.GET(fabricVLANRoute, c.handler((*CloudAPI).handleGetFabricVLAN)) mux.PUT(fabricVLANRoute, c.handler((*CloudAPI).handleUpdateFabricVLAN)) mux.DELETE(fabricVLANRoute, c.handler((*CloudAPI).handleDeleteFabricVLAN)) // fabric VLAN networks fabricVLANNetworksRoute := fabricVLANRoute + "/networks" mux.GET(fabricVLANNetworksRoute, c.handler((*CloudAPI).handleListFabricNetworks)) mux.POST(fabricVLANNetworksRoute, c.handler((*CloudAPI).handleCreateFabricNetwork)) // fabric VLAN network fabricVLANNetworkRoute := fabricVLANNetworksRoute + "/:network" mux.GET(fabricVLANNetworkRoute, c.handler((*CloudAPI).handleGetFabricNetwork)) mux.DELETE(fabricVLANNetworkRoute, c.handler((*CloudAPI).handleDeleteFabricNetwork)) // services servicesRoute := baseRoute + "/services" mux.GET(servicesRoute, c.handler((*CloudAPI).handleGetServices)) }
func setupNotFoundRoute(router *httprouter.Router) { router.NotFound = http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { http.Redirect(rw, r, "/login", http.StatusTemporaryRedirect) }) }