using System;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
namespace OSHttpServer
{
///
/// Contains a connection to a browser/client.
///
public interface IHttpClientContext
{
///
/// Get SSL commonName of remote peer
///
string SSLCommonName { get; }
IPEndPoint LocalIPEndPoint {get; set;}
///
/// Using SSL or other encryption method.
///
bool IsSecured { get; }
int contextID {get;}
int TimeoutKeepAlive {get; set; }
int MaxRequests{get; set; }
bool CanSend();
bool IsSending();
bool IsClosing {get ;}
///
/// Disconnect from client
///
/// error to report in the event.
void Disconnect(SocketError error);
///
/// Send a response.
///
/// Either or
/// HTTP status code
/// reason for the status code.
/// HTML body contents, can be null or empty.
/// A content type to return the body as, i.e. 'text/html' or 'text/plain', defaults to 'text/html' if null or empty
/// If is invalid.
void Respond(string httpVersion, HttpStatusCode statusCode, string reason, string body, string contentType);
///
/// Send a response.
///
/// Either or
/// HTTP status code
/// reason for the status code.
void Respond(string httpVersion, HttpStatusCode statusCode, string reason);
///
/// send a whole buffer
///
/// buffer to send
///
bool Send(byte[] buffer);
///
/// Send data using the stream
///
/// Contains data to send
/// Start position in buffer
/// number of bytes to send
///
///
bool Send(byte[] buffer, int offset, int size);
Task SendAsync(byte[] buffer, int offset, int size);
///
/// Closes the streams and disposes of the unmanaged resources
///
void Close();
///
/// The context have been disconnected.
///
///
/// Event can be used to clean up a context, or to reuse it.
///
event EventHandler Disconnected;
///
/// A request have been received in the context.
///
event EventHandler RequestReceived;
HTTPNetworkContext GiveMeTheNetworkStreamIKnowWhatImDoing();
void StartSendResponse(HttpResponse response);
void ContinueSendResponse(bool notThrottled);
Task EndSendResponse(uint requestID, ConnectionType connection);
bool TrySendResponse(int limit);
}
public class HTTPNetworkContext
{
public NetworkStream Stream;
public Socket Socket;
}
///
/// A have been disconnected.
///
public class DisconnectedEventArgs : EventArgs
{
///
/// Gets reason to why client disconnected.
///
public SocketError Error { get; private set; }
///
/// Initializes a new instance of the class.
///
/// Reason to disconnection.
public DisconnectedEventArgs(SocketError error)
{
Error = error;
}
}
///
///
///
public class RequestEventArgs : EventArgs
{
///
/// Gets received request.
///
public IHttpRequest Request { get; private set; }
///
/// Initializes a new instance of the class.
///
/// The request.
public RequestEventArgs(IHttpRequest request)
{
Request = request;
}
}
}