我想在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