如何在Common Lisp中读取HTTP cookie?

时间:2017-05-17 17:31:15

标签: http cookies lisp cgi common-lisp

我想在Common Lisp中创建一个读取cookie的CGI程序。

我很清楚我可以通过发送HTTP标头发送Cookie。然而,我想知道如何通过CGI程序从访问该程序的客户端读取服务器上的cookie。

2 个答案:

答案 0 :(得分:3)

基于Kaz的回答,我们需要获得一个环境变量。但是我没有参考cl-cookbook [1],现在我们有asdf附带的解决方案:

(uiop:getenv)

对于posix系统,Osicat库(os,文件和目录)也有(environment-variable name),包括。视窗。

[1] sourceforge上的cl-cookbook很旧,有时过时了。 github上有一个副本,维护(嗯,有点)和可编辑:https://lispcookbook.github.io/cl-cookbook/os.htmlhttps://github.com/LispCookbook/cl-cookbook/)。

修改:github上的食谱已经edited accordingly,应尽快部署在https://lispcookbook.github.io/cl-cookbook/os.html

答案 1 :(得分:2)

CGI机制使用HTTP_COOKIE环境变量传递cookie。 ANSI Common Lisp没有用于访问POSIX和Windows系统环境变量的API。特定于实现的功能,或者实现的FFI,用于实现C getenv的等效功能。

Common Lisp Cookbook暗示了这一点:

* (defun my-getenv (name &optional default)
    #+CMU
    (let ((x (assoc name ext:*environment-list*
                    :test #'string=)))
      (if x (cdr x) default))
    #-CMU
    (or
     #+Allegro (sys:getenv name)
     #+CLISP (ext:getenv name)
     #+ECL (si:getenv name)
     #+SBCL (sb-unix::posix-getenv name)
     #+LISPWORKS (lispworks:environment-variable name)
     default))
MY-GETENV
* (my-getenv "HOME")
"/home/edi"
* (my-getenv "HOM")
NIL
* (my-getenv "HOM" "huh?")
"huh?"

在使用之前,我会稍微修改一下:

(or #+CMU (let ((x ...)) (if ...))
    #+Allegro ...
    #+CLISP
    ...
    default)