From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Christian Barthel Newsgroups: gmane.emacs.help Subject: url-retrieve-synchronously with binary multipart/form-data Date: Wed, 27 Mar 2024 16:23:18 +0100 Message-ID: <87zfujhf6h.fsf@shell.onfire.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="9469"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (berkeley-unix) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Wed Mar 27 16:24:13 2024 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rpV8G-0001wO-PZ for geh-help-gnu-emacs@m.gmane-mx.org; Wed, 27 Mar 2024 16:24:04 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rpV7g-0007Xc-MU; Wed, 27 Mar 2024 11:23:28 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rpV7e-0007S7-UA for help-gnu-emacs@gnu.org; Wed, 27 Mar 2024 11:23:26 -0400 Original-Received: from mout.kundenserver.de ([212.227.17.13]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rpV7a-0006KM-4S for help-gnu-emacs@gnu.org; Wed, 27 Mar 2024 11:23:26 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=online.de; s=s42582890; t=1711552998; x=1712157798; i=bch@online.de; bh=Ko6i/XSaq2lDCY38EGZz06s6RF/g2yODN6TvknyBEKc=; h=X-UI-Sender-Class:From:To:Subject:Date; b=QpT2GctSUdNfBAr2aHbVKpoTciVdpTjLKKa7Vxerw0M2ZnEf2mc/NNwut5/S5nA9 v2mRnwfDi4TFSVA8ZZIkRVcTy2GFUhJrH7/o4jG+bcaxp2dS2HWqa3ezlfgXRVM3p 7Nnpl8Js2gmSNnFVRGdG8Ijayes5GnvbYsKk+rq4AUl8BKT6+oJO+xPvbw/bPTGy+ sEKtuTJ8Oqw6XDz4qP6y2uG44QX/2/8NYKboamJkVJgP5BFGWVlNWvlL9KT+fdRnS KyAqLcyh/7PezHiNiFLzD2xRw+phb5WOoQ8O1EtJ5hhrFborMI49/IVOCAUHvmrtn TeWfDC9+GKQmAhP6Pw== X-UI-Sender-Class: 6003b46c-3fee-4677-9b8b-2b628d989298 Original-Received: from shell.onfire.org ([88.198.95.166]) by mrelayeu.kundenserver.de (mreue106 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MQdI8-1sB0W82IPG-00NedJ for ; Wed, 27 Mar 2024 16:23:18 +0100 X-Gpg-Key: https://onfire.org/bch/pgp/pubkey.asc X-Archive: expiry=7 X-Provags-ID: V03:K1:DFIdnf8O2AKmqber97SBqhXK45x8z8ywiqsBO+hg+luZDKxo6+c LHH78NTu6AgBpfIRN1H4rkXQD1nJlnrGT6BXP1Jx5Hzi/cqOP+RAzoMtcwj1UAyYCJWJ8BN n/5WvYA5OgoSIwiT6BCx3IsG0F6IYhWVovZ2EvHoJv9WteJaVIUQj8WtXqSZ2bii7BN6sVu 21Iux9HXM9CiWB55Rq6CA== UI-OutboundReport: notjunk:1;M01:P0:9inyuCAfpJ0=;gyZB5KQF3esSYQQt86d9LshMlCB 6mMMolydj/AI/C2ornXPBTPcWLBo2QtARulyFzG0cV3lLcwWgXtqVpXuGM3+puu2u0ailWjb7 yVfjxsJZudd023ePsrIAtLFOTzBsl7+WRzC+njmXC8bAXC2uxkCELWkprN+5cp1sXkAOQm+Hi vBU3zmEzX2m6rm7FUlxkfE9ZvmUUmqNCbASUqNjnRuS69mbuIME2rm+VaJL9FUoenFV5p6Fi5 tsG8PlXmZei1mN6J22FuK5I5EGyCYhYduCKeAaXwsBWLTEDkSmuZf+14wNMulxmZnKblUo12N Gc+e997M+d4ANP/BXI74rLDD5xjVkKNrWTfsdU1lp5GEzeRjs5Xm/fSZQHLSOwof4bEmn34pi 4d/5NEEmytbaecJ7iUoGIulwwkLd3EQtdd8oq6dyN/JINq9diEyMA05YfKIIdsSgUvJqBMDul QoV9n6Q7uWGaCe4ubhpxKcPeQ1bOV0outWFXqaUnDtowdMJ+Pm6+WsKkk5UK5I1oyN/5pay6v eCNf4KbPGpG7KfHsm/FldqKZHzsqHiAn/rpXu00auPHxFCACfacpeGV1Hc74jCNM6PAMFM9RV f0uAaejP3YTwyoHee2PBjrslNQcMoWc/5FZYwDe09rpz4K/j6C6OWxE2/hfP0FkYSnuIR4m+F ZeI9+CMVRRLtpPuxedl0VP4Rbkaa+ICKJBIXwsGxJD24lRUrLDIHCdoyoX/l7efZNtywwR1sX GNt4DYoiwLH8FPh3J369X3jlo9p/iV80A== Received-SPF: pass client-ip=212.227.17.13; envelope-from=bch@online.de; helo=mout.kundenserver.de X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, NUMERIC_HTTP_ADDR=1.242, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, WEIRD_PORT=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org X-Gmane-Expiry: 2024-04-03 Xref: news.gmane.io gmane.emacs.help:146185 Archived-At: Hello, I=E2=80=99d like to send a multipart/form-data HTTP POST request with =E2=80=98url-retrieve-synchronously=E2=80=99 which should be equivlent to t= his cURL request: #+begin_src shell curl -X POST \ -H "Content-Type: multipart/form-data" \ --form file=3D"@/tmp/x.png" \ http://127.0.0.1:8898/ #+end_src My current elisp function: #+begin_src elisp (defun xtest/http-post-multipart-boundary () "=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D") (defun xtest/http-post (url data extra-headers) (let ((url-request-method "POST") (url-request-data data) (url-request-extra-headers extra-headers)) (let (header data status) (with-current-buffer (url-retrieve-synchronously url) (setq status url-http-response-status) (goto-char (point-min)) (if (search-forward-regexp "^$" nil t) (setq header (buffer-substring (point-min) (point)) data (buffer-substring (1+ (point)) (point-max))) (setq data (buffer-string)))) (list (cons 'data data) (cons 'header header) (cons 'status status))))) (xtest/http-post "http://127.0.0.1:8898" ;; Data: (format "%s%s%s%s\r\n" "Content-Disposition: form-data; name=3Dx; filename=3Dx.png\r\n" "Content-type: image/png\r\n" (with-temp-buffer (insert-file-contents-literally "/tmp/x.png") (buffer-substring-no-properties (point-min) (point-m= ax))) (format "--%s--" (xtest/http-post-multipart-boundary))) ;; Extra Headers: `(("Content-Type" . ,(format "multipart/form-data; boundary=3D%S" (xtest/http-post-mult= ipart-boundary)) ))) #+end_src (this is a simplified version of my original code - I tried to reconstruct the problem with a simpler version. My original elisp defuns are a bit larger and based on [4]) The problem: With this code in place, I get an error message: "Multibyte text in HTTP request: [..]" As far as I can see, it is generated at Line 416 in url-http.el [1]. When I remove this length check, everything works as expected and I can POST binary data (image/png in my case) to the remote server. My questions: Am I doing something wrong with the encoding of the binary data? Is this length check in line 416 at [1] really correct when sending binary data? Is there a simpler way with native emacs functions to send multipart/form-data with POST? [1] https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/url/url-http.el#n= 416 [2] The bug report when the lines were introduced: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D23750 [3] The git-commit a98aa02a5dbf079f7b4f3be5487a2f2b741d103d: https://git.savannah.gnu.org/cgit/emacs.git/commit/lisp/url/url-http.el?id= =3Da98aa02a5dbf079f7b4f3be5487a2f2b741d103d [4] https://www.emacswiki.org/emacs/http-post-simple.el --=20 Christian Barthel