5

这个问题把我逼疯了。我有一个本地 SOCKSv5 代理,它是系统上所有应用程序的网关。我想url-retrieve-synchronously试试袜子。使用以下设置:

(setq socks-noproxy '("127.0.0.1"))
(setq socks-server '("Default server" "127.0.0.1" 8010 5))
(setq url-gateway-method 'socks)

通过普通 HTTP 检索工作正常:

(url-retrieve-synchronously "http://gnu.org")
#<buffer  *http www.gnu.org:80*>

但它不适用于HTTPS

(url-retrieve-synchronously "https://gnu.org")

它导致:

Debugger entered--Lisp error: (file-error "make client process failed" "connection timed out" :name "gnu.org" :buffer #<buffer  *url-http-temp*> :host "gnu.org" :service 443 :nowait nil)
  make-network-process(:name "gnu.org" :buffer #<buffer  *url-http-temp*> :host    "gnu.org" :service 443 :nowait nil)
  open-network-stream("gnu.org" #<buffer  *url-http-temp*> "gnu.org" 443)
  open-gnutls-stream("gnu.org" #<buffer  *url-http-temp*> "gnu.org" 443)
  network-stream-open-tls("gnu.org" #<buffer  *url-http-temp*> "gnu.org" 443 (:type tls :nowait nil))
  open-network-stream("gnu.org" #<buffer  *url-http-temp*> "gnu.org" 443 :type tls :nowait nil)
  byte-code("\306\211\n\307>\203$

问题:如何使 HTTPS 在 Emacs 中通过袜子工作?我的版本是 24.2.50/W32

据我所知,出于某种原因,open-network-stream使用了原件socks-open-network-stream。我尝试url-open-stream使用edebug设置断点,但无法理解为什么不触发断点。有任何想法吗?

谢谢。

4

5 回答 5

1

GamerH2o - 我从来没有

proxychains emacs & 

去工作。对我来说,我必须做

proxychains bash-script.sh &

其中 bash-script.sh 是一个脚本

#!/bin/bash
/path/to/emacs --debug-init --geometry 83X40 --no-splash & ;;
exit 0

启动 emacs。我的实际脚本比上面的要复杂一些,因为我包含了各种选项,但这是一般的想法。我现在可以将 w3m 或 eww 用作“emacs 互联网浏览器”。我通过 dns 服务器的通道在 xterm 中回显。(我使用的是 tor 而不是“免费的匿名服务器”。)

于 2015-04-17T17:05:27.987 回答
1

另一种方法是使用程序proxychains从命令行启动 emacs,proxychains支持 HTTP socks4 和 socks5 代理协议。代码可能是:

proxychains emacs &

不用说,您必须在 proxychains 而不是 emacs 中配置您的代理设置。

PS:不要忘记quiet_mode在其配置文件(/etc/proxychains.conf)中设置代理链,否则冗长的输出可能会让您烦恼。至少在 Fedora 上它不是默认设置。

于 2014-01-27T00:47:32.297 回答
1

这是 Emacs 26.3 以上url-http功能上的 bug,签名url-http如下:

(defun url-http (url callback cbargs &optional retry-buffer gateway-method) ...)

可选gateway-method参数尝试覆盖url-gateway-method但编码错误:

(connection (url-http-find-free-connection 
                (url-host url)
                (url-port url)
                gateway-method))

这样做的正确方法:

(connection (url-http-find-free-connection 
                 (url-host url)
                 (url-port url)
                 (or gateway-method url-gateway-method)))

在 Emacs 24 版本中,url-gateway-method局部变量已硬编码为'tls

(defmacro url-https-create-secure-wrapper (method args)
  `(defun ,(intern (format (if method "url-https-%s" "url-https") method)) ,args
    ,(format "HTTPS wrapper around `%s' call." (or method "url-http"))
    (let ((url-gateway-method 'tls))
      (,(intern (format (if method "url-http-%s" "url-http") method))
       ,@(remove '&rest (remove '&optional args))))))

Emacs 版本 >= 25 的修复:

(defadvice url-http (around url-http-around activate disable)
        "Fix the `url-gateway-method' bug in `url-http'."
        (if (eq 'socks url-gateway-method)
            (let ((gateway-method url-gateway-method))
              ad-do-it)
          ad-do-it))

Emacs 版本 < 25 的修复:

(defvar *url-gateway-method* nil
  "Alias of `url-gateway-method' used to fix the bug in `url-http'.")

(defadvice url-http (around url-http-around compile)
  "Fix the `url-gateway-method' bug in `url-https'."
  (let ((url-gateway-method (if (eq *url-gateway-method* 'socks)
                                'socks
                              'tls)))
    ad-do-it))

最后,您可以在此处查看修复:https ://github.com/junjiemars/.emacs.d/blob/cc/config/sockets.el 。

于 2020-02-07T11:47:39.097 回答
0

它在 emacs 当前版本中修复(检查 25.2.2)

于 2018-05-22T15:15:29.433 回答
0

创建 ~/.emacs.d/w3m.sh:

#!/bin/bash

proxychains /usr/bin/w3m "$@"

自定义 w3m:

(setq w3m-command "~/.emacs.d/w3m.sh")

然后只有 w3m 使用代理。

于 2016-12-15T04:37:38.800 回答