private void ServerOnHandlePost(SimpleHttpProcessor httpProcessor, StreamReader streamReader) { var resourceName = httpProcessor.Url.Substring(1); var body = streamReader.ReadToEnd(); var formData = JsonConvert.DeserializeObject <JObject>(body).AsJEnumerable().Cast <JProperty>() .ToDictionary(data => data.Name, data => Convert.ToString(data.Value, CultureInfo.InvariantCulture)); var queryString = HttpUtility.ParseQueryString(httpProcessor.Query); var paramObjects = queryString.AllKeys .ToDictionary(key => key, key => queryString[key]); var session = GetSession(httpProcessor); var content = _resourceLoader.Post(session, resourceName, paramObjects, formData); if (content == null) { httpProcessor.WriteNotFound(); return; } httpProcessor.WriteSuccess(content.ContentType); if (content.IsBinary) { httpProcessor.WriteContent(content.Data); } else { httpProcessor.WriteContent(content.Text); } }
private void ServerOnHandleGet(SimpleHttpProcessor httpProcessor) { var session = GetSession(httpProcessor); var header = new Dictionary <string, string> { { "Cookie", "StonehengeSession=" + session.Id } }; if (httpProcessor.Url == "/") { httpProcessor.WriteRedirect("/Index.html?stonehenge-id=" + session.Id, header); return; } var resourceName = httpProcessor.Url.Substring(1); var parameters = new Dictionary <string, string>(); //TODO: extract parameters from URL var content = _resourceLoader.Get(session, resourceName, parameters); if (content == null) { httpProcessor.WriteNotFound(); return; } if (content.IsBinary) { header.Add("Content-Length", content.Data.Length.ToString()); httpProcessor.WriteSuccess(content.ContentType, header); httpProcessor.WriteContent(content.Data); } else { httpProcessor.WriteSuccess(content.ContentType, header); httpProcessor.WriteContent(content.Text); } }
private AppSession GetSession(SimpleHttpProcessor httpProcessor) { // get session string sessionId; AppSession session = null; var cookie = httpProcessor.Headers.FirstOrDefault(h => h.Key == "Cookie" && h.Value.Contains("StonehengeSession=")); if (!string.IsNullOrEmpty(cookie.Value)) { var extract = new Regex("StonehengeSession=([0-9a-fA-F]+)"); var match = extract.Match(cookie.Value); sessionId = match.Groups[1].Value; if (_sessionCache.ContainsKey(sessionId)) { session = _sessionCache[sessionId] as AppSession; } } if (session == null) { var referer = httpProcessor.Headers.FirstOrDefault(h => h.Key == "Referer" && h.Value.Contains("stonehenge-id=")); if (referer.Key != null) { var id = new Regex("stonehenge-id=([0-9a-f]+)").Match(referer.Value); if (id.Success) { sessionId = id.Groups[1].Value; if (_sessionCache.ContainsKey(sessionId)) { session = _sessionCache[sessionId] as AppSession; } } } } if (session == null) { session = new AppSession(); sessionId = session.Id; _sessionCache.Add(sessionId, session); } return(session); }
public void Listen() { _listenerSocket = new TcpListener(IPAddress.Any, Port); _listenerSocket.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); _listenerSocket.Start(); while (IsActive) { try { var socket = _listenerSocket.AcceptTcpClient(); var processor = new SimpleHttpProcessor(socket, this); var processThread = new Thread(processor.Process); processThread.Start(); Thread.Sleep(1); } catch (Exception ex) { Trace.TraceError(ex.Message); } } }
internal void HandlePostRequest(SimpleHttpProcessor processor, StreamReader contentStream) { HandlePost?.Invoke(processor, contentStream); }
internal void HandleGetRequest(SimpleHttpProcessor processor) { HandleGet?.Invoke(processor); }