public void SendHeaders()
{
if (HeadersSent)
throw new InvalidOperationException("Header have already been sent.");
_headersSent = true;
if (_headers["Date"] == null)
_headers["Date"] = DateTime.Now.ToString("r");
if (_headers["Content-Length"] == null)
_headers["Content-Length"] = _contentLength == 0 ? Body.Length.ToString() : _contentLength.ToString();
if (_headers["Content-Type"] == null)
_headers["Content-Type"] = ContentType;
if (_headers["Server"] == null)
_headers["Server"] = "CSharp WebServer";
if (Connection == ConnectionType.KeepAlive)
{
_headers["Keep-Alive"] = "timeout=" + _keepAlive + ", max=" + _keepAlive*20;
_headers["Connection"] = "keep-alive";
}
else
_headers["Connection"] = "close";
if (Body.Length != 0)
{
if (_headers["Content-Type"] == null)
_headers["Content-Type"] = _contentType ?? DefaultContentType;
}
StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0} {1} {2}\r\n", _httpVersion, (int) Status,
string.IsNullOrEmpty(Reason) ? Status.ToString() : Reason);
for (int i = 0; i < _headers.Count; ++i)
{
string headerName = _headers.AllKeys[i];
string[] values =_headers.GetValues(i);
if (values == null) continue;
foreach (string value in values)
sb.AppendFormat("{0}: {1}\r\n", headerName, value);
}
foreach (ResponseCookie cookie in Cookies)
sb.AppendFormat("Set-Cookie: {0}\r\n", cookie);
sb.Append("\r\n");
_context.Send(Encoding.GetBytes(sb.ToString()));
}