private void Handler()
{
bool recvRequest = true;
string EOL = "\r\n";
string requestPayload = "";
string requestTempLine = "";
List<string> requestLines = new List<string>();
byte[] requestBuffer = new byte[1];
byte[] responseBuffer = new byte[1];
requestLines.Clear();
try
{
//State 0: Handle Request from Client
while (recvRequest)
{
this.clientSocket.Receive(requestBuffer);
string fromByte = ASCIIEncoding.ASCII.GetString(requestBuffer);
requestPayload += fromByte;
requestTempLine += fromByte;
if (requestTempLine.EndsWith(EOL))
{
requestLines.Add(requestTempLine.Trim());
requestTempLine = "";
}
if (requestPayload.EndsWith(EOL + EOL))
{
recvRequest = false;
}
}
//received http request
Console.WriteLine("Raw Request Received...");
Console.WriteLine(requestPayload);
//State 1:Segregation
//Nomal coap request
if (requestLines[0].Contains(portName) & !requestLines[0].Contains("?observehost"))
{
//get the URL
string remoteHost = requestLines[0].Split(' ')[1].Replace("http://", "coap://").Split(' ')[0];
Uri uri = new Uri(remoteHost);
//creat coap request
Request.Method method;
string requestMethod = requestLines[0].Substring(0, requestLines[0].IndexOf(' ')).ToLower();
if (requestMethod.Trim() == "get")
method = Request.Method.GET;
else if (requestMethod.Trim() == "post")
{
method = Request.Method.POST;
requestPayload += requestLines[requestLines.Count-1];
}
else if (requestMethod.Trim() == "put")
{
method = Request.Method.PUT;
requestPayload += requestLines[requestLines.Count - 1];
}
else if (requestMethod.Trim() == "delete")
method = Request.Method.DELETE;
else
method = Request.Method.GET;
//get the payLoad
Payload = requestPayload;
//Resource discovery request
if (remoteHost.Contains("index"))
{
remoteHost = remoteHost.Replace("index", ".well-known/core");
Uri discoverUri = new Uri(remoteHost);
Request request = PerformCoAP(Request.Method.GET, discoverUri, false, false);
Action<Request> discoverHandler = new Action<Request>(HandleDiscover);
discoverHandler.BeginInvoke(request, null, null);
}
//nomal CoAP request
else
{
Request requestOnce = PerformCoAP(method, uri, true, false);
}
}
//observe request
else if (requestLines[0].Contains(portName) & requestLines[0].Contains("?observehost"))
{
//get URL
string remoteHost = requestLines[0].Split(' ')[1].Replace("http://", "coap://").Split(' ')[0];
remoteHost = remoteHost.Replace("?observehost", "");
Uri discoverUri = new Uri(remoteHost);
PerformObserve(Request.Method.GET, discoverUri);
}
//Http Conncet request
else if (requestLines[0].ToLower().Contains("connect"))
{
string remoteHost = requestLines[0].Split(' ')[1].Replace("http://", "").Split('/')[0];
int port = Int32.Parse(remoteHost.Split(':')[1]);
remoteHost = remoteHost.Split(':')[0];
Socket destServerSocket = null;
//Conncet to real Server
try
{
destServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
destServerSocket.Connect(remoteHost, port);
}
catch (Exception e)
{
Console.WriteLine("Bad connect to real Server: " + e.Message);
}
// Conncet to real Server success
if (destServerSocket.Connected)
{
Console.WriteLine("Websocket connect success ");
//exchange message
ForwardTcpData(clientSocket, destServerSocket);
}
else
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
//nomal Http request
else
{
//State 1: Rebuilding Request Information and Create Connection to Destination Server
string remoteHost = requestLines[0].Split(' ')[1].Replace("http://", "").Split('/')[0];
string requestFile = requestLines[0].Replace("http://", "").Replace(remoteHost, "");
requestLines[0] = requestFile;
requestPayload = "";
foreach (string line in requestLines)
{
requestPayload += line;
requestPayload += EOL;
}
Socket destServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
destServerSocket.Connect(remoteHost, 80);
//State 2: Sending New Request Information to Destination Server and Relay Response to Client
destServerSocket.Send(ASCIIEncoding.ASCII.GetBytes(requestPayload));
//Console.WriteLine("Begin Receiving Response...");
while (destServerSocket.Receive(responseBuffer) != 0)
{
//Console.Write(ASCIIEncoding.ASCII.GetString(responseBuffer));
this.clientSocket.Send(responseBuffer);
}
destServerSocket.Disconnect(false);
destServerSocket.Dispose();
this.clientSocket.Disconnect(false);
this.clientSocket.Dispose();
}
}
catch (Exception e)
{
Console.WriteLine("Error Occured: " + e.Message);
//Console.WriteLine(e.StackTrace);
}
}
/// <summary>