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

View File

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

View File

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

View File

@ -1,18 +1,19 @@
using System; using System;
using System.IO; using System.IO;
using System.Text;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net;
using System.Net.Sockets;
using ln.http.exceptions; using ln.http.exceptions;
using ln.http.resources.session;
using ln.types.net; using ln.types.net;
using System.Threading;
using ln.http.session;
namespace ln.http namespace ln.http
{ {
public class HttpRequest : IDisposable public class HttpRequest : IDisposable
{ {
static ThreadLocal<HttpRequest> current = new ThreadLocal<HttpRequest>();
static public HttpRequest Current => current.Value;
Dictionary<String, String> requestHeaders; Dictionary<String, String> requestHeaders;
Dictionary<String, String> requestCookies; Dictionary<String, String> requestCookies;
@ -33,7 +34,9 @@ namespace ln.http
public QueryStringParameters Query { get; private set; } 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 MemoryStream ContentStream { get; }
public TextReader ContentReader public TextReader ContentReader
@ -85,6 +88,9 @@ namespace ln.http
ContentStream = new MemoryStream(requestBody); ContentStream = new MemoryStream(requestBody);
} }
public void MakeCurrent() => current.Value = this;
public static void ClearCurrent() => current.Value = null;
private void Setup() private void Setup()
{ {
SetupResourceURI(); 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() 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); //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(); contentReader?.Dispose();
ContentStream?.Dispose(); ContentStream?.Dispose();
Session = null;
} }
} }

View File

@ -2,9 +2,9 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; 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 Guid SessionID { get; private set; }
public long SessionAge => DateTimeOffset.Now.ToUnixTimeSeconds() - LastTouch; public long SessionAge => DateTimeOffset.Now.ToUnixTimeSeconds() - LastTouch;
@ -27,6 +27,13 @@ namespace ln.http.resources.session
set => this.elements[name] = value; 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 String[] ElementNames => this.elements.Keys.ToArray();
public void Touch() 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;
using System.Collections.Generic; using System.Collections.Generic;
namespace ln.http.resources.session namespace ln.http.session
{ {
public class SessionCache public class SessionCache
{ {
@ -48,7 +48,7 @@ namespace ln.http.resources.session
httpResponse.AddCookie(sessionCookie); httpResponse.AddCookie(sessionCookie);
} }
public Session ApplySession(HttpRequest httpRequest) public Session GetSession(HttpRequest httpRequest)
{ {
Guid sessionID = FindSessionID(httpRequest); Guid sessionID = FindSessionID(httpRequest);
if (!Guid.Empty.Equals(sessionID) && Contains(sessionID)) 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.SendResponse(Stream, httpResponse);
HTTPServerConnection.Current.Value.AbortRequested += (connection) => Close(); //HTTPServerConnection.Current.Value.AbortRequested += (connection) => Close();
State = WebSocketState.OPEN; State = WebSocketState.OPEN;
} }