WIP / Session Managment

master
Harald Wolff 2019-11-15 13:47:01 +01:00
parent 79b3eabde6
commit f2d95bc93d
7 changed files with 56 additions and 39 deletions

View File

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using ln.http.resources.session;
using ln.logging;
using ln.types.threads;
using ln.types;
@ -10,6 +9,7 @@ using ln.types.net;
using ln.http.cert;
using System.Globalization;
using System.Net.Sockets;
using ln.http.session;
namespace ln.http
@ -124,7 +124,7 @@ namespace ln.http
if (httpRequest == null)
break;
httpRequest.ApplySession(SessionCache);
httpRequest.MakeCurrent();
HttpApplication application = GetHttpApplication(new URI(httpRequest.BaseURI.ToString()));
@ -133,11 +133,17 @@ namespace ln.http
HttpResponse response = application.GetResponse(httpRequest);
keepAlive = httpRequest.GetRequestHeader("connection","keep-alive").Equals("keep-alive") && response.GetHeader("connection", "keep-alive").Equals("keep-alive");
response.SetHeader("connection", keepAlive ? "keep-alive" : "close");
connection.SendResponse(response);
if (response != null)
{
keepAlive = httpRequest.GetRequestHeader("connection", "keep-alive").Equals("keep-alive") && response.GetHeader("connection", "keep-alive").Equals("keep-alive");
response.SetHeader("connection", keepAlive ? "keep-alive" : "close");
connection.SendResponse(response);
}
else
{
keepAlive = false;
}
} while (keepAlive);
}
catch (Exception e)
@ -153,6 +159,8 @@ namespace ln.http
}
}
HttpRequest.ClearCurrent();
connection.GetStream().Close();
}

View File

@ -66,8 +66,6 @@ namespace ln.http
using (CurrentRequest = new HttpRequest(this.HTTPServer,httpReader, (IPEndPoint)TcpClient.Client.LocalEndPoint))
{
CurrentRequest.ApplySession(HTTPServer.SessionCache);
Interpreted = DateTime.Now;
try

View File

@ -1,6 +1,4 @@
using System;
using ln.http;
using ln.http.resources.session;
namespace ln.http
{
public abstract class HttpApplication

View File

@ -1,18 +1,19 @@
using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using ln.http.exceptions;
using ln.http.resources.session;
using ln.types.net;
using System.Threading;
using ln.http.session;
namespace ln.http
{
public class HttpRequest : IDisposable
{
static ThreadLocal<HttpRequest> current = new ThreadLocal<HttpRequest>();
static public HttpRequest Current => current.Value;
Dictionary<String, String> requestHeaders;
Dictionary<String, String> requestCookies;
@ -33,7 +34,9 @@ namespace ln.http
public QueryStringParameters Query { get; private set; }
public Session Session { get; private set; }
public Session Session => HTTPServer.SessionCache.GetSession(this);
public HttpUser CurrentUser => Session.CurrentUser;
public MemoryStream ContentStream { get; }
public TextReader ContentReader
@ -85,6 +88,9 @@ namespace ln.http
ContentStream = new MemoryStream(requestBody);
}
public void MakeCurrent() => current.Value = this;
public static void ClearCurrent() => current.Value = null;
private void Setup()
{
SetupResourceURI();
@ -133,20 +139,6 @@ namespace ln.http
}
}
public void ApplySession(SessionCache sessionCache)
{
Session session = sessionCache.ApplySession(this);
Session = session;
if (Session == null)
{
requestHeaders.Add("X-LNH-Session-Failed", "true");
Session = new Session();
}
}
public HttpUser CurrentUser => Session.CurrentUser;
public override string ToString()
{
//return string.Format("[HttpRequest: RemoteEndpoint={0}, Hostname={1} Port={2} URI={4}, Method={4}, RequestURL={5}, Protocol={6} Query={7}]", RemoteEndpoint, URI, Method, RequestURL, Protocol, Hostname, Port,Query);
@ -200,8 +192,6 @@ namespace ln.http
{
contentReader?.Dispose();
ContentStream?.Dispose();
Session = null;
}
}

View File

@ -2,9 +2,9 @@
using System.Collections.Generic;
using System.Linq;
namespace ln.http.resources.session
namespace ln.http.session
{
public class Session
public class Session : IDisposable
{
public Guid SessionID { get; private set; }
public long SessionAge => DateTimeOffset.Now.ToUnixTimeSeconds() - LastTouch;
@ -27,6 +27,13 @@ namespace ln.http.resources.session
set => this.elements[name] = value;
}
public T Get<T>(string name) where T:class
{
if (elements.ContainsKey(name))
return elements[name] as T;
return null;
}
public String[] ElementNames => this.elements.Keys.ToArray();
public void Touch()
@ -39,5 +46,24 @@ namespace ln.http.resources.session
}
public void Dispose()
{
foreach (object o in elements.Values)
{
// if (o is IDisposable disposable)
// {
// try
// {
// disposable.Dispose();
// }
//#pragma warning disable RECS0022 // catch-Klausel, die System.Exception abfängt und keinen Text aufweist
// catch (Exception)
//#pragma warning restore RECS0022 // catch-Klausel, die System.Exception abfängt und keinen Text aufweist
// {
// }
//}
}
}
}
}

View File

@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
namespace ln.http.resources.session
namespace ln.http.session
{
public class SessionCache
{
@ -48,7 +48,7 @@ namespace ln.http.resources.session
httpResponse.AddCookie(sessionCookie);
}
public Session ApplySession(HttpRequest httpRequest)
public Session GetSession(HttpRequest httpRequest)
{
Guid sessionID = FindSessionID(httpRequest);
if (!Guid.Empty.Equals(sessionID) && Contains(sessionID))
@ -71,8 +71,5 @@ namespace ln.http.resources.session
}
}
}
}

View File

@ -69,7 +69,7 @@ namespace ln.http.websocket
);
HTTPServerConnection.SendResponse(Stream, httpResponse);
HTTPServerConnection.Current.Value.AbortRequested += (connection) => Close();
//HTTPServerConnection.Current.Value.AbortRequested += (connection) => Close();
State = WebSocketState.OPEN;
}