wsug
1
emacs30.1 url-retrieve 突然获取不到内容了,换其它elisp内置的方法如url-insert-file-contents,也一样什么都取不到,也找不到没有任何报错信息,问AI也得不到有用信息。
同样的url,在浏览器里正常打开,curl是正常的,elisp里调用curl也正常,命令行运行php file_get_contents也一点问题都没有,总之就是elisp外都是正常的,就elisp内置方法不行。这种情况通常会把elisp内置url库换掉。 如果是第三方服务器那没办法只能换,但服务器端是我自己写的也还换就感觉不对了,于是继续找原因。
尝试了所有能想出的办法都无效,正准备放弃时却发现了问题所在。url 我是这样写的 (url-insert-file-contents "http://10.0.2.1:89?auth=1&p=1")
,这样写在elisp之外的地方都正常,但elisp要写成 (url-insert-file-contents "http://10.0.2.1:89/?auth=1&p=1")
get参数前必须要加一个/号。
不清楚这是bug还是elisp就是这么设计的,这个问题确实花费了我很多时间,我估计很多使用elisp url库的人也遇到过(然后不想浪费时间就不用elisp内置url库了)
wsug
3
我问了chatgpt, 告诉我 http://10.0.1.1:89?auth=1&p=1
在 URL 标准(RFC 3986)中是合法的,没有问题,所以就是bug了。不会抓包。
有意思的是chatgpt告诉我如果不确定是否bug就去emacs-china
问,看有没有其它人遇到这个问题,所以又被AI拉回本站了
(url-insert-file-contents “http://127.0.0.1:9999?test=1”)
GET ?test=1 HTTP/1.1
MIME-Version: 1.0
Connection: keep-alive
Host: 127.0.0.1:9999
Accept-encoding: gzip
Accept: */*
User-Agent: URL/Emacs Emacs/31.0.50 (TTY; x86_64-suse-linux-gnu)
应该是/?test=1
(url-insert-file-contents “http://127.0.0.1:9999”)
GET / HTTP/1.1
MIME-Version: 1.0
Connection: keep-alive
Host: 127.0.0.1:9999
Accept-encoding: gzip
Accept: */*
User-Agent: URL/Emacs Emacs/31.0.50 (TTY; x86_64-suse-linux-gnu)
这个正确
GET /?test=1 HTTP/1.1
Host: 172.17.81.3:9999
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko/20100101 Firefox/138.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Priority: u=0, i
Pragma: no-cache
Cache-Control: no-cache
这是ff请求的
wsug
5
感谢提供,我发了一卦邮件到gnu报bug,应该是这里 bug-gnu-emacs (date) ,我对问题的描述可能不符合报bug的规范,也希望有其它大佬把这个bug报过去,争取能得到解决
主动写路径更准确,更符合实际情况,你不写也是当成 / 路径处理的,HTTP 不允许没有路径的情况:
(图片来自 What is a URL? - Learn web development | MDN )
比如从 Chrome 地址栏复制链接时,Chrome 总是会自动加 /,比如复制 Google 首页得到 https://www.google.com/ ,而不是更加美观的 https://www.google.com 。
有些人偏好这样:
wsug
8
浏览器等很多工具有时会把/
隐藏不显示, 让我误以为/
是可有可无的, 没有想到/
是必须的.
HTTP URL 相关标准允许隐去不写的,但是不写会被 curl 等解释成 /,因为 HTTP 请求标准中路径是必须的。估计 Emacs 标准遵守的不够严格,没有考虑到。