Drakma目前不支持timeouts for SBCL,但我需要一个超时,它会将传输的内容返回到超时发生的时间点。
这是我目前的工作尝试,但可能非常适合thedailywtf而不是生产代码:
(defun perform-request (url parameters method)
(let ((string nil))
(restart-case
(sb-ext:with-timeout 20
(let ((stream (drakma:http-request url
:method method
:parameters parameters
:want-stream T)))
(unwind-protect
(do ((char (read-char stream nil nil)
(read-char stream nil nil)))
(nil nil)
(when char
(push char string)))
(close stream))))
(ignore ()
"")
(default ()
(coerce (reverse string) 'string)))))
尝试确实存在一些严重缺陷:
restart-case
混淆以获得适当的返回值只是感觉不对如何正确读取drakma流直到某个超时(或EOF)然后返回读入的字符串?