chenhg5/cc-connect · error
googlechat: upload: empty resourceName in response
Error message
googlechat: upload: empty resourceName in response
What it means
Returned by uploadAttachment when the Chat upload response decodes successfully but attachmentDataRef.resourceName is empty — the server acknowledged the upload but did not return the attachment reference needed to send the message. This indicates an unexpected/empty API response for the upload. It surfaces via postAttachment from SendImage/SendFile.
Source
Thrown at platform/googlechat/googlechat.go:504
return "", err
}
defer func() {
if err := resp.Body.Close(); err != nil {
slog.Warn("googlechat: close upload response body", "error", err)
}
}()
var result struct {
AttachmentDataRef struct {
ResourceName string `json:"resourceName"`
} `json:"attachmentDataRef"`
}
defer func() { _, _ = io.Copy(io.Discard, resp.Body) }()
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
return "", fmt.Errorf("googlechat: upload: decode response: %w", err)
}
if result.AttachmentDataRef.ResourceName == "" {
return "", fmt.Errorf("googlechat: upload: empty resourceName in response")
}
return result.AttachmentDataRef.ResourceName, nil
}
// buildAttachmentRequest builds the Chat REST API URL and JSON body to post a
// message that references an already-uploaded attachment (by resource name).
// Threading behaviour mirrors buildSendRequest.
func buildAttachmentRequest(rc replyContext, resourceName string) (string, []byte, error) {
body := map[string]any{
"attachment": []map[string]any{
{"attachmentDataRef": map[string]any{"resourceName": resourceName}},
},
}
applyThread(body, rc)
b, err := json.Marshal(body)
if err != nil {
return "", nil, fmt.Errorf("googlechat: marshal attachment body: %w", err)
}View on GitHub (pinned to 4000b2338a)
Solutions
- Log the full decoded response to see what fields the server actually returned.
- Verify the OAuth scopes cover media upload with send permission.
- Retry the upload — transient server-side issues can yield empty refs.
- Check the Google Workspace API release notes / issue tracker for Chat upload response schema changes and update the library.
Defensive patterns
Strategy: retry
Validate before calling
// avoid zero-byte uploads which can produce empty refs
fi, err := os.Stat(path)
if err != nil || fi.Size() == 0 {
return fmt.Errorf("refusing to upload empty or missing file %q", path)
} Try / catch
name, err := p.SendFile(ctx, target, path)
if err != nil && strings.Contains(err.Error(), "empty resourceName") {
time.Sleep(2 * time.Second)
return p.SendFile(ctx, target, path)
} Prevention
- Never upload zero-byte files.
- Retry transient upload failures with backoff.
- Track Google Workspace release notes for Chat upload API changes.
- Log the full upload response when this error occurs to aid upstream bug reports.
When it happens
Trigger: Calling SendImage()/SendFile(); the upload endpoint responds with JSON lacking attachmentDataRef.resourceName — e.g. the API changed its response shape or an edge response omitted the ref.
Common situations: Google Chat API behavior changes; uploading with a scope the API accepts only partially (auth issues); zero-byte or unusual payloads causing the server to skip the attachment ref.
Understand the failure class
Background: "empty response", "returned no data", "empty embeddings": what HTTP 200-with-empty-body errors mean across libraries — this error's family across 36 libraries.
Related errors
- googlechat: upload: decode response: %w
- googlechat: upload: create metadata part: %w
- googlechat: upload: encode metadata: %w
- googlechat: upload: create media part: %w
- googlechat: upload: write media: %w
AI-assisted analysis of chenhg5/cc-connect@4000b2338a (2026-09-06).
Data as JSON: /api/errors/0cd7d58d49860ff2.
Report an issue: GitHub.