From 188c5fb8781136514665dae931dd9299ae7258b2 Mon Sep 17 00:00:00 2001 From: Chaim Marcus Date: Thu, 26 Mar 2026 06:22:27 +0000 Subject: [PATCH] fix: use multipart upload for Composer Registry (fixes 500 error) --- server.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/server.py b/server.py index 69731c3..d2057e5 100644 --- a/server.py +++ b/server.py @@ -97,17 +97,26 @@ def gitea_api(method, path, data=None, raw=False): def gitea_upload(url, file_data, filename): """Upload file to Gitea (Composer registry or release asset).""" - headers = {'Authorization': f'token {GITEA_TOKEN}'} - req = urllib.request.Request(url, data=file_data, headers=headers, method='PUT') + boundary = '----FormBoundary' + os.urandom(8).hex() + body = ( + f'--{boundary}\r\n' + f'Content-Disposition: form-data; name="package"; filename="{filename}"\r\n' + f'Content-Type: application/zip\r\n\r\n' + ).encode() + file_data + f'\r\n--{boundary}--\r\n'.encode() + headers = { + 'Authorization': f'token {GITEA_TOKEN}', + 'Content-Type': f'multipart/form-data; boundary={boundary}' + } + req = urllib.request.Request(url, data=body, headers=headers, method='PUT') try: resp = urllib.request.urlopen(req, context=SSL_CTX, timeout=60) return {'status': 'ok', 'code': resp.getcode()} except urllib.error.HTTPError as e: code = e.code - body = e.read().decode()[:200] + msg = e.read().decode()[:200] if code == 409: return {'status': 'exists', 'code': 409, 'message': 'already exists'} - return {'status': 'error', 'code': code, 'message': body} + return {'status': 'error', 'code': code, 'message': msg} # --- Build logic (from Gitea, no local files) ---