我想在Common Lisp中创建一个读取cookie的CGI程序。
我很清楚我可以通过发送HTTP标头发送Cookie。然而,我想知道如何通过CGI程序从访问该程序的客户端读取服务器上的cookie。
答案 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.html(https://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)