예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
 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);
         }
     }
 }
예제 #5
0
 internal void HandlePostRequest(SimpleHttpProcessor processor, StreamReader contentStream)
 {
     HandlePost?.Invoke(processor, contentStream);
 }
예제 #6
0
 internal void HandleGetRequest(SimpleHttpProcessor processor)
 {
     HandleGet?.Invoke(processor);
 }