如何使用drakma

时间:2015-08-04 12:07:43

标签: common-lisp sbcl drakma

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)))))

尝试确实存在一些严重缺陷:

  • 该方法的运行时间不能超过给定的超时时间
  • 使用带有超时的hack从while-true循环返回并将restart-case混淆以获得适当的返回值只是感觉不对
  • 对字符串进行char-by-char读取会导致CPU出现大量负载(而不是等待完成加载然后进行批量读取)

如何正确读取drakma流直到某个超时(或EOF)然后返回读入的字符串?

0 个答案:

没有答案