Function: mm-url-encode-multipart-form-data

mm-url-encode-multipart-form-data is a byte-compiled function defined in mm-url.el.gz.

Signature

(mm-url-encode-multipart-form-data DATA &optional BOUNDARY)

Documentation

Return DATA encoded in multipart/form-data.

DATA is a list where the elements can have the following form:
  ("NAME" . "VALUE")
  ("submit")
  ("file" . (("name" . "NAME")
             ("filename" . "FILENAME")
             ("content-type" . "CONTENT-TYPE")
             ("filedata" . "FILEDATA")))
Lowercase strings above are literals and uppercase are not.

Source Code

;; Defined in /usr/src/emacs/lisp/gnus/mm-url.el.gz
(defun mm-url-encode-multipart-form-data (data &optional boundary)
  "Return DATA encoded in multipart/form-data.
DATA is a list where the elements can have the following form:
  (\"NAME\" . \"VALUE\")
  (\"submit\")
  (\"file\" . ((\"name\" . \"NAME\")
             (\"filename\" . \"FILENAME\")
             (\"content-type\" . \"CONTENT-TYPE\")
             (\"filedata\" . \"FILEDATA\")))
Lowercase strings above are literals and uppercase are not."
  ;; RFC1867
  ;; Get a good boundary.
  (unless boundary
    (setq boundary (mml-compute-boundary '())))
  (with-temp-buffer
    (set-buffer-multibyte nil)
    (dolist (elem data)
      (let ((name (car elem))
	    (value (cdr elem)))
	(insert "--" boundary "\r\n")
	(cond
	 ((equal name "file")
	  (insert (format
		   "Content-Disposition: form-data; name=%S; filename=%S\r\n"
		   (or (cdr (assoc "name" value)) name)
		   (cdr (assoc "filename" value))))
	  (insert "Content-Transfer-Encoding: binary\r\n")
	  (insert (format "Content-Type: %s\r\n\r\n"
			  (or (cdr (assoc "content-type" value))
			      "text/plain")))
	  (let ((filedata (cdr (assoc "filedata" value))))
	    (cond
	     ((stringp filedata)
	      (insert filedata))
	     ;; How can this possibly be useful?
	     ((integerp filedata)
	      (insert (number-to-string filedata))))))
	 ((equal name "submit")
	  (insert
	   "Content-Disposition: form-data; name=\"submit\"\r\n\r\nSubmit\r\n"))
	 (t
	  (insert (format "Content-Disposition: form-data; name=%S\r\n\r\n"
			  name))
	  (insert value)))
	(unless (bolp)
	  (insert "\r\n"))))
    (insert "--" boundary "--\r\n")
    (buffer-string)))