public static void QueryUpdateServer(UpdateInfo[] updateInfos, UpdateLevel level, Action <UpdateResult> callback) { if (updateInfos == null || updateInfos.Length == 0) { string error = GettextCatalog.GetString("No updatable products detected"); callback(new UpdateResult(null, level, error, null)); return; } var query = new StringBuilder(DesktopService.GetUpdaterUrl()); query.Append("?v="); query.Append(formatVersion); foreach (var info in updateInfos) { query.AppendFormat("&{0}={1}", info.AppId, info.VersionId); } if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("MONODEVELOP_UPDATER_TEST"))) { level = UpdateLevel.Test; } if (level != UpdateLevel.Stable) { query.Append("&level="); query.Append(level.ToString().ToLower()); } bool hasEnv = false; foreach (string flag in DesktopService.GetUpdaterEnvironmentFlags()) { if (!hasEnv) { hasEnv = true; query.Append("&env="); query.Append(flag); } else { query.Append(","); query.Append(flag); } } var requestUrl = query.ToString(); var request = (HttpWebRequest)WebRequest.Create(requestUrl); LoggingService.LogDebug("Checking for updates: {0}", requestUrl); //FIXME: use IfModifiedSince, with a cached value //request.IfModifiedSince = somevalue; request.BeginGetResponse(delegate(IAsyncResult ar) { ReceivedResponse(request, ar, level, callback); }, null); }