func (srv *Server) endpoints() []apihttp.Endpoint { httpCtxt := httpContext{ srv: srv, } endpoints := common.ResolveAPIEndpoints(srv.newHandlerArgs) // TODO(ericsnow) Add the following to the registry instead. add := func(pattern string, handler http.Handler) { // TODO: We can switch from all methods to specific ones for entries // where we only want to support specific request methods. However, our // tests currently assert that errors come back as application/json and // pat only does "text/plain" responses. for _, method := range common.DefaultHTTPMethods { endpoints = append(endpoints, apihttp.Endpoint{ Pattern: pattern, Method: method, Handler: handler, }) } } mainAPIHandler := srv.trackRequests(http.HandlerFunc(srv.apiHandler)) logSinkHandler := srv.trackRequests(newLogSinkHandler(httpCtxt, srv.logDir)) debugLogHandler := srv.trackRequests(newDebugLogDBHandler(httpCtxt)) add("/model/:modeluuid/logsink", logSinkHandler) add("/model/:modeluuid/log", debugLogHandler) add("/model/:modeluuid/charms", &charmsHandler{ ctxt: httpCtxt, dataDir: srv.dataDir}, ) add("/model/:modeluuid/tools", &toolsUploadHandler{ ctxt: httpCtxt, }, ) add("/model/:modeluuid/tools/:version", &toolsDownloadHandler{ ctxt: httpCtxt, }, ) strictCtxt := httpCtxt strictCtxt.strictValidation = true strictCtxt.controllerModelOnly = true add("/model/:modeluuid/backups", &backupHandler{ ctxt: strictCtxt, }, ) add("/model/:modeluuid/api", mainAPIHandler) add("/model/:modeluuid/images/:kind/:series/:arch/:filename", &imagesDownloadHandler{ ctxt: httpCtxt, dataDir: srv.dataDir, state: srv.state, }, ) endpoints = append(endpoints, guiEndpoints("/gui/:modeluuid/", srv.dataDir, httpCtxt)...) add("/gui-archive", &guiArchiveHandler{ ctxt: httpCtxt, }) add("/gui-version", &guiVersionHandler{ ctxt: httpCtxt, }) // For backwards compatibility we register all the old paths add("/log", debugLogHandler) add("/charms", &charmsHandler{ ctxt: httpCtxt, dataDir: srv.dataDir, }, ) add("/tools", &toolsUploadHandler{ ctxt: httpCtxt, }, ) add("/tools/:version", &toolsDownloadHandler{ ctxt: httpCtxt, }, ) add("/register", ®isterUserHandler{ ctxt: httpCtxt, }, ) add("/", mainAPIHandler) return endpoints }
func (srv *Server) endpoints() []apihttp.Endpoint { httpCtxt := httpContext{ srv: srv, } endpoints := common.ResolveAPIEndpoints(srv.newHandlerArgs) // TODO(ericsnow) Add the following to the registry instead. add := func(pattern string, handler http.Handler) { // TODO: We can switch from all methods to specific ones for entries // where we only want to support specific request methods. However, our // tests currently assert that errors come back as application/json and // pat only does "text/plain" responses. for _, method := range common.DefaultHTTPMethods { endpoints = append(endpoints, apihttp.Endpoint{ Pattern: pattern, Method: method, Handler: handler, }) } } strictCtxt := httpCtxt strictCtxt.strictValidation = true strictCtxt.controllerModelOnly = true mainAPIHandler := srv.trackRequests(http.HandlerFunc(srv.apiHandler)) logSinkHandler := srv.trackRequests(newLogSinkHandler(httpCtxt, srv.logDir)) logStreamHandler := srv.trackRequests(newLogStreamEndpointHandler(strictCtxt)) debugLogHandler := srv.trackRequests(newDebugLogDBHandler(httpCtxt)) add("/model/:modeluuid/logsink", logSinkHandler) add("/model/:modeluuid/logstream", logStreamHandler) add("/model/:modeluuid/log", debugLogHandler) add("/model/:modeluuid/charms", &charmsHandler{ ctxt: httpCtxt, dataDir: srv.dataDir}, ) add("/model/:modeluuid/tools", &toolsUploadHandler{ ctxt: httpCtxt, }, ) add("/model/:modeluuid/tools/:version", &toolsDownloadHandler{ ctxt: httpCtxt, }, ) add("/model/:modeluuid/backups", &backupHandler{ ctxt: strictCtxt, }, ) add("/model/:modeluuid/api", mainAPIHandler) endpoints = append(endpoints, guiEndpoints("/gui/:modeluuid/", srv.dataDir, httpCtxt)...) add("/gui-archive", &guiArchiveHandler{ ctxt: httpCtxt, }) add("/gui-version", &guiVersionHandler{ ctxt: httpCtxt, }) // For backwards compatibility we register all the old paths add("/log", debugLogHandler) add("/charms", &charmsHandler{ ctxt: httpCtxt, dataDir: srv.dataDir, }, ) add("/tools", &toolsUploadHandler{ ctxt: httpCtxt, }, ) add("/tools/:version", &toolsDownloadHandler{ ctxt: httpCtxt, }, ) add("/register", ®isterUserHandler{ ctxt: httpCtxt, }, ) add("/api", mainAPIHandler) // Serve the API at / (only) for backward compatiblity. Note that the // pat muxer special-cases / so that it does not serve all // possible endpoints, but only / itself. add("/", mainAPIHandler) // Add HTTP handlers for local-user macaroon authentication. localLoginHandlers := &localLoginHandlers{srv.authCtxt, srv.state} dischargeMux := http.NewServeMux() httpbakery.AddDischargeHandler( dischargeMux, localUserIdentityLocationPath, localLoginHandlers.authCtxt.localUserThirdPartyBakeryService, localLoginHandlers.checkThirdPartyCaveat, ) dischargeMux.Handle( localUserIdentityLocationPath+"/login", makeHandler(handleJSON(localLoginHandlers.serveLogin)), ) dischargeMux.Handle( localUserIdentityLocationPath+"/wait", makeHandler(handleJSON(localLoginHandlers.serveWait)), ) add(localUserIdentityLocationPath+"/discharge", dischargeMux) add(localUserIdentityLocationPath+"/publickey", dischargeMux) add(localUserIdentityLocationPath+"/login", dischargeMux) add(localUserIdentityLocationPath+"/wait", dischargeMux) return endpoints }