Commit 7b84a0c
authored
Support uploading non-image files (PDF, zip, etc.) (#24)
* Support uploading non-image files (PDF, zip, etc.)
GitHub's internal attachment endpoint already accepts non-image files; it
routes them to a separate storage backend that finalizes at a different path.
Use the policy response's asset_upload_url for the finalize PUT instead of the
hardcoded /upload/assets/{id} (which 404'd "Invalid Asset" for files), and
render a download link [name](url) for non-images vs the image embed .
- upload: finalize via policy.asset_upload_url (required + root-relative); add
renderMarkdown branching on the image/ content-type prefix
- generalize "image" -> "file" in CLI help, identifiers, and docs (the gh image
command and gh-image repo name are unchanged)
- tests: non-image full-flow finalize routing, renderMarkdown table, asset_upload_url
validation, and .pdf content-type detection
Closes #23
* Fix content_type for text uploads (charset param) and .log
GitHub's /upload/policies/assets validates content_type against an
allowlist and against the file extension, rejecting mismatches with 422.
detectContentType sent Go's mime.TypeByExtension result verbatim, which
broke two cases:
- Text types (.txt, .md, .csv, .log) resolve to e.g. "text/plain;
charset=utf-8"; GitHub's allowlist only accepts the bare media type,
so every text upload failed. Strip parameters via mime.ParseMediaType.
- .log resolves to text/plain, but GitHub's extension table expects
text/x-log and 422s on ".log != text/plain". Add a small override
map for extensions where GitHub disagrees with Go's mime table.
Verified end-to-end against real GitHub: .log, .txt, .md, .csv, .json,
.pdf, .zip, .mp4 all upload. Updated TestDetectContentType to assert
parameter stripping and the .log override (incl. case-insensitivity).
* Render videos as inline players via bare asset URL
GitHub renders a user-attachments video asset as an inline <video> player
when its URL appears on its own line; link or embed syntax only produces a
link. renderMarkdown now emits the bare URL for video/* content types
(images still embed, other files still link). Confirmed end-to-end: the
rendered comment HTML for an uploaded .mp4 is a <video controls> element.
Updates TestRenderMarkdown (video/mp4, video/quicktime) and the README/
SKILL output descriptions.
* Render from GitHub's asset content_type, not the local guess
The render form (image embed / video player / download link) was decided
from the locally-detected content type threaded through Upload ->
finalizeUpload -> renderMarkdown. The policy response already carries the
content type GitHub assigned the asset, which is the exact signal GitHub's
renderer uses, so finalizeUpload now reads policy.Asset.ContentType
directly. This drops the threaded parameter and guarantees the output form
matches how GitHub actually displays the asset (e.g. an SVG GitHub treats
as a file renders as a link, not a broken embed).
requestPolicy now validates asset.content_type is present, since the
render decision depends on it. detectContentType is unchanged -- it still
supplies the content_type the policy request and S3 upload must send.
* Clarify finalize render-decision comment (asset content_type is our echo)
* Update banner: 'Upload files to GitHub' (covers non-image uploads)1 parent 7385c82 commit 7b84a0c
9 files changed
Lines changed: 317 additions & 122 deletions
File tree
- documentation
- internal/upload
- skills/github-image-upload
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
| 2 | + | |
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
| 6 | + | |
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | | - | |
| 20 | + | |
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
25 | 28 | | |
26 | 29 | | |
27 | 30 | | |
| |||
52 | 55 | | |
53 | 56 | | |
54 | 57 | | |
55 | | - | |
| 58 | + | |
56 | 59 | | |
57 | 60 | | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
58 | 64 | | |
59 | 65 | | |
60 | 66 | | |
61 | 67 | | |
62 | | - | |
| 68 | + | |
63 | 69 | | |
64 | 70 | | |
65 | 71 | | |
66 | | - | |
| 72 | + | |
| 73 | + | |
67 | 74 | | |
68 | 75 | | |
69 | | - | |
| 76 | + | |
70 | 77 | | |
71 | 78 | | |
72 | 79 | | |
| |||
84 | 91 | | |
85 | 92 | | |
86 | 93 | | |
87 | | - | |
| 94 | + | |
88 | 95 | | |
89 | 96 | | |
90 | 97 | | |
| |||
165 | 172 | | |
166 | 173 | | |
167 | 174 | | |
168 | | - | |
169 | | - | |
| 175 | + | |
| 176 | + | |
170 | 177 | | |
171 | | - | |
| 178 | + | |
172 | 179 | | |
173 | 180 | | |
174 | 181 | | |
| |||
Loading
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| |||
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
46 | | - | |
| 46 | + | |
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
51 | | - | |
| 51 | + | |
52 | 52 | | |
53 | 53 | | |
54 | 54 | | |
| |||
148 | 148 | | |
149 | 149 | | |
150 | 150 | | |
151 | | - | |
| 151 | + | |
152 | 152 | | |
153 | | - | |
| 153 | + | |
154 | 154 | | |
155 | 155 | | |
156 | 156 | | |
| |||
165 | 165 | | |
166 | 166 | | |
167 | 167 | | |
168 | | - | |
| 168 | + | |
169 | 169 | | |
170 | 170 | | |
171 | 171 | | |
| |||
179 | 179 | | |
180 | 180 | | |
181 | 181 | | |
182 | | - | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
183 | 185 | | |
184 | 186 | | |
185 | 187 | | |
| |||
210 | 212 | | |
211 | 213 | | |
212 | 214 | | |
213 | | - | |
| 215 | + | |
214 | 216 | | |
215 | 217 | | |
216 | 218 | | |
| |||
221 | 223 | | |
222 | 224 | | |
223 | 225 | | |
224 | | - | |
| 226 | + | |
225 | 227 | | |
226 | 228 | | |
227 | 229 | | |
228 | 230 | | |
229 | | - | |
| 231 | + | |
230 | 232 | | |
231 | 233 | | |
232 | 234 | | |
| |||
296 | 298 | | |
297 | 299 | | |
298 | 300 | | |
299 | | - | |
| 301 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| |||
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
95 | | - | |
| 95 | + | |
96 | 96 | | |
97 | 97 | | |
98 | 98 | | |
| |||
131 | 131 | | |
132 | 132 | | |
133 | 133 | | |
134 | | - | |
| 134 | + | |
135 | 135 | | |
136 | | - | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
137 | 140 | | |
138 | 141 | | |
139 | 142 | | |
| |||
163 | 166 | | |
164 | 167 | | |
165 | 168 | | |
166 | | - | |
| 169 | + | |
167 | 170 | | |
168 | | - | |
| 171 | + | |
| 172 | + | |
169 | 173 | | |
170 | 174 | | |
171 | | - | |
| 175 | + | |
| 176 | + | |
172 | 177 | | |
173 | 178 | | |
| 179 | + | |
174 | 180 | | |
175 | 181 | | |
176 | 182 | | |
| |||
197 | 203 | | |
198 | 204 | | |
199 | 205 | | |
200 | | - | |
| 206 | + | |
201 | 207 | | |
202 | 208 | | |
203 | 209 | | |
| |||
0 commit comments