2017-05-17 38 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