我正在尝试访问 https 端点以使用 common-lisp(sbcl) 拉回一些数据。有一段时间,这没有问题。然后有一天我开始收到以下错误
SSL error queue:
error:0A000152:SSL routines::unsafe legacy renegotiation disabled
[Condition of type CL+SSL::SSL-ERROR-SSL]
Run Code Online (Sandbox Code Playgroud)
我尝试过使用 drakma 和 dexador,但两者都出现相同的错误。我已通过 openssl 确认我尝试连接的服务器不支持重新协商。
从openssl s_client -connect
New, TLSv1/SSLv3, Cipher is AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Run Code Online (Sandbox Code Playgroud)
我使用的是 OSX,我的开放 ssl 版本是 LibreSSL 2.8.3。
因此,据我了解,我的客户端正在尝试启动重新协商,但服务器拒绝了它。我真的不知道从这里到哪里去,此时我什至不确定问题真正处于哪个级别,openSSL、CL+SSL 还是构建在 CL+SSL 之上的 http 客户端库。有没有办法禁用重新协商或强制建立新连接?我缺少一些设置吗?
我正在构建一个程序,使用Bing的搜索API和常见的lisp与Drakma库来显示一些结果但由于某种原因在发送更长的查询时出错.它根本不显示任何结果.它适用于较短长度的查询.我正在使用临时帐户来解决这个问题.我有以下代码.
(defun get-rid-of-spaces (var)
(cl-ppcre:regex-replace-all " " var "%20"))
(defun print-bing (search-term)
(format nil "https://api.datamarket.azure.com/Bing/Search/v1/Web?Query=%27~a%27&Options=%27DisableLocationDetection%27&$format=json&$top=1" (get-rid-of-spaces search-term)))
(defun drakma-bing (search-term)
(drakma:http-request (print-bing search-term)
:basic-authorization
'("bob.hammerston@mailinator.com" "L2gbaj+s1/KW/+ifAa9HrP0C1/kClpF4InH48Lw8UNc")))
(defun convert-to-string (response)
(map 'string #'code-char response))
Run Code Online (Sandbox Code Playgroud)
然后我称之为,但它只适用于短搜索术语,我无法弄清楚原因.这不起作用:
(convert-to-string (drakma-bing "what is the largest man in the world"))
Run Code Online (Sandbox Code Playgroud)
但这样做
(convert-to-string (drakma-bing "what is"))
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?
谢谢.
编辑:
我尝试手动编码print-bing函数,而不是使用带有更长字符串的函数,但它仍然不起作用,因此Drakma必定存在错误.我尝试手动将域名输入到Web浏览器中,这样就可以了,这就是为什么我认为错误与Drakma有关.
我有一个包含转义网址的字符串:
http%3A%2F%2Fexample.com%3Ffoo%3Dbar+baz
Run Code Online (Sandbox Code Playgroud)
我正在尝试将其解码为以下内容:
http://example.com?foo=bar+baz
Run Code Online (Sandbox Code Playgroud)
但是,我找不到Drakma导出的任何合适的功能.我可以带像这样的代码:
* url-string
"http://example.com?foo=bar+baz"
* (drakma:url-encode url-string :utf-8)
"http%3A%2F%2Fexample.com%3Ffoo%3Dbar%2Bbaz"
Run Code Online (Sandbox Code Playgroud)
......所以我认为我走在正确的轨道上.如果有人能提供正确方向的推动我会很感激:-)我正在使用SBCL 1.0.54,它是从64位Linux Mint 13上的源代码构建的.
如果它有助于澄清我正在尝试做什么,在Ruby中,我会做以下事情:
> uri_string = "http%3A%2F%2Fexample.com%3Ffoo%3Dbar+baz"
=> "http%3A%2F%2Fexample.com%3Ffoo%3Dbar+baz"
> URI.decode uri_string
=> "http://example.com?foo=bar+baz"
Run Code Online (Sandbox Code Playgroud)