「Windows8以降での@Browserinfo("Platform")の返り値の問題」に対処する

# 「Windows8以降での@Browserinfo("Platform")の返り値の問題」に対処する

## 概要
　[Windows 8 以降での @Browserinfo("Platform") の返り値の問題](http://www-01.ibm.com/support/docview.wss?uid=swg22008464)という技術情報が公開されました。

「問題報告番号 YSAIAQNAG7 として IBM Quality Engineering に報告されましたが、現在この問題の修正予定はありません」ということで、代替案を検討してみました。


## browser.cnfとは？
　ヘルプより抜粋。「IBM Domino のインストール時に」とありますが、IBM Notesクライアントにも入ってきます。IBM Dominoと同じようにデータディレクトリ（例：C:\notes\data）直下に存在します。

> browser.cnf ファイルは、IBM Domino のインストール時にサーバーデータディレクトリに自動的にインストールされます。このファイルには、IBM Domino Web アプリケーションのレンダリングに使用されるブラウザの設定が入っています。具体的には、@BrowserInfo がブラウザのプロパティを確認するため、このファイルを使用します。

　ブラウザのOSを返す部分は以下のようになっています。MacOSがMacOS一択であったり、OS2が存在するあたり時代を感じますね。

```browser.cnf抜粋
## Platform - String that indicates the OS platform of the browser.
## Notes client: Unknown
Property Platform String Unknown
    Rule     Win95      Win95
    Rule     Win95      Windows 95
    Rule     Win98      Win98
    Rule     Win98      Windows 98
    Rule     WinMe      Win 9.x 4.90
    Rule     WinNT      WinNT
    Rule     WinNT      Windows\-NT
    Rule     Win2000    Windows NT 5.0
    Rule     WinXP      Windows NT 5.1
    Rule     WinVista   Windows NT 6.0
    Rule     Win7       Windows NT 6.1
    Rule     WinNT      Windows NT
    Rule     MacOS      Macintosh
    Rule     MacOS      Mac_PowerPC
    Rule     OS2        OS/2
```

　ここにWin8以降の設定がないため、正しい値が返ってこないようです。


## 対策1：@GetHTTPHeaderを利用し、User-Agentヘッダを取得。その結果を元に判別

　@GetHTTPHeaderという@式を利用するとUser-Agentヘッダを取得可能です。User-AgentヘッダにはアクセスしてきたブラウザのOS情報が入ってくるため、この値をチェックすることで@Browserinfo("Platform")のような動きをする式を書くことができます。

「計算結果フィールド"OS"にアクセスしてきたブラウザのOSを返す」という想定で、このフィールドの値に埋め込む式は、たとえば次の通りです。

```@式:OSのバージョンを判別する@式
UserAgentHeader := @GetHTTPHeader("User-Agent");

OSLevelTemp := "";
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Win95"); "Windows 95"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Win98"); "Windows 98"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "WinMe"); "Win 9.x 4.90"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "WinNT"); "WinNT"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows-NT"); "Windows-NT"; "");

OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 5.1"); "Windows XP"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 5.2"); "Windows XP (64ビット)/Windows Server 2003"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 6.0"); "Windows Vista/Windows Server 2008"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 6.1"); "Windows 7/Windows Server 2008 R2"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 6.2"); "Windows 8/Windows Server 2012"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 6.3"); "Windows 8.1/Windows Server 2012 R2"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 10.0"); "Windows 10/Windows Server 2016"; "");

OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Macintosh"); "MacOS"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Mac_PowerPC"); "MacOS"; "");

OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "OS/2"); "OS2"; "");

OSLevelTemp := @If(OSLevelTemp = ""; "Unkwon"; OSLevelTemp);

OSLevel := OSLevelTemp;
OSLevel
```

　べた打ちが美しくないですが、ひとまずこのような感じで実現可能です。

　この@式の注意点として、以下あげられます。

- Notesクライアントのブラウザでは"Windows-NT"という値が返るため、User-Agentヘッダからは判定できないケースがある
- User-AgentヘッダからはWindows 7 か Windows Server 2008 R2の切り分けはできない？
- Macの振り分けはbrowser.cnfと同じようにしたが、User-Agentヘッダはもう少し細かく出るため、@式に追加すれば切り分けは可能
- Linuxも同様にUser-Agentヘッダからある程度の判別は可能

　なお、かつてGetURLHeaderInfoメソッドという、この@式と同じような挙動を示すNotesDatabaseオブジェクトのメソッドがあったようなのですが、リリース6以降無効になってしまったようです。残念…。


## 対策2：browser.cnfにWin8以降のエントリを追加

　自己責任でリスクを確認のうえ実施ということになりますが、browser.cnfにWin8以降の部分を記載（折角なので、Windows Server 2008についても追加）するエントリは次のようになります。

　※参考文献[^NI]よりUser-Agentヘッダの値を確認して記載。Windows NT 6.1以外の部分は実際に試せていないため、実装するのであれば要テスト。

```browser.cnf変更・追加部分
    Rule     Windows7/WindowsServer2008_R2      Windows NT 6.1
    Rule     Windows8/WindowsServer2012         Windows NT 6.2
    Rule     Windows8.1/WindowsServer2012_R2    Windows NT 6.3
    Rule     Windows10/WindowsServer2016        Windows NT 10.0
```

　"Rule"の次のエントリに空白を入れると、そこがデータの区切りと解釈されるため注意が必要です。

　@Browserinfo("Platform")もUser-Agentヘッダとこの部分の比較を行っているため、@式と同様にMacやLinuxの判別も可能そうですが、試せていません。

## 参考
[^NI]: [UserAgentからOS/ブラウザなどの調べかたのまとめ \- Qiita](https://qiita.com/nightyknite/items/b2590a69f2e0135756dc)
[^Wi_NT]: [Windows NT系 \- Wikipedia](https://ja.wikipedia.org/wiki/Windows_NT%E7%B3%BB)