AndroidのHttpURLConnectionのデフォルトのUserAgent
HttpURLConnectionで実装していた部分をHttpClientに変えてみたら、UserAgentが変わってしまいました。
そこでHttpClientのリクエストにHttpURLConnectionのデフォルトのUserAgentをセットしてやろう思ったのですが、それがなかなか見つからなかったのでメモっときます。
HttpURLConnectionでUserAgentをセットせずに通信すると、
Dalvik/1.4.0 (Linux; U; Android 2.3.6; Nexus S Build/GRK39F)
な文字列が入ってリクエストが送られます。
WebViewのデフォルトのUserAgentは、WebSettings#getUserAgentString()で取得できて
Mozilla/5.0 (Linux; U; Android 2.3.6; zh-tw; Nexus S Build/GRK39F)
みたいなのがもらえるんですが、似てるけどちょっと違う。
ちなみにWebSettingsでは
private synchronized String getCurrentUserAgent() { Locale locale; synchronized(sLockForLocaleSettings) { locale = sLocale; } StringBuffer buffer = new StringBuffer(); // Add version final String version = Build.VERSION.RELEASE; if (version.length() > 0) { buffer.append(version); } else { // default to "1.0" buffer.append("1.0"); } buffer.append("; "); final String language = locale.getLanguage(); if (language != null) { buffer.append(language.toLowerCase()); final String country = locale.getCountry(); if (country != null) { buffer.append("-"); buffer.append(country.toLowerCase()); } } else { // default to "en" buffer.append("en"); } // add the model for the release build if ("REL".equals(Build.VERSION.CODENAME)) { final String model = Build.MODEL; if (model.length() > 0) { buffer.append("; "); buffer.append(model); } } final String id = Build.ID; if (id.length() > 0) { buffer.append(" Build/"); buffer.append(id); } final String base = mContext.getResources().getText( com.android.internal.R.string.web_user_agent).toString(); return String.format(base, buffer); }
な感じで頑張って文字列を作ってるので、HttpURLConnectionのUserAgentもどっかで作ってるんだろうと思ってソースコードを追っていたのですが、どうもAndroidの方では作ってないようです。
そこでSystemの情報をあさっていたところ、
System.getProperty("http.agent");
の値が
Dalvik/1.4.0 (Linux; U; Android 2.3.6; Nexus S Build/GRK39F)
と出ました。
何かそれっぽいですね。
URLクラスのURLStreamHandlerがこの辺の値を取りに行ってるのでしょうか。
時間があればもうちょっと追ってみたいところですが、とりあえずそれっぽいの取れたんでよしとします。