using System;
using System.IO;
using System.Net;
using System.Text;
namespace OSHttpServer
{
///
/// Response that is sent back to the web browser / client.
///
/// A response can be sent if different ways. The easiest one is
/// to just fill the Body stream with content, everything else
/// will then be taken care of by the framework. The default content-type
/// is text/html, you should change it if you send anything else.
///
/// The second and slighty more complex way is to send the response
/// as parts. Start with sending the header using the SendHeaders method and
/// then you can send the body using SendBody method, but do not forget
/// to set ContentType and ContentLength before doing so.
///
///
/// public void MyHandler(IHttpRequest request, IHttpResponse response)
/// {
///
/// }
///
public interface IHttpResponse
{
///
/// The body stream is used to cache the body contents
/// before sending everything to the client. It's the simplest
/// way to serve documents.
///
///
Stream Body { get; }
byte[] RawBuffer { get; set; }
int RawBufferStart { get; set; }
int RawBufferLen { get; set; }
uint requestID { get; }
double RequestTS { get;}
///
/// Defines the version of the HTTP Response for applications where it's required
/// for this to be forced.
///
string ProtocolVersion { get; set; }
int Priority { get; set; }
///
/// The chunked encoding modifies the body of a message in order to
/// transfer it as a series of chunks, each with its own size indicator,
/// followed by an OPTIONAL trailer containing entity-header fields. This
/// allows dynamically produced content to be transferred along with the
/// information necessary for the recipient to verify that it has
/// received the full message.
///
bool Chunked { get; set; }
///
/// Kind of connection
///
ConnectionType Connection { get; set; }
///
/// Encoding to use when sending stuff to the client.
///
/// Default is UTF8
Encoding Encoding { get; set; }
///
/// Number of seconds to keep connection alive
///
/// Only used if Connection property is set to ConnectionType.KeepAlive
int KeepAlive { get; set; }
///
/// Status code that is sent to the client.
///
/// Default is HttpStatusCode.Ok
HttpStatusCode Status { get; set; }
///
/// Information about why a specific status code was used.
///
string Reason { get; set; }
///
/// Size of the body. MUST be specified before sending the header,
/// unless property Chunked is set to true.
///
long ContentLength { get; set; }
///
/// Kind of content in the body
///
/// Default is text/html
string ContentType { get; set; }
///
/// Headers have been sent to the client-
///
/// You can not send any additional headers if they have already been sent.
bool HeadersSent { get; }
///
/// The whole response have been sent.
///
bool Sent { get; }
///
/// Cookies that should be created/changed.
///
ResponseCookies Cookies { get; }
///
/// Set response as a http redirect
///
/// redirection target url
/// the response Status, must be Found, Redirect, Moved,MovedPermanently,RedirectKeepVerb, RedirectMethod, TemporaryRedirect. Defaults to Redirect
void Redirect(string url, HttpStatusCode redirStatusCode = HttpStatusCode.Redirect);
///
/// Add another header to the document.
///
/// Name of the header, case sensitive, use lower cases.
/// Header values can span over multiple lines as long as each line starts with a white space. New line chars should be \r\n
/// If headers already been sent.
/// If value conditions have not been met.
/// Adding any header will override the default ones and those specified by properties.
void AddHeader(string name, string value);
///
/// Send headers and body to the browser.
///
/// If content have already been sent.
void Send();
}
///
/// Type of HTTP connection
///
public enum ConnectionType
{
///
/// Connection is closed after each request-response
///
Close,
///
/// Connection is kept alive for X seconds (unless another request have been made)
///
KeepAlive
}
}