将棋プログラミング

(将棋に関する)ソフトウェア開発のノウハウ等。

MFC のプログラム名が日本語の場合の HTTP 通信のトラブル

数年前に起きたトラブルである。
以前は、プログラム名に日本語は使わなかったが、もう日本語を使ってもいいだろうと思い、プログラム名に日本語を使った。
実行 PC の OS が Windows 7 の場合、問題が無かったが、OS が Windows 10 にアップデイトされたところ、サーバとの通信に時々問題が起きるようになった。
時々、HTTP ステータス 503 (Service Unavailable) が返るようになった。

調べた結果、HTTP ヘッダの User-Agent: に日本語のプログラム名が自動で設定され、それが原因だとわかった。
この場合も、サーバによって動作は異なる。また、今回のサーバも問題が無い時と問題が起きる場合があった。

Visual Studio 2005, 2010, 2013 で、この問題が起きることを確認した。

MFC の HTTP 通信では、CHttpConnection や CHttpFile を使う。
次のように、HTTP ヘッダの User-Agent: に、ASCII のプログラム名を設定することで、トラブルは解決した。

CHttpFile* pFile = (省略)
TCHAR	headers[512];
_stprintf_s(headers, 512, _T("Accept: text/*\r\nUser-Agent: %s \r\nContent-Type: text/plain; charset=Shift_JIS\r\n"), 
    _T("ASCII Program Name"));
pFile->AddRequestHeaders(headers);