ExtractWorkspaceProxyParam extracts a workspace proxy from an ID/name in the {workspaceproxy} URL parameter. nolint:revive
(db database.Store, deploymentID string, fetchPrimaryProxy func(ctx context.Context) (database.WorkspaceProxy, error))
| 160 | // |
| 161 | //nolint:revive |
| 162 | func ExtractWorkspaceProxyParam(db database.Store, deploymentID string, fetchPrimaryProxy func(ctx context.Context) (database.WorkspaceProxy, error)) func(http.Handler) http.Handler { |
| 163 | return func(next http.Handler) http.Handler { |
| 164 | return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { |
| 165 | ctx := r.Context() |
| 166 | |
| 167 | proxyQuery := chi.URLParam(r, "workspaceproxy") |
| 168 | if proxyQuery == "" { |
| 169 | httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ |
| 170 | Message: "\"workspaceproxy\" must be provided.", |
| 171 | }) |
| 172 | return |
| 173 | } |
| 174 | |
| 175 | var proxy database.WorkspaceProxy |
| 176 | var dbErr error |
| 177 | if proxyQuery == "primary" || proxyQuery == deploymentID { |
| 178 | // Requesting primary proxy |
| 179 | proxy, dbErr = fetchPrimaryProxy(ctx) |
| 180 | } else if proxyID, err := uuid.Parse(proxyQuery); err == nil { |
| 181 | // Request proxy by id |
| 182 | proxy, dbErr = db.GetWorkspaceProxyByID(ctx, proxyID) |
| 183 | } else { |
| 184 | // Request proxy by name |
| 185 | proxy, dbErr = db.GetWorkspaceProxyByName(ctx, proxyQuery) |
| 186 | } |
| 187 | if httpapi.Is404Error(dbErr) { |
| 188 | httpapi.ResourceNotFound(rw) |
| 189 | return |
| 190 | } |
| 191 | if dbErr != nil { |
| 192 | httpapi.InternalServerError(rw, dbErr) |
| 193 | return |
| 194 | } |
| 195 | |
| 196 | ctx = context.WithValue(ctx, workspaceProxyParamContextKey{}, proxy) |
| 197 | next.ServeHTTP(rw, r.WithContext(ctx)) |
| 198 | }) |
| 199 | } |
| 200 | } |