argoproj/argo-workflows · warning
Invalid path. Expected: /upload-artifacts/{namespace}/{workf
Error message
Invalid path. Expected: /upload-artifacts/{namespace}/{workflowTemplateName}/{artifactName} What it means
The handler parses r.URL.Path with strings.SplitN(path, "/", 5) and requires at least 5 segments so that namespace, workflowTemplateName and artifactName are all present. If the path has fewer segments, it responds 400 with the expected path shape.
Source
Thrown at server/artifacts/artifact_server.go:91
}
// UploadInputArtifact handles file uploads for workflow input artifacts
// Path: /upload-artifacts/{namespace}/{workflowTemplateName}/{artifactName}
// Method: POST
// Body: multipart/form-data with "file" field
// Response: JSON with artifact location information
//
//nolint:contextcheck
func (a *ArtifactServer) UploadInputArtifact(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
// Parse path: /upload-artifacts/{namespace}/{workflowTemplateName}/{artifactName}
requestPath := strings.SplitN(r.URL.Path, "/", 5)
if len(requestPath) < 5 {
http.Error(w, "Invalid path. Expected: /upload-artifacts/{namespace}/{workflowTemplateName}/{artifactName}", http.StatusBadRequest)
return
}
namespace := requestPath[2]
workflowTemplateName := requestPath[3]
artifactName := requestPath[4]
// Authenticate and authorize
ctx, err := a.gateKeeping(r, types.NamespaceHolder(namespace))
if err != nil {
a.unauthorizedError(w)
return
}
a.logger.WithFields(logging.Fields{
"namespace": namespace,
"workflowTemplateName": workflowTemplateName,
"artifactName": artifactName,
}).Info(ctx, "Upload artifact")View on GitHub (pinned to 35bff19146)
Solutions
- Include all three path parameters: /upload-artifacts/{namespace}/{workflowTemplateName}/{artifactName}
- Print/verify the final URL after any proxy rewriting
- Ensure no component strips or collapses path segments (e.g. ingress rewrite rules)
Example fix
// before
const url = `/upload-artifacts/${ns}/${templateName}`;
// after
if (!artifactName) throw new Error("artifactName required");
const url = `/upload-artifacts/${ns}/${templateName}/${artifactName}`; Defensive patterns
Strategy: validation
Validate before calling
const parts = new URL(url).pathname.split('/').filter(Boolean);
if (parts.length !== 4 || parts[0] !== 'upload-artifacts') {
throw new Error(`Invalid path, expected /upload-artifacts/{ns}/{template}/{artifact}, got ${url}`);
} Prevention
- Build URLs from a helper that takes namespace, template, artifactName explicitly
- Assert no path component is empty before formatting
- Watch for proxies that rewrite/strip path prefixes
When it happens
Trigger: Calling /upload-artifacts, /upload-artifacts/default, or /upload-artifacts/default/my-tmpl (missing artifactName); a URL-encoding or reverse-proxy rewrite stripping trailing path segments; double slashes collapsing segments.
Common situations: Hand-built URLs missing the artifact name, trailing-slash confusion, proxy path trimming, client templates with unfilled placeholders (empty segments).
Related errors
- Method not allowed
- Failed to parse multipart form:
- failed to stream artifact: %v
- CodeNotFound
- CodeNotImplemented
AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03).
Data as JSON: /api/errors/22b52c178699660a.
Report an issue: GitHub.