我想在Common Lisp中制作一个单独的CGI程序,它读取一个cookie。如何在Common Lisp中读取HTTP cookie?
很明显,我认为我可以通过发送HTTP标头中发送的cookie。然而,我想知道如何通过CGI程序从正在访问该程序的客户端读取服务器上的cookie。
我想在Common Lisp中制作一个单独的CGI程序,它读取一个cookie。如何在Common Lisp中读取HTTP cookie?
很明显,我认为我可以通过发送HTTP标头中发送的cookie。然而,我想知道如何通过CGI程序从正在访问该程序的客户端读取服务器上的cookie。
的CGI机构通过使用HTTP_COOKIE
环境变量该cookie。 ANSI Common Lisp没有任何API来访问POSIX和Windows系统环境变量。特定于实现的功能或实现的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)
貌似[Osicat](https://www.common-lisp.net/project/osicat/manual/osicat.html#Environment)具有'(环境变量名)'对POSIX系统,含。视窗。很高兴看到裸露的骨头代码。 – Ehvince
也可能值得一提的是cl-cookbook的更新,维护和可编辑的副本? https://lispcookbook.github.io/cl-cookbook/os.html – Ehvince
另一个原因是这一个:http://cl-cookbook.sourceforge.net/os.html,他们说这样的例子已经过时,而且缺乏实现。现在'uiop:getenv'附带asdf。 – Ehvince
基于卡兹答案,我们需要得到一个环境变量。但我不会指的是CL-食谱[1],现在我们有这个解决方案自带的ASDF:
(uiop:getenv)
另外,Osicat库(操作系统,文件和目录)具有(environment-variable name)
对于POSIX系统,含。视窗。
[1] SourceForge上的CL-食谱是旧的和过时的有时。在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
很快部署为什么不直接使用Web框架之一,例如唠叨? – Andrei
Clack很复杂,为什么它更复杂? –
用户编写代码的一部分将不那么复杂。如果你正在设置网络服务器程序的交互,你可能会设置一个压缩,我想。但我不知道你的设置,所以我可能在这里猜错了。 – Andrei