VirtualResponse
The virtual response class.
using AngleSharp.Extensions;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
namespace AngleSharp.Network
{
public class VirtualResponse : IResponse, IDisposable
{
private Url address;
private HttpStatusCode status;
private Dictionary<string, string> headers;
private Stream content;
private bool dispose;
Url IResponse.Address {
get {
return address;
}
}
Stream IResponse.Content {
get {
return content;
}
}
IDictionary<string, string> IResponse.Headers {
get {
return headers;
}
}
HttpStatusCode IResponse.StatusCode {
get {
return status;
}
}
private VirtualResponse()
{
address = Url.Create("http://localhost/");
status = HttpStatusCode.OK;
headers = new Dictionary<string, string>();
content = Stream.Null;
dispose = false;
}
public static IResponse Create(Action<VirtualResponse> request)
{
VirtualResponse virtualResponse = new VirtualResponse();
request(virtualResponse);
return virtualResponse;
}
public VirtualResponse Address(Url url)
{
address = url;
return this;
}
public VirtualResponse Address(string address)
{
return Address(Url.Create(address ?? string.Empty));
}
public VirtualResponse Address(Uri url)
{
return Address(Url.Convert(url));
}
public VirtualResponse Status(HttpStatusCode code)
{
status = code;
return this;
}
public VirtualResponse Status(int code)
{
return Status((HttpStatusCode)code);
}
public VirtualResponse Header(string name, string value)
{
headers[name] = value;
return this;
}
public VirtualResponse Headers(object obj)
{
Dictionary<string, string> dictionary = obj.ToDictionary();
return Headers(dictionary);
}
public VirtualResponse Headers(IDictionary<string, string> headers)
{
foreach (KeyValuePair<string, string> header in headers) {
Header(header.Key, header.Value);
}
return this;
}
public VirtualResponse Content(string text)
{
Release();
byte[] bytes = TextEncoding.Utf8.GetBytes(text);
content = new MemoryStream(bytes);
dispose = true;
return this;
}
public VirtualResponse Content(Stream stream, bool shouldDispose = false)
{
Release();
content = stream;
dispose = shouldDispose;
return this;
}
private void Release()
{
if (content != null && dispose)
content.Dispose();
dispose = false;
content = null;
}
void IDisposable.Dispose()
{
Release();
}
}
}