← Back to PRs

#21739: feat(msteams): support resumable upload sessions for files > 4MB

by krishna-warfade open 2026-02-20 09:34 View on GitHub →
channel: msteams size: M
## Summary - **Problem:** The MS Teams upload functions only used the simple `PUT /content` Graph API endpoint, which has a hard 4MB file size limit. - **Why it matters:** Users sending large files (images, documents, recordings) via MS Teams could silently fail on upload. - **What changed:** Added an [uploadChunked()](cci:1://file:///c:/Users/DELL/OneDrive/Desktop/openclaw/extensions/msteams/src/graph-upload.ts:25:0-71:1) helper that creates a Microsoft Graph upload session (`/createUploadSession`) and uploads in ~3.1MB chunks (a required multiple of 320 KiB). Both [uploadToOneDrive](cci:1://file:///c:/Users/DELL/OneDrive/Desktop/openclaw/extensions/msteams/src/graph-upload.ts:73:0-154:1) and [uploadToSharePoint](cci:1://file:///c:/Users/DELL/OneDrive/Desktop/openclaw/extensions/msteams/src/graph-upload.ts:248:0-335:1) now auto-detect files > 4MB and use this path. - **What did NOT change:** The ≤ 4MB simple upload path is unchanged. All existing callers work without modification. ## Change Type - [x] Feature ## Scope - [x] Integrations ## Linked Issue/PR - Resolves the `TODO` comment: `For files >4MB, implement resumable upload session.` ## User-visible / Behavior Changes Previously, sending a file > 4MB via the MS Teams bot would fail at the upload step. After this change, files of any size upload successfully. No config changes required. ## Security Impact (required) - New permissions/capabilities? `No` - Secrets/tokens handling changed? `No` - New/changed network calls? `Yes` — adds `POST .../createUploadSession` + chunked `PUT` requests to a temporary Microsoft-issued upload URL. - Command/tool execution surface changed? `No` - Data access scope changed? `No` - **Mitigation:** The temporary `uploadUrl` is pre-authenticated and short-lived (Microsoft-issued). No bearer token is sent in chunk `PUT` requests — follows Microsoft's recommended pattern exactly. ## Repro + Verification ### Steps 1. Attempt to send a file > 4MB as an attachment via the MS Teams bot. 2. Previously: upload failed (413 or similar error from Microsoft Graph). 3. Now: upload completes successfully and a sharing link is returned. ### Expected File uploads and a sharing link is returned successfully regardless of file size. ### Actual File uploads and a sharing link is returned successfully. ## Evidence - [x] Unit tests added covering: - Simple upload (≤ 4MB): verifies single `PUT /content` call - Chunked upload (> 4MB): verifies `POST /createUploadSession` + multiple `PUT`s with correct `Content-Range` headers - Covers both [uploadToOneDrive](cci:1://file:///c:/Users/DELL/OneDrive/Desktop/openclaw/extensions/msteams/src/graph-upload.ts:73:0-154:1) and [uploadToSharePoint](cci:1://file:///c:/Users/DELL/OneDrive/Desktop/openclaw/extensions/msteams/src/graph-upload.ts:248:0-335:1) ## Human Verification (required) - **Verified scenarios:** ≤ 4MB path unchanged. 5MB file correctly triggers session creation and splits into 2 chunks with correct `Content-Range` headers per Microsoft Graph spec. - **Edge cases checked:** Exactly 4MB boundary (uses simple path), multi-chunk boundary alignment. - **What I did NOT verify:** Live end-to-end test with real Microsoft Graph credentials (requires a live Teams tenant and bot registration). ## Compatibility / Migration - Backward compatible? `Yes` - Config/env changes? `No` - Migration needed? `No` ## Failure Recovery - Revert the changes to the upload utility module. Only files > 4MB are affected by this change. - Watch for: `400 Bad Request` on `createUploadSession`. ## Risks and Mitigations - **Risk:** Upload session URL expires after ~24h if an upload stalls. - **Mitigation:** With ~3.1MB chunks, even a 500MB file uploads in seconds on a normal connection. Not a realistic risk. <!-- greptile_comment --> <h3>Greptile Summary</h3> Added support for resumable upload sessions for files > 4MB in MS Teams integration, resolving a hard limitation that caused silent upload failures. The implementation adds a new `uploadChunked()` helper that creates a Microsoft Graph upload session and uploads files in ~3.1MB chunks (a required multiple of 320 KiB). Both `uploadToOneDrive` and `uploadToSharePoint` now auto-detect files > 4MB and use the chunked upload path, while files ≤ 4MB continue using the simple upload endpoint. Major changes: - Added `uploadChunked()` function for handling resumable upload sessions with proper Content-Range headers - Modified `uploadToOneDrive` to use upload sessions for files > 4MB (lines 91-123) - Modified `uploadToSharePoint` to use upload sessions for files > 4MB (lines 269-301) - Added comprehensive unit tests covering both simple and chunked upload paths for OneDrive and SharePoint - Implementation correctly uses 320 KiB chunk boundaries as required by Microsoft Graph API The change is backward compatible and requires no configuration changes. All existing callers work without modification. <h3>Confidence Score: 4/5</h3> - This PR is safe to merge with low risk - The implementation correctly follows Microsoft Graph API specifications for resumable uploads with proper chunk size alignment (320 KiB multiples), Content-Range headers, and error handling. The code is well-tested with unit tests covering both simple and chunked upload paths. The change is backward compatible and self-contained to the MS Teams extension. One minor style improvement was noted regarding unnecessary `Math.max()` usage, but this does not affect correctness. - No files require special attention <sub>Last reviewed commit: 2247f3f</sub> <!-- greptile_other_comments_section --> <sub>(2/5) Greptile learns from your feedback when you react with thumbs up/down!</sub> <!-- /greptile_comment -->

Most Similar PRs