【问题标题】:Why is the germinal library not shadowing configuration?为什么生发库不隐藏配置?
【发布时间】:2021-12-27 23:27:47
【问题描述】:

在添加功能之前,我正在为germinal 编写一些特征测试。为此,我更喜欢使用let 表单和临时影子配置而不是 setq 它。

但是,对于某些配置,这并不像我预期的那样工作。 *germinal-host*可以被shadow,但是证书配置*germinal-cert*不能:

CL-USER> (let ((germinal:*germinal-cert* "/foo/bar"))
           (print germinal:*germinal-cert*)
           (germinal:start :background nil))

"/foo/bar" ;; Germinal listening on 0.0.0.0 port 1965
gemini-handler error: SSL initialization error: Can't load certificate /etc/germinal/cert.pem
SSL error queue is empty.

我是否错过了在测试期间配置生发客户端的正确方法?我可以全局 setq 我想要的值,但我希望配置仅在测试期间被覆盖,因此使用 let

【问题讨论】:

  • 好吧,我想我明白了。所有配置特殊变量都被隐藏起来 - 例如,*germinal-host**germinal-cert*。但是,前一个“有效”的原因是它在它被隐藏的上下文中使用 - 在服务器创建时。但是,usocket 使用自己的上下文 - 不是隐藏特殊变量的上下文 - 来处理连接。

标签: common-lisp gemini-protocol


【解决方案1】:

感谢smart folks on the usocket-devel mailing list,我得到了答案:重组生发服务器以添加一个返回闭包的辅助函数,关闭阴影变量。无论哪个线程调用它,这个闭包都有正确的变量值:

(defun make-gemini-handler (cert cert-key root-path)
  "Create a Gemini request handler for a specified root path, TLS certificate, and TLS key."
  (lambda (stream) (gemini-handler stream cert cert-key root-path)))

这是从主线程调用的,如下所示:

  (with-global-context (*germinal-tls-context* :auto-free-p (not background))
    (usocket:socket-server host port (make-gemini-handler *germinal-cert* *germinal-cert-key* *germinal-root*) ()
               :multi-threading t
               :element-type '(unsigned-byte 8)
               :in-new-thread background)))

【讨论】:

    猜你喜欢
    • 2014-08-28
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多