Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Common Lisp中读取HTTP cookie?_Http_Cookies_Lisp_Cgi_Common Lisp - Fatal编程技术网

如何在Common Lisp中读取HTTP 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

我想用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 &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服务器运行单独的进程。