Fix manage handlers ignoring multipart form bodies

The /manage page posts with FormData, i.e. multipart/form-data, but the edit,
delete, tags, restore and empty-trash handlers parsed with r.ParseForm, which
only reads urlencoded bodies. So every field came back empty: delete returned
200 with deleted:0 and moved nothing, edits saved nothing — while curl -d
(urlencoded) worked, which is why tests and manual checks missed it.

Parse with ParseMultipartForm (tolerating ErrNotMultipart so urlencoded still
works), via a shared parseForm helper used by all manage handlers. handleUpload
already did this. Also stop the UI reporting deleted:0 / updated:0 as success,
and add a multipart regression test.
This commit is contained in:
puttaalu committed 2026-10-18 22:32:18 +02:00
1 parent 25384d3f3b
commit bf75c9fe8e
4 files changed
+75 -9

No files matched your search

+11 -5
View File
@@ -212,7 +212,9 @@
const form = new FormData();
form.append('slug', slug);
try {
await post('/api/delete', form);
const res = await post('/api/delete', form);
const j = await res.json().catch(() => ({}));
if (!j.deleted) { flash('Not deleted — "' + slug + '" not found on the server', false); return; }
el.remove();
flash('Moved ' + slug + ' to trash', true);
refreshBulk();
@@ -233,8 +235,10 @@
const form = new FormData();
form.append('slugs', slugs.join(','));
try {
await post('/api/delete', form);
flash('Moved ' + slugs.length + ' to trash', true);
const res = await post('/api/delete', form);
const j = await res.json().catch(() => ({}));
if (!j.deleted) { flash('Nothing deleted — slugs not found on the server', false); return; }
flash('Moved ' + j.deleted + ' to trash', true);
await load();
} catch (err) { flash('Delete failed: ' + err.message, false); }
});
@@ -247,9 +251,11 @@
form.append('slugs', slugs.join(','));
form.append(label, val);
try {
await post('/api/tags', form);
const res = await post('/api/tags', form);
const j = await res.json().catch(() => ({}));
if (!j.updated) { flash('No posts updated', false); return; }
document.getElementById(field).value = '';
flash('Updated tags on ' + slugs.length + ' post(s)', true);
flash('Updated tags on ' + j.updated + ' post(s)', true);
await load();
} catch (err) { flash('Tag update failed: ' + err.message, false); }
}