2017-05-17 40 views
1

我想在Common Lisp中制作一个单独的CGI程序,它读取一个cookie。如何在Common Lisp中读取HTTP cookie?

很明显,我认为我可以通过发送HTTP标头中发送的cookie。然而,我想知道如何通过CGI程序从正在访问该程序的客户端读取服务器上的cookie。

+0

很快部署为什么不直接使用Web框架之一,例如唠叨? – Andrei

+0

Clack很复杂,为什么它更复杂? –

+0

用户编写代码的一部分将不那么复杂。如果你正在设置网络服务器程序的交互,你可能会设置一个压缩,我想。但我不知道你的设置,所以我可能在这里猜错了。 – Andrei

回答

2

的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) 
+0

貌似[Osicat](https://www.common-lisp.net/project/osicat/manual/osicat.html#Environment)具有'(环境变量名)'对POSIX系统,含。视窗。很高兴看到裸露的骨头代码。 – Ehvince

+0

也可能值得一提的是cl-cookbook的更新,维护和可编辑的副本? https://lispcookbook.github.io/cl-cookbook/os.html – Ehvince

+1

另一个原因是这一个:http://cl-cookbook.sourceforge.net/os.html,他们说这样的例子已经过时,而且缺乏实现。现在'uiop:getenv'附带asdf。 – Ehvince

3

基于卡兹答案,我们需要得到一个环境变量。但我不会指的是CL-食谱[1],现在我们有这个解决方案自带的ASDF:

(uiop:getenv) 

另外,Osicat库(操作系统,文件和目录)具有(environment-variable name)对于POSIX系统,含。视窗。

[1] SourceForge上的CL-食谱是旧的和过时的有时。在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

+0

更不用说,可能在某处有一个用于CGI编程的库,首先你只需要执行'(get-cookie)'或其他什么。 – Kaz

+0

请注意,我发布的my-getenv也是一个函数库,比如'uiop'和'Osicat'。为了得到一个环境变量,所有三者都必须在某个层次上做同样的事情:在Lispworks上调用'lispworks:environment-variable',在Allegro上调用'sys:getenv'等等。 – Kaz

+0

你是对的,看到低水平真的很高兴。有时候我喜欢单线球员:) – Ehvince