mirror of https://github.com/portainer/portainer
				
				
				
			
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
package middlewares
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"errors"
 | 
						|
	"net/http"
 | 
						|
 | 
						|
	"github.com/gorilla/mux"
 | 
						|
	httperror "github.com/portainer/libhttp/error"
 | 
						|
	requesthelpers "github.com/portainer/libhttp/request"
 | 
						|
	portainer "github.com/portainer/portainer/api"
 | 
						|
 | 
						|
	"github.com/portainer/portainer/api/dataservices"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	contextEndpoint = "endpoint"
 | 
						|
)
 | 
						|
 | 
						|
func WithEndpoint(endpointService dataservices.EndpointService, endpointIDParam string) mux.MiddlewareFunc {
 | 
						|
	return func(next http.Handler) http.Handler {
 | 
						|
		return http.HandlerFunc(func(rw http.ResponseWriter, request *http.Request) {
 | 
						|
			if endpointIDParam == "" {
 | 
						|
				endpointIDParam = "id"
 | 
						|
			}
 | 
						|
 | 
						|
			endpointID, err := requesthelpers.RetrieveNumericRouteVariableValue(request, endpointIDParam)
 | 
						|
			if err != nil {
 | 
						|
				httperror.WriteError(rw, http.StatusBadRequest, "Invalid environment identifier route variable", err)
 | 
						|
				return
 | 
						|
			}
 | 
						|
 | 
						|
			endpoint, err := endpointService.Endpoint(portainer.EndpointID(endpointID))
 | 
						|
			if err != nil {
 | 
						|
				statusCode := http.StatusInternalServerError
 | 
						|
 | 
						|
				if dataservices.IsErrObjectNotFound(err) {
 | 
						|
					statusCode = http.StatusNotFound
 | 
						|
				}
 | 
						|
				httperror.WriteError(rw, statusCode, "Unable to find an environment with the specified identifier inside the database", err)
 | 
						|
				return
 | 
						|
			}
 | 
						|
 | 
						|
			ctx := context.WithValue(request.Context(), contextEndpoint, endpoint)
 | 
						|
 | 
						|
			next.ServeHTTP(rw, request.WithContext(ctx))
 | 
						|
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func FetchEndpoint(request *http.Request) (*portainer.Endpoint, error) {
 | 
						|
	contextData := request.Context().Value(contextEndpoint)
 | 
						|
	if contextData == nil {
 | 
						|
		return nil, errors.New("Unable to find environment data in request context")
 | 
						|
	}
 | 
						|
 | 
						|
	return contextData.(*portainer.Endpoint), nil
 | 
						|
}
 |