using System;
using System.IO;
using System.Net;
using System.Web;
using System.Text;
namespace Library
{
// 例外処理もラップする?
public class HttpWrapper : IDisposable
{
// 20130527更新
HttpWebRequest httpReq = null;
HttpWebResponse httpRes = null;
CookieCollection cookies = new CookieCollection();
// Request Property
public string Accept { get; set; }
//public Uri Address { get; }
public bool AllowAutoRedirect { get; set; }
public bool AllowWriteStreamBuffering { get; set; }
// TODO: AuthenticationLevelプロパティを実装
public DecompressionMethods AutomaticDecompression { get; set; }
// TODO: CachePolicyプロパティを実装
// TODO: ClientCertificatesプロパティ実装
public string Connection { get; set; }
public string ConnectionGroupName { get; set; }
public int TimeOut { get; set; }
public string Proxy { get; set; }
public string Referer { get; set; }
public string UserAgent { get; set; }
// Response Property
/// <summary> 応答の文字セットを取得します。 </summary>
public string CharacterSet { get { return httpRes.CharacterSet;} }
/// <summary> 応答の本文をエンコードするために使用するメソッドを取得します。</summary>
public string ContentEncoding { get { return httpRes.ContentEncoding; } }
/// <summary> 要求で返されるコンテンツ長を取得します。 </summary>
public long ContentLength { get { return httpRes.ContentLength; } }
/// <summary> 応答のコンテンツ タイプを取得します。</summary>
public string ContentType{ get { return httpRes.ContentType; } }
/// <summary> この応答に関連付けられている Cookie を取得します。 </summary>
public CookieCollection Cookies { get { return httpRes.Cookies; } }
/// <summary> 応答に関連付けられているヘッダーをサーバーから取得します。</summary>
public WebHeaderCollection Header { get { return httpRes.Headers; } }
/// <summary> この応答がキャッシュから取得されたかどうかを示す Boolean 値を取得します。 </summary>
public bool IsFromChache { get { return httpRes.IsFromCache; } }
/// <summary> クライアントとサーバーの両方が認証されたかどうかを示す Boolean 値を取得します。</summary>
public bool IsMutuallyAuthenticated { get { return httpRes.IsMutuallyAuthenticated; } }
/// <summary> 応答の内容が最後に変更された日付と時刻を取得します。</summary>
public DateTime LastModified { get { return httpRes.LastModified; } }
/// <summary> 応答を返すために使用するメソッドを取得します。</summary>
public string Method { get { return httpRes.Method; } }
/// <summary> 応答で使用される HTTP プロトコルのバージョンを取得します。</summary>
public Version ProtocolVersion { get { return httpRes.ProtocolVersion; } }
/// <summary> 要求に応答したインターネット リソースの URI を取得します。 </summary>
public Uri ResponseUri { get { return httpRes.ResponseUri; } }
/// <summary> 応答を送信したサーバーの名前を取得します。</summary>
public string Server { get { return httpRes.Server; } }
/// <summary> 応答のステータスを取得します。</summary>
public HttpStatusCode StatusCode { get { return httpRes.StatusCode; } }
/// <summary> 応答で返されるステータス記述を取得します。 </summary>
public string StatusDescription { get { return httpRes.StatusDescription; } }
#region IDisposable Interface
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
if (disposing)
{
// マネージリソースの開放
}
// アンマネージリソースの開放
if (httpReq != null)
httpReq = null;
if (httpRes != null)
httpRes = null;
disposed = true;
}
#endregion
public HttpWrapper(string reqUrl)
{
try
{ httpReq = (HttpWebRequest)WebRequest.Create(reqUrl); }
catch (UriFormatException e)
{ throw new UriFormatException(e.ToString()); }
// メンバ変数を初期化
Accept = null;
TimeOut = 10000;
Proxy = String.Empty;
Referer = String.Empty;
UserAgent = String.Empty;
//httpReq.CookieContainer = new CookieContainer();
}
/// <summary>
/// リクエストにCookieを付加するメソッド
/// </summary>
/// <param name="cookieName">Cookieの変数名</param>
/// <param name="cookieValue">Cookieの値</param>
/// <param name="cookieDomain">Cookieのドメイン</param>
public void CookieAdd(string cookieName, string cookieValue, string cookieDomain)
{
Cookie tmpCookie = new Cookie(cookieName, cookieValue);
tmpCookie.Domain = cookieDomain;
// リクエストのCookieCollectionに追加
cookies.Add(tmpCookie);
}
public void CookieCollectionAdd(CookieCollection _cc)
{
cookies = _cc;
}
public string GetString(System.Text.Encoding encode)
{
string _src = String.Empty;
if (httpReq == null)
return null;
httpReq.Accept = Accept;
httpReq.Timeout = TimeOut;
httpReq.Referer = Referer;
httpReq.UserAgent = UserAgent;
// TODO:ここバグ出るかも
if (cookies != null)
{
httpReq.CookieContainer = new CookieContainer();
httpReq.CookieContainer.Add(cookies);
}
// Proxyが設定されている場合はProxyを使用
if (Proxy != String.Empty)
httpReq.Proxy = new WebProxy(Proxy);
try
{
httpRes = (HttpWebResponse)httpReq.GetResponse();
}
catch (WebException e)
{
throw new WebException(e.ToString());
}
// エラーの場合、詳細を例外に投げる
if (400 < (int)httpRes.StatusCode)
throw new WebException(httpRes.StatusDescription);
// エラーがない場合、最後まで読み出す
// IOException: 転送先からデータを読み取れません。リモートホストに強制的に切断されました
try
{
using (StreamReader sr = new StreamReader(httpRes.GetResponseStream(), encode))
_src = sr.ReadToEnd();
}
catch (IOException e)
{
System.Windows.Forms.MessageBox.Show(e.ToString());
}
return _src;
}
/// <summary> HTTPステータスコードを返すメソッド </summary>
/// <returns>HTTP ステータスコード</returns>
public int? GetStatusCode()
{
if (httpRes == null)
return null;
return (int)httpRes.StatusCode;
}
public Stream GetStream()
{
Stream _st = null;
if (httpReq == null)
return null;
httpReq.Accept = Accept;
httpReq.Timeout = TimeOut;
httpReq.Referer = Referer;
httpReq.UserAgent = UserAgent;
// TODO:ここバグ出るかも
if (cookies != null)
{
httpReq.CookieContainer = new CookieContainer();
httpReq.CookieContainer.Add(cookies);
}
if (Proxy != String.Empty)
httpReq.Proxy = new WebProxy(Proxy);
// レスポンスの取得
httpRes = (HttpWebResponse)httpReq.GetResponse();
// エラーの場合、詳細を例外に投げる
if (400 < (int)httpRes.StatusCode)
throw new WebException(httpRes.StatusDescription);
_st = httpRes.GetResponseStream();
return _st;
}
}
}