From 46da4c9d9367aaf4bd3ce2faf118845f3930dabf Mon Sep 17 00:00:00 2001 From: Daniel Watson Date: Sat, 3 Jun 2023 21:15:25 -0700 Subject: [PATCH] ; always CRLF before non-first boundary in multipart form data ; Insert CRLF after file contents and before boundary, ; in accordance with the syntax description here ; https://www.rfc-editor.org/rfc/rfc2046#section-5.1.1 ; The CRLF is attached to the boundary, and not the preceding part. --- lisp/gnus/mm-url.el | 3 +- test/lisp/gnus/mm-url-tests.el | 53 ++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 test/lisp/gnus/mm-url-tests.el diff --git a/lisp/gnus/mm-url.el b/lisp/gnus/mm-url.el index 11847a79f17..022762a7799 100644 --- a/lisp/gnus/mm-url.el +++ b/lisp/gnus/mm-url.el @@ -438,8 +438,7 @@ mm-url-encode-multipart-form-data (insert (format "Content-Disposition: form-data; name=%S\r\n\r\n" name)) (insert value))) - (unless (bolp) - (insert "\r\n")))) + (insert "\r\n"))) (insert "--" boundary "--\r\n") (buffer-string))) diff --git a/test/lisp/gnus/mm-url-tests.el b/test/lisp/gnus/mm-url-tests.el new file mode 100644 index 00000000000..ed51cb7d086 --- /dev/null +++ b/test/lisp/gnus/mm-url-tests.el @@ -0,0 +1,53 @@ +;;; mm-url-tests.el --- -*- lexical-binding:t -*- + +;; Copyright (C) 2021-2023 Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;;; Code: + +(require 'ert) +(require 'mm-url) + +(ert-deftest test-mm-url-encode-multipart-form-data () + (letrec + ((boundary "====-=-=") + (make-data (lambda (count) + `(("file" + ("filedata" . ,(make-string count ?\n)) + ("name" . "file") + ("filename" . "g"))))) + (template + (concat + "--" boundary "\r\n" + "Content-Disposition:" + " form-data; name=\"file\"; filename=\"g\"\r\n" + "Content-Transfer-Encoding: binary\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "%s" ;; here's the file content + "\r\n" ;; \r\n attaches to boundary below, not file content + ;; ref: https://www.rfc-editor.org/rfc/rfc2046#section-5.1.1 + "--" boundary "--" "\r\n"))) + (dotimes (count 3) + (let ((data (funcall make-data count)) + (expected (format template (make-string count ?\n)))) + (should (equal (mm-url-encode-multipart-form-data data boundary) + expected)))))) + +;;; mm-url-tests.el ends here -- 2.34.1