|
8 | 8 | "net/http"
|
9 | 9 | "strings"
|
10 | 10 |
|
| 11 | + "github.com/go-chi/chi/v5" |
| 12 | + |
11 | 13 | "github.com/google/uuid"
|
12 | 14 | "golang.org/x/xerrors"
|
13 | 15 |
|
@@ -156,3 +158,53 @@ func ExtractWorkspaceProxy(opts ExtractWorkspaceProxyConfig) func(http.Handler)
|
156 | 158 | })
|
157 | 159 | }
|
158 | 160 | }
|
| 161 | + |
| 162 | +type workspaceProxyParamContextKey struct{} |
| 163 | + |
| 164 | +// WorkspaceProxy returns the worksace proxy from the ExtractWorkspaceProxyParam handler. |
| 165 | +func WorkspaceProxy(r *http.Request) database.WorkspaceProxy { |
| 166 | + user, ok := r.Context().Value(workspaceProxyParamContextKey{}).(database.WorkspaceProxy) |
| 167 | + if !ok { |
| 168 | + panic("developer error: workspace proxy parameter middleware not provided") |
| 169 | + } |
| 170 | + return user |
| 171 | +} |
| 172 | + |
| 173 | +// ExtractWorkspaceProxyParam extracts a workspace proxy from an ID/name in the {workspaceproxy} URL |
| 174 | +// parameter. |
| 175 | +// |
| 176 | +//nolint:revive |
| 177 | +func ExtractWorkspaceProxyParam(db database.Store) func(http.Handler) http.Handler { |
| 178 | + return func(next http.Handler) http.Handler { |
| 179 | + return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { |
| 180 | + ctx := r.Context() |
| 181 | + |
| 182 | + proxyQuery := chi.URLParam(r, "workspaceproxy") |
| 183 | + if proxyQuery == "" { |
| 184 | + httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ |
| 185 | + Message: "\"workspaceproxy\" must be provided.", |
| 186 | + }) |
| 187 | + return |
| 188 | + } |
| 189 | + |
| 190 | + var proxy database.WorkspaceProxy |
| 191 | + var dbErr error |
| 192 | + if proxyID, err := uuid.Parse(proxyQuery); err == nil { |
| 193 | + proxy, dbErr = db.GetWorkspaceProxyByID(ctx, proxyID) |
| 194 | + } else { |
| 195 | + proxy, dbErr = db.GetWorkspaceProxyByName(ctx, proxyQuery) |
| 196 | + } |
| 197 | + if httpapi.Is404Error(dbErr) { |
| 198 | + httpapi.ResourceNotFound(rw) |
| 199 | + return |
| 200 | + } |
| 201 | + if dbErr != nil { |
| 202 | + httpapi.InternalServerError(rw, dbErr) |
| 203 | + return |
| 204 | + } |
| 205 | + |
| 206 | + ctx = context.WithValue(ctx, workspaceProxyParamContextKey{}, proxy) |
| 207 | + next.ServeHTTP(rw, r.WithContext(ctx)) |
| 208 | + }) |
| 209 | + } |
| 210 | +} |
0 commit comments