aliyun-net-sdk-dybaseapi/Dybaseapi/MNS/Runtime/Internal/Transform/HttpWebRequestResponseData.cs (88 lines of code) (raw):

using System; using System.Collections.Generic; using System.IO; using System.Net; namespace Aliyun.Acs.Dybaseapi.MNS.Runtime.Internal.Transform { public class HttpWebRequestResponseData : IWebResponseData { HttpWebResponse _response; string[] _headerNames; HashSet<string> _headerNamesSet; HttpWebResponseBody _responseBody; public HttpWebRequestResponseData(HttpWebResponse response) { this._response = response; _responseBody = new HttpWebResponseBody(response); this.StatusCode = response.StatusCode; this.IsSuccessStatusCode = this.StatusCode >= HttpStatusCode.OK && this.StatusCode <= (HttpStatusCode)299; this.ContentType = response.ContentType; this.ContentLength = response.ContentLength; } public HttpStatusCode StatusCode { get; private set; } public bool IsSuccessStatusCode { get; private set; } public string ContentType { get; private set; } public long ContentLength { get; private set; } public bool IsHeaderPresent(string headerName) { if (_headerNamesSet == null) SetHeaderNames(); return _headerNamesSet.Contains(headerName); } public string[] GetHeaderNames() { if (_headerNames == null) { SetHeaderNames(); } return _headerNames; } public string GetHeaderValue(string name) { return this._response.GetResponseHeader(name); } private void SetHeaderNames() { var keys = this._response.Headers.Keys; _headerNames = new string[keys.Count]; for (int i = 0; i < keys.Count; i++) _headerNames[i] = keys[i]; _headerNamesSet = new HashSet<string>(_headerNames, StringComparer.OrdinalIgnoreCase); } public IHttpResponseBody ResponseBody { get { return _responseBody; } } } public class HttpWebResponseBody : IHttpResponseBody { HttpWebResponse _response; bool _disposed = false; public HttpWebResponseBody(HttpWebResponse response) { _response = response; } public Stream OpenResponse() { if (_disposed) throw new ObjectDisposedException("HttpWebResponseBody"); return _response.GetResponseStream(); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (_disposed) return; if (disposing) { if (_response != null) _response.Close(); _disposed = true; } } } }