2017-05-17 7 views
1

Common Lispで単一のCGIプログラムを作って、クッキーを読んでみたいです。Common LispでHTTPクッキーを読むには?

HTTPヘッダーを送信してCookieを送信できることは明らかです。しかし、CGIプログラムを通じて、プログラムにアクセスしているクライアントからサーバー上のクッキーを読み取る方法を知りたいと思います。

+0

にすぐに展開する必要がありますクラック? – Andrei

+0

クラックは複雑で、なぜそれをもっと複雑にするのですか? –

+0

コードのユーザー記述部分はあまり複雑ではありません。そして、あなたがウェブサーバー<->のcgiプログラムのやりとりを設定しているならば、クラックを設定することもできます。しかし、私はあなたの設定を知らないので、私はここで間違っていると推測しているかもしれません。 – Andrei

答えて

2

CGIメカニズムは、HTTP_COOKIE環境変数を使用してCookieを渡します。 ANSI Common Lispには、POSIXおよびWindowsのシステム環境変数にアクセスするためのAPIはありません。実装固有の関数、または実装の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

もう1つの理由はこれです:http://cl-cookbook.sourceforge.net/os.html彼らはこの例が古く、実装が欠けていると言っています。今すぐ 'uiop:getenv'にはasdfが付いています。 – Ehvince

3

、私たちは、環境変数を取得する必要があります。また

(uiop:getenv) 

Osicatライブラリ(OS、ファイルとディレクトリ)POSIXシステムのための(environment-variable name)があり、税込:しかし、私は、CL-クックブック[1]、今私たちは航空自衛隊が付属しています。このソリューションを持っているを参照しています。窓。

[1] sourceforgeのcl-cookbookは古く、時には時代遅れです。 githubにコピーがあり、維持管理されており、編集可能です:https://lispcookbook.github.io/cl-cookbook/os.htmlhttps://github.com/LispCookbook/cl-cookbook/)。

編集:githubの上の料理がedited accordinglyされていて、単に、例えば、ウェブフレームワークの1つを使用しないのはなぜhttps://lispcookbook.github.io/cl-cookbook/os.html

+0

言うまでもなく、 'get-cookie'などの最初の場所には、おそらくCGIプログラミングのライブラリがあります。 – Kaz

+0

私が投稿した 'my-getenv'も' uiop'や 'Osicat'のような(1つの関数)ライブラリです。環境変数を取得するには、Lispworksでは 'lispworks:environment-variable'、Allegroでは' sys:getenv'など、あるレベルで同じことをする必要があります。 – Kaz

+0

あなたは正しいですし、低レベルを見て本当にうれしいです。私は時にはライナーが好きです:) – Ehvince