private HttpWebResponse CreateMockedHttpWebResponse(int statusCode, string content, string[] headerNames, string[] headerValues) { byte[] contentBytes = Encoding.UTF8.GetBytes(content); Stream responseStream = new MemoryStream(); responseStream.Write(contentBytes, 0, contentBytes.Length); responseStream.Seek(0, SeekOrigin.Begin); WebHeaderCollection h = new WebHeaderCollection(); if (headerNames != null) { for (int i = 0; i < headerNames.Length; i++) { h.Add(headerNames[i], headerValues[i]); } } HttpWebResponse oNewResponse = (System.Net.HttpWebResponse)System.Activator.CreateInstance(typeof(HttpWebResponse)); System.Reflection.PropertyInfo oInfo = oNewResponse.GetType().GetProperty("ResponseStream", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy); oInfo?.SetValue(oNewResponse, responseStream); System.Reflection.FieldInfo oFInfo = oNewResponse.GetType().GetField("m_HttpResponseHeaders", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy); oFInfo?.SetValue(oNewResponse, h); oFInfo = oNewResponse.GetType().GetField("m_StatusCode", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy); oFInfo?.SetValue(oNewResponse, statusCode); return(oNewResponse); }
private static void SetStatusCode(HttpWebResponse webResponce, int sttausCode) { var statusCodeProp = webResponce.GetType() .GetField("m_StatusCode", BindingFlags.NonPublic | BindingFlags.Instance); statusCodeProp.SetValue(webResponce, sttausCode); }
public static void Abort(HttpWebRequest request) { if (request == null) { throw new ArgumentNullException("request"); } System.Reflection.FieldInfo m_response = request.GetType().GetField("m_response", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); request.Abort(); HttpWebResponse stream = (m_response != null ? (HttpWebResponse)m_response.GetValue(request) : null); if (stream != null) { //HACK: This is necessary to avoid the stream to be fully downloaded on pocketpc. //Why Abort does not do this? System.Reflection.FieldInfo field = stream.GetType().GetField("m_remainingContent", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (field != null) { field.SetValue(stream, (long)0); field = null; } //--- } Thread.Sleep(500); }
private static void logResponse(HttpWebResponse response) { var responseStream = response.GetResponseStream(); if (responseStream != null) { Stream streamReplace = new MemoryStream(); responseStream.CopyTo(streamReplace); streamReplace.Seek(0, SeekOrigin.Begin); var length = streamReplace.Length; var buffer = new byte[length]; var read = 0; do { var readed = streamReplace.Read(buffer, 0, (int)length); read += readed; } while (read < length); _logger.Trace($"Charset {response.CharacterSet}"); var text = response.CharacterSet != null && response.CharacterSet.ToLower().Contains("1251") ? Encoding.GetEncoding(1251).GetString(buffer) : Encoding.GetEncoding("UTF-8").GetString(buffer); // var text = ""; streamReplace.Seek(0, SeekOrigin.Begin); var fieldInfo = response .GetType() .GetField( "m_ConnectStream", BindingFlags.Instance | BindingFlags.NonPublic ); if (fieldInfo != null) { fieldInfo.SetValue(response, streamReplace); } var httpWebResponse = response; response.Headers["Set-Cookie"] = "--HIDDEN FOR SECURITY REASONS--"; _logger.Trace( $"\r\n\r\nRECEIVED HTTP RESPONSE\r\nHTTP/{httpWebResponse.ProtocolVersion} {(int) httpWebResponse.StatusCode} {httpWebResponse.StatusDescription}\r\n" + response.Headers + "\r\n\r\n" + text); } }
void Download() { HttpWebResponse response = null; try { //var fs = new FileStream(_savefile, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); var fs = new FileStream(_savefile, FileMode.Open, FileAccess.Read, FileShare.Read); fs.Position = position; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(textBox1.Text); request.Method = "GET"; if (position != 0) { request.AddRange((int)position); } response = (HttpWebResponse)request.GetResponse(); if (position != 0) { if (response.StatusCode == HttpStatusCode.OK) { MessageBox.Show("服务器不支持断点续传,将重新开始下载"); position = 0; fs.Position = 0; } else if (response.StatusCode != HttpStatusCode.PartialContent) { response.GetType().GetMethod("Abort", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(response, null); MessageBox.Show("下载请求失败,请检查地址是否错误"); DataManager.SetControlText(button1, "开始"); return; } } else if (response.StatusCode != HttpStatusCode.OK) { response.GetType().GetMethod("Abort", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(response, null); MessageBox.Show("下载请求失败,请检查地址是否错误"); DataManager.SetControlText(button1, "开始"); return; } using (Stream responseStream = response.GetResponseStream()) { CopyStream(responseStream, fs); response.GetType().GetMethod("Abort", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(response, null); } } catch (WebException ex) { var errResp = ex.Response as HttpWebResponse; using (var stream = errResp.GetResponseStream()) { string message = null; using (var sr = new StreamReader(stream)) { message = sr.ReadToEnd(); var match = Regex.Match(message, "(?is)(?<=<Text[^>]*>).*(?=</Text>)"); if (match.Success) { message = match.Value; } } MessageBox.Show(message); } } catch (Exception e1) { MessageBox.Show(e1.Message); } }
/// <summary> /// 自分自身のアップデートが存在するか確認 /// </summary> public static void checkMyUpdate(bool viewCurrentNewVersion) { System.Text.Encoding enc = System.Text.Encoding.GetEncoding("UTF-8"); string url = "http://trickster.anoncom.net/versions.xml"; string param = @"name=TSLoginManager&version=" + Application.ProductVersion.ToString(); if (SettingController.Update.checkBetaVersion) { param += @"&check=beta"; } else { param += @"&check=release"; } HttpWebRequest req; HttpWebResponse res = null; #region ネットワーク接続を試みる int inetFlg; while (!TricksterTools.Library.WinInet.InternetGetConnectedState(out inetFlg, 0)) { SimpleLogger.WriteLine("Could not connect network."); DialogResult dgRes = MessageBox.Show("ネットワークに接続されていないため、処理を続行できません。", global::TSLoginManager.Properties.Settings.Default.AppName, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (dgRes == DialogResult.Cancel) { return; } } #endregion url += "?" + param; // リクエストの作成 try { req = (HttpWebRequest)HttpWebRequest.Create(url); req.Method = "GET"; req.UserAgent = LoginController.__USER_AGENT__; req.Headers.Add("Accept-Language", "ja"); //req.KeepAlive = true; req.AllowAutoRedirect = true; req.Timeout = 60 * 1000; // タイムアウト1分 //SimpleLogger.WriteLine("[Request]"); SimpleLogger.WriteLine("[ Request ] ---------------------------------------"); SimpleLogger.WriteLine("URL: " + url); SimpleLogger.WriteLine("Method: " + req.Method); SimpleLogger.WriteLine(req.Headers.ToString()); SimpleLogger.WriteLine("----------------------------------------------------"); // レスポンスの取得と読み込み res = (System.Net.HttpWebResponse)req.GetResponse(); //Stream resStream = res.GetResponseStream(); HttpWebResponse deb_res; deb_res = (System.Net.HttpWebResponse)req.GetResponse(); //SimpleLogger.WriteLine("[Response]\nURL: " + url + Environment.NewLine + deb_res.Headers.ToString()); SimpleLogger.WriteLine("[ Response ] ---------------------------------------"); SimpleLogger.WriteLine(deb_res.Headers.ToString()); SimpleLogger.WriteLine(""); Stream deb_st = deb_res.GetResponseStream(); StreamReader deb_sr = new StreamReader(deb_st, enc); SimpleLogger.WriteLine(deb_sr.ReadToEnd().Replace("\n", Environment.NewLine)); SimpleLogger.WriteLine("----------------------------------------------------"); SimpleLogger.WriteLine(""); deb_sr.Close(); deb_st.Close(); if (res.StatusCode == System.Net.HttpStatusCode.OK) { //System.Text.Encoding enc = System.Text.Encoding.GetEncoding("Shift_JIS"); System.Xml.XmlReaderSettings xmlrdset = new System.Xml.XmlReaderSettings(); xmlrdset.IgnoreWhitespace = true; xmlrdset.IgnoreComments = true; System.Xml.XmlReader reader = System.Xml.XmlReader.Create(url, xmlrdset); System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(XmlVersionsRoot)); XmlVersionsRoot XmlVerRoot = (XmlVersionsRoot)serializer.Deserialize(reader); if (XmlVerRoot.Status.Trim() == "Error") { // メッセージボックスによる通知 MessageBox.Show("バージョンチェックエラー", "TSLoginManager", MessageBoxButtons.OK, MessageBoxIcon.Error); // バルーンチップによる通知 Program.frm.notifyIcon.BalloonTipIcon = ToolTipIcon.Error; Program.frm.notifyIcon.BalloonTipTitle = "TSLoginManager"; Program.frm.notifyIcon.BalloonTipText = "バージョンチェック時エラー"; Program.frm.notifyIcon.ShowBalloonTip(30 * 1000); // 表示タイムアウト(30秒) return; } XmlVersionInfo info = (XmlVersionInfo)XmlVerRoot.Information; if (XmlVerRoot.Status.Trim() == "OK") { if (viewCurrentNewVersion) { // メッセージボックスによる通知 //MessageBox.Show("使用中のバージョンは最新版です。", "TSLoginManager", MessageBoxButtons.OK, MessageBoxIcon.Information); // バルーンチップによる通知 Program.frm.notifyIcon.BalloonTipIcon = ToolTipIcon.Info; Program.frm.notifyIcon.BalloonTipTitle = "TSLoginManager"; Program.frm.notifyIcon.BalloonTipText = "使用中のバージョンは最新版です。"; Program.frm.notifyIcon.ShowBalloonTip(30 * 1000); // 表示タイムアウト(30秒) Program.frm.notifyIcon.BalloonTipClicked += delegate { return; }; } } else if (XmlVerRoot.Status.Trim() == "Update") { string currentVersion = "ver. " + Application.ProductVersion.ToString(); string newVersion = "ver. " + info.Version; if (SettingController.Update.checkBetaVersion && XmlVerRoot.Information.isBeta) { newVersion += "β"; } string message = (info.Message.Trim() == "") ? "" : "\n" + info.Message; /* * // メッセージボックスによる通知 * DialogResult dres = MessageBox.Show("最新版が公開されています。" + Environment.NewLine + * "ダウンロードしますか?" + Environment.NewLine + Environment.NewLine + * currentVersion + " → " + newVersion + message, "TSLoginManager", MessageBoxButtons.YesNo, MessageBoxIcon.Question); * if (dres == DialogResult.Yes) * { * System.Diagnostics.Process.Start("http://trickster.anoncom.net/tools/TSLoginManager.html"); * } */ // バルーンチップによる通知 Program.frm.notifyIcon.BalloonTipIcon = ToolTipIcon.Info; Program.frm.notifyIcon.BalloonTipTitle = "TSLoginManager"; Program.frm.notifyIcon.BalloonTipText = "最新版が公開されています。" + Environment.NewLine + "ダウンロードするにはここをクリックしてください。" + Environment.NewLine + Environment.NewLine + currentVersion + " → " + newVersion + Environment.NewLine + message; Program.frm.notifyIcon.BalloonTipClicked += delegate { System.Diagnostics.Process.Start("http://trickster.anoncom.net/tools/TSLoginManager.html"); }; Program.frm.notifyIcon.ShowBalloonTip(30 * 1000); // 表示タイムアウト(30秒) } else { // メッセージボックスによる通知 //MessageBox.Show("最新版確認時にエラーを取得しました。", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // バルーンチップによる通知 Program.frm.notifyIcon.BalloonTipIcon = ToolTipIcon.Error; Program.frm.notifyIcon.BalloonTipTitle = "TSLoginManager"; Program.frm.notifyIcon.BalloonTipText = "最新版確認時にエラーを取得しました。"; Program.frm.notifyIcon.ShowBalloonTip(30 * 1000); // 表示タイムアウト(30秒) Program.frm.notifyIcon.BalloonTipClicked += delegate { return; }; } } else { // メッセージボックスによる通知 MessageBox.Show("通信に失敗しました。しばらくたってから再度操作してください。" + Environment.NewLine + "このエラーが長時間、継続的に表示される場合はお問い合わせください。", "TSLoginManager", MessageBoxButtons.OK, MessageBoxIcon.Error); } res.Close(); } catch (WebException we) { //MessageBox.Show(e.Message.ToString(), "WebException", MessageBoxButtons.OK, MessageBoxIcon.Hand); SimpleLogger.WriteLine(we.Message.ToString()); if (we.Status == WebExceptionStatus.Timeout) { MessageBox.Show("通信がタイムアウトしました。しばらくたってから再度操作してください。" + Environment.NewLine + "このエラーが長時間、継続的に表示される場合はお問い合わせください。", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { MessageBox.Show("通信に失敗しました。しばらくたってから再度操作してください。" + Environment.NewLine + "このエラーが長時間、継続的に表示される場合はお問い合わせください。", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } return; } catch (FileLoadException fle) { SimpleLogger.WriteLine(fle.Message.ToString()); MessageBox.Show("バージョン情報の取得に失敗しました。" + Environment.NewLine + "コード:101", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (System.Xml.XmlException xe) { SimpleLogger.WriteLine(xe.Message.ToString()); MessageBox.Show("バージョン情報の取得に失敗しました。" + Environment.NewLine + "コード:102", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (System.InvalidOperationException ioe) { SimpleLogger.WriteLine(ioe.Message.ToString()); MessageBox.Show("バージョン情報の取得に失敗しました。" + Environment.NewLine + "コード:103"); } catch (Exception e) { SimpleLogger.WriteLine(e.Message.ToString()); //MessageBox.Show("例外エラー" + Environment.NewLine + "コード:500"); throw e; } finally { if (res != null && res.GetType() == typeof(HttpWebResponse)) { try { res.Close(); } catch { } } } }