-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
provider_handler.go
145 lines (129 loc) · 4.01 KB
/
provider_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package handlers
import (
"encoding/json"
"net/http"
"strings"
models "github.com/layer5io/meshery/server/models"
)
// swagger:route GET /api/provider ProvidersAPI idChoiceProvider
// Handle GET request for the choice of provider
//
// Update the choice of provider in system
// responses:
// 200:
// ProviderHandler - handles the choice of provider
func (h *Handler) ProviderHandler(w http.ResponseWriter, r *http.Request) {
provider := r.URL.Query().Get("provider")
for _, p := range h.config.Providers {
if provider == p.Name() {
http.SetCookie(w, &http.Cookie{
Name: h.config.ProviderCookieName,
Value: p.Name(),
Path: "/",
HttpOnly: true,
})
redirectURL := "/user/login"
if provider == "None" {
redirectURL = "/"
}
http.Redirect(w, r, redirectURL, http.StatusFound)
return
}
}
}
// swagger:route GET /api/providers ProvidersAPI idGetProvidersList
// Handle GET request for list of providers
//
// Returns the available list of providers
// responses:
// 200: listProvidersRespWrapper
// ProvidersHandler returns a list of providers
func (h *Handler) ProvidersHandler(w http.ResponseWriter, _ *http.Request) {
// if r.Method != http.MethodGet {
// http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
// return
// }
providers := map[string]models.ProviderProperties{}
for _, p := range h.config.Providers {
providers[p.Name()] = (p.GetProviderProperties())
}
bd, err := json.Marshal(providers)
if err != nil {
obj := "provider"
h.log.Error(models.ErrMarshal(err, obj))
http.Error(w, models.ErrMarshal(err, obj).Error(), http.StatusInternalServerError)
return
}
_, _ = w.Write(bd)
}
// swagger:route GET /provider ProvidersAPI idProvider
// Handle GET request to provider UI
//
// Servers providers UI
// responses:
// 200:
// ProviderUIHandler - serves providers UI
func (h *Handler) ProviderUIHandler(w http.ResponseWriter, r *http.Request) {
if h.config.PlaygroundBuild || h.Provider == "Meshery" { //Always use Remote provider for Playground build or when Provider is enforced
http.SetCookie(w, &http.Cookie{
Name: h.config.ProviderCookieName,
Value: "Meshery",
Path: "/",
HttpOnly: true,
})
redirectURL := "/user/login"
http.Redirect(w, r, redirectURL, http.StatusFound)
return
}
ServeUI(w, r, "/provider", "../../provider-ui/out/")
}
// swagger:route GET /api/provider/capabilities ProvidersAPI idGetProviderCapabilities
// Handle GET requests for Provider
//
// Returns the capabilities.json for the provider
// responses:
// 200:
// ProviderCapabilityHandler returns the capabilities.json for the provider
func (h *Handler) ProviderCapabilityHandler(
w http.ResponseWriter,
r *http.Request,
_ *models.Preference,
_ *models.User,
provider models.Provider,
) {
provider.GetProviderCapabilities(w, r)
}
// swagger:route GET /api/provider/extension ProvidersAPI idReactComponents
// Handle GET request for React Components
//
// handles the requests to serve react components from the provider package
// responses:
// 200:
// ProviderComponentsHandler handlers the requests to serve react
// components from the provider package
func (h *Handler) ProviderComponentsHandler(
w http.ResponseWriter,
r *http.Request,
prefObj *models.Preference,
user *models.User,
provider models.Provider,
) {
uiReqBasePath := "/api/provider/extension"
serverReqBasePath := "/api/provider/extension/server/"
loadReqBasePath := "/api/provider/extension/"
if strings.HasPrefix(r.URL.Path, serverReqBasePath) {
h.ExtensionsEndpointHandler(w, r, prefObj, user, provider)
} else if r.URL.Path == loadReqBasePath {
err := h.LoadExtensionFromPackage(w, r, provider)
if err != nil {
// failed to load extensions from package
h.log.Error(ErrFailToLoadExtensions(err))
http.Error(w, ErrFailToLoadExtensions(err).Error(), http.StatusInternalServerError)
return
}
w.Header().Set("content-type", "application/json")
_, _ = w.Write([]byte("{}"))
} else {
ServeReactComponentFromPackage(w, r, uiReqBasePath, provider)
}
}