/// <summary> /// Processes incoming requests /// </summary> protected void ProcessRequest() { // accept an incoming connection request and once we have one, spawn a new thread to accept more bool newThread = false; System.Net.Sockets.Socket clientSocket = null; Responder responder = null; while (IsRunning && !newThread) { try { // process incoming request clientSocket = LocalServer.Accept(); clientSocket.ReceiveTimeout = Timeout; clientSocket.SendTimeout = Timeout; // parse message an create an object containing parsed data responder = new Responder(); responder.ClientEndpoint = clientSocket.RemoteEndPoint.ToString(); responder.ClientSocket = clientSocket; Debug.Print("Accepted connection from " + responder.ClientEndpoint); Thread t = new Thread(new ThreadStart(ProcessRequest)); t.Start(); newThread = true; } catch { if (clientSocket != null) { try { clientSocket.Close(); } catch { } } } } // now process the request try { bool finishedParsing = false; TimeSpan parseStart = Gadgeteer.Timer.GetMachineTime(); while (!finishedParsing) { if (Gadgeteer.Timer.GetMachineTime() - parseStart > MaxProcessingTime) return; if (clientSocket == null) return; // receiving data, add to an array to process later byte[] buffer = new byte[clientSocket.Available]; clientSocket.Receive(buffer); finishedParsing = responder.parse(buffer); } // trigger event to get response WebEvent webevent = null; if (responder.Path != null && responder.Path.Length > 1) { webevent = serverManager.GetWebEventById(responder.Path); } if (webevent == null) { webevent = serverManager.DefaultEvent; } responder.webEvent = webevent; webevent.OnWebEventReceived(responder.Path, responder.HttpMethod, responder); } catch { } }
/// <summary> /// Raises the <see cref="WebEventReceived"/> event. /// </summary> /// <param name="responder">Contains request data sent by the the client and functionality to respond to the request.</param> /// <param name="method">The incoming http method. </param> /// <param name="path">The path of the requested resource.</param> internal virtual void OnWebEventReceived(string path, WebServer.HttpMethod method, Responder responder) { if (onWebEventReceived == null) { onWebEventReceived = new ReceivedWebEventHandler(OnWebEventReceived); } if (_WebEventReceived == null || noHandlerSet) { responder.SendResponse(); } else if (Program.CheckAndInvoke(_WebEventReceived, onWebEventReceived, path, method, responder)) { _WebEventReceived(path, method, responder); } }
/// <summary> /// Raises the <see cref="WebEventReceived"/> event. /// </summary> /// <param name="responder">Contains request data sent by the the client and functionality to respond to the request.</param> /// <param name="method">The incoming http method. </param> /// <param name="path">The path of the requested resource.</param> internal virtual void OnWebEventReceived(string path, WebServer.HttpMethod method, Responder responder) { if (onWebEventReceived == null) onWebEventReceived = new ReceivedWebEventHandler(OnWebEventReceived); if (_WebEventReceived == null || noHandlerSet) { responder.SendResponse(); } else if (Program.CheckAndInvoke(_WebEventReceived, onWebEventReceived, path, method, responder)) { _WebEventReceived(path, method, responder); } }
/// <summary> /// Processes incoming requests /// </summary> protected void ProcessRequest() { // accept an incoming connection request and once we have one, spawn a new thread to accept more bool newThread = false; System.Net.Sockets.Socket clientSocket = null; Responder responder = null; while (IsRunning && !newThread) { try { // process incoming request clientSocket = LocalServer.Accept(); clientSocket.ReceiveTimeout = Timeout; clientSocket.SendTimeout = Timeout; // parse message an create an object containing parsed data responder = new Responder(); responder.ClientEndpoint = clientSocket.RemoteEndPoint.ToString(); responder.ClientSocket = clientSocket; Debug.Print("Accepted connection from " + responder.ClientEndpoint); Thread t = new Thread(new ThreadStart(ProcessRequest)); t.Start(); newThread = true; } catch { if (clientSocket != null) { try { clientSocket.Close(); } catch { } } } } // now process the request try { bool finishedParsing = false; TimeSpan parseStart = Gadgeteer.Timer.GetMachineTime(); while (!finishedParsing) { if (Gadgeteer.Timer.GetMachineTime() - parseStart > MaxProcessingTime) { return; } if (clientSocket == null) { return; } // receiving data, add to an array to process later byte[] buffer = new byte[clientSocket.Available]; clientSocket.Receive(buffer); finishedParsing = responder.parse(buffer); } // trigger event to get response WebEvent webevent = null; if (responder.Path != null && responder.Path.Length > 1) { webevent = serverManager.GetWebEventById(responder.Path); } if (webevent == null) { webevent = serverManager.DefaultEvent; } responder.webEvent = webevent; webevent.OnWebEventReceived(responder.Path, responder.HttpMethod, responder); } catch { } }
// secure reception of wifi credentials over wifi network - secured by receiving secret void CredentialsWebEventReceived(string path, WebServer.HttpMethod method, Responder responder) { if (responder.UrlParameters == null || !responder.UrlParameters.Contains("ssid") || !responder.UrlParameters.Contains("setupauthcode")) { responder.Respond("ERROR::Syntax: " + path + "?ssid=SSID&setupauthcode=SETUPAUTHCODE[&key=WIFIKEY]"); return; } if (((string)responder.UrlParameters["setupauthcode"]) != SetupAuthCode) { responder.Respond("ERROR::Incorrect setupauthcode"); return; } var ssid = responder.UrlParameters["ssid"] as string; if (ssid == null || ssid == "") { responder.Respond("ERROR::Invalid SSID"); return; } var key = ""; if (responder.UrlParameters.Contains("key")) { key = responder.UrlParameters["key"] as string; } Debug.Print("Received (via web event) credentials for network " + ssid); bool newcreds = ReceivedCredentials(ssid, key); if (newcreds) { responder.Respond("OK::Got new credentials"); SaveData(); Thread.Sleep(10); WebServer.StopLocalServer(); currentAP = null; SetLed(); SetScreen(); wifi.Interface.Disconnect(); } else { responder.Respond("OK::Already had those"); } }