如何在Common Lisp中读取HTTP cookie?
我想用CommonLisp编写一个CGI程序,它可以读取cookie如何在Common Lisp中读取HTTP cookie?,http,cookies,lisp,cgi,common-lisp,Http,Cookies,Lisp,Cgi,Common Lisp,我想用CommonLisp编写一个CGI程序,它可以读取cookie 我很清楚,我可以通过发送HTTP头来发送Cookie。但是,我想知道如何通过CGI程序从访问程序的客户端读取服务器上的cookie。CGI机制使用HTTP\u cookie环境变量传递cookie。ANSI Common Lisp没有任何用于访问POSIX和Windows系统环境变量的API。特定于实现的函数或实现的FFI用于实现C的等价物getenv 报告建议: * (defun my-getenv (name &o
我很清楚,我可以通过发送HTTP头来发送Cookie。但是,我想知道如何通过CGI程序从访问程序的客户端读取服务器上的cookie。CGI机制使用
HTTP\u cookie
环境变量传递cookie。ANSI Common Lisp没有任何用于访问POSIX和Windows系统环境变量的API。特定于实现的函数或实现的FFI用于实现C的等价物getenv
报告建议:
* (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)
CGI机制使用
HTTP\u cookie
环境变量传递cookie。ANSI Common Lisp没有任何用于访问POSIX和Windows系统环境变量的API。特定于实现的函数或实现的FFI用于实现C的等价物getenv
报告建议:
* (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)
基于Kaz答案,我们需要得到一个环境变量。但我不会参考cl食谱[1],现在我们有了asdf附带的解决方案:
(uiop:getenv)
此外,库(操作系统、文件和目录)具有适用于posix系统(包括windows)的(环境变量名)
[1] 关于sourceforge的cl食谱很旧,有时甚至过时。github上有一个副本,维护(好的,有一点)并可编辑:()
编辑:github上的cookbook已经并且应该很快部署到基于Kaz的回答,我们需要获得一个环境变量。但我不会参考cl食谱[1],现在我们有了asdf附带的解决方案:
(uiop:getenv)
此外,库(操作系统、文件和目录)具有适用于posix系统(包括windows)的(环境变量名)
[1] 关于sourceforge的cl食谱很旧,有时甚至过时。github上有一个副本,维护(好的,有一点)并可编辑:()
编辑:github上的cookbook已经并且应该很快部署在上,看起来像是针对posix系统(包括windows)的
(环境变量名)
。很高兴看到这些代码。也许还值得参考更新的、维护的和可编辑的cl食谱?另一个原因是:他们说这个例子已经过时,缺乏实现。现在,asdf附带了uiop:getenv
。@Ehvince这些实现最近是否改变了它们公开获取环境变量的方式?我看不出两个版本的my getenv
之间有什么区别。我怀疑:)我想他只是添加了实现。看起来像是为posix系统(包括windows)添加了(环境变量名)
。很高兴看到这些代码。也许还值得参考更新的、维护的和可编辑的cl食谱?另一个原因是:他们说这个例子已经过时,缺乏实现。现在,asdf附带了uiop:getenv
。@Ehvince这些实现最近是否改变了它们公开获取环境变量的方式?我看不出我的getenv
的两个版本之间有什么区别。我对此表示怀疑:)我想他只是添加了一些实现。更不用说可能有一个用于CGI编程的库,您可以在其中执行(获取cookie)
或其他任何操作。请注意,我发布的我的getenv
也是一个示例(一项功能)库,如uiop
和Osicat
。要获取环境变量,这三个库都必须在某个级别上执行相同的操作:在lispworks上调用lispworks:environment variable
,在Allegro上调用sys:getenv
,等等。你是对的,看到低级别真的很好。尽管有时我喜欢一行:)更不用说可能在某个地方有一个CGI编程库,您只需执行(获取cookie)
或其他操作。请注意,我发布的my getenv
也是一个(单函数)库,如uiop
和Osicat
。要获得一个环境变量,这三个变量都必须在某个级别上执行相同的操作:在lispworks上调用lispworks:environment variable
,在Allegro上调用sys:getenv
,等等。你说得对,看到低级别真是太好了。我有时喜欢一行:)为什么不简单地使用一个web框架,例如Clack?Clack很复杂,为什么要使它更复杂?代码中用户编写的部分将不那么复杂。如果您正在设置web服务器cgi程序交互,我认为您最好设置clack。但是我不知道你的设置,所以我可能猜错了。再想想,从用户的角度来看,这个任务可能更复杂。您确实需要为您的web服务器运行一个单独的进程。为什么不简单地使用其中一个web框架,例如Clack?Clack很复杂,为什么要使它更复杂?用户编写的代码部分将不那么复杂。如果您正在设置web服务器cgi程序交互,我认为您最好设置clack。但是我不知道你的设置,所以我可能猜错了。再想想,从用户的角度来看,这个任务可能更复杂。您确实需要为web服务器运行单独的进程。