雨谷の日和

過去20年で2,700を超えるアニメの第1話だけは見続けた僕のお勧めアニメがハズレなはずがない

人狼BBS作成日記63

CookieのVALUEの文法を考えてみます。
あ、その前にNAMEを何にするかを決めておかないといけませんね。まあ、ここは手堅く「jinro」で良いでしょう。

jinro=[key]:[value],[key]:[value],〜,[key]:[value]

上記のように、VALUEの部分にkey とvalue を複数埋め込む感じにしようと思っています。
key とvalue は「:」で区切り、それぞれの対は「,」で区切ることにします。注意点としては、key にもvalue にも「:」「,」はもちろん「=」「;」といった文字を含めてはいけないということでしょうか。
(本当は「=」は微妙ですが。入っていても良いのかも)
まあ、Cookie に格納するデータはCGI側でコントロールすることになるので、特殊文字を含めないように気をつける事は可能だと思っています。(悪意あるCookie の書き換えにどう対処するかは別問題)


さて、そうするとCookie の読み込みのサブルーチンは以下のようになるかと思います。

sub STDIN_COOKIE {
  $cookies = $ENV{'HTTP_COOKIE'};
  @pairs = split(/;/, $cookies);
  foreach $pair (@pairs) {
    local($name, $value) = split(/=/, $pair);
    $name =~ s/\s//g;
    $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
    $tmp{ $name } = $value;
  }
  @pairs = split(/,/, $tmp{'jinro'});
  foreach $pair (@pairs) {
    local($name, $value) = split(/:/, $pair);
    &jcode'convert(*value,'euc');
    $Cookie_Tbl{ $name } = $value;
  }
}

まず、Cookie の文字列を「;」で区切り、それぞれのトークンを更に「=」で区切ってNAMEとVALUEを取り出します。取り出したNAME と VALUE のセットはとりあえずtmp という連想配列に入れておきます。このとき、VALUE についてはURL Encoding されているはずなので、Decode してから格納します。
次に、NAME が「jinro」であるVALUE だけを取り出し、それを「,」で区切ってpairs という配列に格納します。最後にそれぞれのpairs についてそれを「:」で区切り、key と value に分けてCookie_Tbl という連想配列に格納します。このとき、value については文字コードEUCに変換しておきます。


以上の処理で、Cookie にセットされているデータを取り出すことが出来るようになります。
次は、Cookie にデータをセットする方法を見ることにしたいと思っています。