diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi index 14cd079c563..735e9fd7db4 100644 --- a/doc/lispref/processes.texi +++ b/doc/lispref/processes.texi @@ -2463,6 +2463,12 @@ that are mainly relevant to encrypted connections: @item :nowait @var{boolean} If non-@code{nil}, try to make an asynchronous connection. +@item :coding @var{coding} +Use this to set the coding systems used by the network process, in +preference to binding @code{coding-system-for-read} or +@code{coding-system-for-write}. @xref{Network Processes} for +details. + @item :type @var{type} The type of connection. Options are: diff --git a/doc/misc/emacs-gnutls.texi b/doc/misc/emacs-gnutls.texi index 555a4b1b56e..c3e69178fca 100644 --- a/doc/misc/emacs-gnutls.texi +++ b/doc/misc/emacs-gnutls.texi @@ -190,7 +190,7 @@ the connection process. The optional @var{parameters} argument is a list of keywords and values. The only keywords which currently have any effect are -@code{:client-certificate} and @code{:nowait}. +@code{:client-certificate}, @code{:nowait}, and @code{:coding}. Passing @w{@code{:client certificate t}} triggers looking up of client certificates matching @var{host} and @var{service} using the diff --git a/etc/NEWS b/etc/NEWS index 1af368caa63..ef2697f4853 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -339,6 +339,15 @@ Emacs depended on the previous behavior; if you really want the process' coding-system to be nil, use 'set-process-coding-system' after the process has been created, or pass in ":coding '(nil nil)". ++++ +** 'open-network-stream' now accepts a :coding argument. +This allows specifying the coding systems used by a network process +for encoding and decoding without having to bind +coding-system-for-{read,write} or call 'set-process-coding-system'. + ++++ +** 'open-gnutls-stream' now also accepts a :coding argument. + * Changes in Emacs 28.1 on Non-Free Operating Systems diff --git a/lisp/net/gnutls.el b/lisp/net/gnutls.el index 459156e6d27..cd86b4dea65 100644 --- a/lisp/net/gnutls.el +++ b/lisp/net/gnutls.el @@ -169,8 +169,9 @@ Third arg HOST is the name of the host to connect to, or its IP address. Fourth arg SERVICE is the name of the service desired, or an integer specifying a port number to connect to. Fifth arg PARAMETERS is an optional list of keyword/value pairs. -Only :client-certificate and :nowait keywords are recognized, and -have the same meaning as for `open-network-stream'. +Only :client-certificate, :nowait, and :coding keywords are +recognized, and have the same meaning as for +`open-network-stream'. For historical reasons PARAMETERS can also be a symbol, which is interpreted the same as passing a list containing :nowait and the value of that symbol. @@ -208,7 +209,8 @@ trust and key files, and priority string." (gnutls-boot-parameters :type 'gnutls-x509pki :keylist keylist - :hostname (puny-encode-domain host))))))) + :hostname (puny-encode-domain host)))) + :coding (plist-get parameters :coding)))) (if nowait process (gnutls-negotiate :process process diff --git a/lisp/net/network-stream.el b/lisp/net/network-stream.el index e99d7a372c0..1d5cf382a84 100644 --- a/lisp/net/network-stream.el +++ b/lisp/net/network-stream.el @@ -113,6 +113,10 @@ values: `ssl' -- Equivalent to `tls'. `shell' -- A shell connection. +:coding is a symbol or a cons used to specify the coding systems +used to decode and encode the data which the process reads and +writes. See `make-network-process' for details. + :return-list specifies this function's return value. If omitted or nil, return a process object. A non-nil means to return (PROC . PROPS), where PROC is a process object and PROPS @@ -189,7 +193,8 @@ gnutls-boot (as returned by `gnutls-boot-parameters')." :host (puny-encode-domain host) :service service :nowait (plist-get parameters :nowait) :tls-parameters - (plist-get parameters :tls-parameters)) + (plist-get parameters :tls-parameters) + :coding (plist-get parameters :coding)) (let ((work-buffer (or buffer (generate-new-buffer " *stream buffer*"))) (fun (cond ((and (eq type 'plain) @@ -249,7 +254,8 @@ gnutls-boot (as returned by `gnutls-boot-parameters')." (stream (make-network-process :name name :buffer buffer :host (puny-encode-domain host) :service service - :nowait (plist-get parameters :nowait)))) + :nowait (plist-get parameters :nowait) + :coding (plist-get parameters :coding)))) (when (plist-get parameters :warn-unless-encrypted) (setq stream (nsm-verify-connection stream host service nil t))) (list stream @@ -270,7 +276,8 @@ gnutls-boot (as returned by `gnutls-boot-parameters')." ;; Return (STREAM GREETING CAPABILITIES RESULTING-TYPE) (stream (make-network-process :name name :buffer buffer :host (puny-encode-domain host) - :service service)) + :service service + :coding (plist-get parameters :coding))) (greeting (and (not (plist-get parameters :nogreeting)) (network-stream-get-response stream start eoc))) (capabilities (network-stream-command stream capability-command @@ -350,7 +357,8 @@ gnutls-boot (as returned by `gnutls-boot-parameters')." (setq stream (make-network-process :name name :buffer buffer :host (puny-encode-domain host) - :service service)) + :service service + :coding (plist-get parameters :coding))) (network-stream-get-response stream start eoc))) (unless (process-live-p stream) (error "Unable to negotiate a TLS connection with %s/%s" @@ -453,6 +461,7 @@ gnutls-boot (as returned by `gnutls-boot-parameters')." (let* ((capability-command (plist-get parameters :capability-command)) (eoc (plist-get parameters :end-of-command)) (start (with-current-buffer buffer (point))) + (coding (plist-get parameters :coding)) (stream (let ((process-connection-type nil)) (start-process name buffer shell-file-name shell-command-switch @@ -461,6 +470,13 @@ gnutls-boot (as returned by `gnutls-boot-parameters')." (format-spec-make ?s host ?p service)))))) + (when coding (if (consp coding) + (set-process-coding-system stream + (car coding) + (cdr coding)) + (set-process-coding-system stream + coding + coding))) (list stream (network-stream-get-response stream start eoc) (network-stream-command stream capability-command