OutSystemsで任意のCookieを設定するAPI SetCookieがHttpRequestHandler Extensionで提供されています。
公式ドキュメントだけでは、どんなCookieが発行されるかわからないので、実際に発行して確認してみました。あわせて、Integration Studioでソースも見ていきます。
動作確認環境
Platform Version:11.0.212.0
Service Studio Version:11.0.530.0
Table of Contents
実際に設定されるCookie
まずは、Cookieの名前と値だけを設定するパターン
この設定をした場合、SetCookieによって設定されるResponse Headerのset-cookieは、以下の通り。
渡していないpathが設定されています。この値はテストに使ったモジュール名ですね。デフォルトでもジュール名が設定されるということですね。
また、secureやhttponlyはついていませんね。実際、開発者ツールで確認すると、HTTP通信でも送信され、JavaScriptで設定されたCookieを操作できます。これらの設定項目については、ActionのInput Parameterにもないため、このAPIでは設定できません。
CookieExpirationSpanとCookiePathも設定するパターン
上の例に加えてCookieExpirationSpan(分単位の整数)とCookiePathを指定しました。
この呼び出しをしたときのResponse Headerのset-cookie
Set-Cookie: Name1=dummy2; expires=Sat, 20-Jul-2019 17:23:21 GMT; path=/
設定した値が入っていますね。expiresは、実行時間+CookieExpirationSpan分を計算し、タイムゾーンを調整した値が入っています(GMTに変換されている)。
上の例でいうと、日本時間の16時台に処理を実行し、600分(10時間)のCookieExpirationSpanを設定したので02時。JSTからGMTに変換して(-9時間)17時になっています。
ソースコードをチェック
確認手順
HttpRequestHanlderはExtensionの形式で提供されているため、Integration Studioを介することで、C#コードによる実装を確認できます。
Service Studio内で参照したHttpRequestHandlerを右クリックし、Open ‘HttpRequestHandler’ Extensionを選択するとIntegration Studioが開きます。
次に環境に接続してツールバー右端のアイコン「Edit Source Code .NET」をクリックするとVisual Studioが立ち上がり、ソースを確認できます。
ソースコード(関数の実装部分)
HttpContext oHttpContext = HttpContext.Current; HttpCookie oCookie = new HttpCookie(ssCookieName, ssCookieValue); if (ssCookiePath.Length != 0) { oCookie.Path = ssCookiePath; } else { oCookie.Path = "/" + AppInfo.GetAppInfo().eSpaceName + "/" + AppInfo.GetAppInfo().PtaPath; } if (ssCookieDomain.Length != 0) { oCookie.Domain = ssCookieDomain; } if (ssCookieExpirationSpan > 0) { DateTime dt = DateTime.Now; TimeSpan ts = new TimeSpan(0, 0, ssCookieExpirationSpan, 0); oCookie.Expires = dt.Add(ts); } &tab;oHttpContext.Response.SetCookie(oCookie);
ソースコードのコメント
まず、Cookieは.NET FrameworkのSystem.Web.HttpCookieを使って設定しているようですね。従って、Actionのパラメータにない値は、このクラスのでデフォルト値が使用されるはずです。
次に、CookiePathに何も設定していないとき、以下のコードによって/モジュール名/と言う形式が強制されていることがわかります。つまり、未設定にしても空白にならないわけですね。
“/” + AppInfo.GetAppInfo().eSpaceName + “/” + AppInfo.GetAppInfo().PtaPath;
AppInfoはOutSystemsのライブラリが提供している、アプリケーションに関係する情報を格納するクラスのようです。PtaPathが何を指しているのかは情報が見つかりませんでしたが、私がPEでテストしたときは、この部分は空白文字列でした。
ExpiresはDateTime.Nowで現在時刻を取得して、パラメータで渡した分数だけ後の値をとるシンプルな実装です。
全体にシンプルなコードなので、もしSecureやHttpOnlyを設定できるActionが欲しければ、このコードを自分で作ったExtensionにコピーして改変すれば簡単にできそう。