do http requests serialization at lower level

master
UbitUmarov 2020-05-02 14:23:52 +01:00
parent ab14241871
commit 1ad3a256f2
1 changed files with 39 additions and 38 deletions

View File

@ -25,11 +25,15 @@ namespace OSHttpServer
static private int basecontextID; static private int basecontextID;
Queue<HttpRequest> m_requests;
object m_requestsLock = new object();
public int m_maxRequests = MAXREQUESTS;
public bool m_waitingResponse;
private readonly byte[] m_ReceiveBuffer; private readonly byte[] m_ReceiveBuffer;
private int m_ReceiveBytesLeft; private int m_ReceiveBytesLeft;
private ILogWriter m_log; private ILogWriter m_log;
private readonly IHttpRequestParser m_parser; private readonly IHttpRequestParser m_parser;
private HashSet<uint> requestsInServiceIDs;
private Socket m_sock; private Socket m_sock;
public bool Available = true; public bool Available = true;
@ -44,8 +48,6 @@ namespace OSHttpServer
public int TimeoutMaxIdle = 180000; // 3 minutes public int TimeoutMaxIdle = 180000; // 3 minutes
public int m_TimeoutKeepAlive = 60000; public int m_TimeoutKeepAlive = 60000;
public int m_maxRequests = MAXREQUESTS;
public bool FirstRequestLineReceived; public bool FirstRequestLineReceived;
public bool FullRequestReceived; public bool FullRequestReceived;
@ -126,7 +128,7 @@ namespace OSHttpServer
m_sock = sock; m_sock = sock;
m_ReceiveBuffer = new byte[16384]; m_ReceiveBuffer = new byte[16384];
requestsInServiceIDs = new HashSet<uint>(); m_requests = new Queue<HttpRequest>();
SSLCommonName = ""; SSLCommonName = "";
if (secured) if (secured)
@ -179,9 +181,9 @@ namespace OSHttpServer
{ {
if (string.Compare(e.Name, "expect", true) == 0 && e.Value.Contains("100-continue")) if (string.Compare(e.Name, "expect", true) == 0 && e.Value.Contains("100-continue"))
{ {
lock (requestsInServiceIDs) lock (m_requestsLock)
{ {
if (requestsInServiceIDs.Count == 0) if (m_maxRequests == MAXREQUESTS)
Respond("HTTP/1.1", HttpStatusCode.Continue, null); Respond("HTTP/1.1", HttpStatusCode.Continue, null);
} }
} }
@ -237,7 +239,8 @@ namespace OSHttpServer
m_currentRequest = null; m_currentRequest = null;
m_currentResponse?.Clear(); m_currentResponse?.Clear();
m_currentResponse = null; m_currentResponse = null;
requestsInServiceIDs.Clear(); m_requests.Clear();
m_requests = null;
m_parser.Clear(); m_parser.Clear();
FirstRequestLineReceived = false; FirstRequestLineReceived = false;
@ -464,27 +467,23 @@ namespace OSHttpServer
m_currentRequest.Body.Seek(0, SeekOrigin.Begin); m_currentRequest.Body.Seek(0, SeekOrigin.Begin);
int nreqs; bool donow = true;
lock (requestsInServiceIDs) lock (m_requestsLock)
{ {
nreqs = requestsInServiceIDs.Count; if(m_waitingResponse)
requestsInServiceIDs.Add(m_currentRequest.ID); {
m_requests.Enqueue(m_currentRequest);
donow = false;
}
else
m_waitingResponse = true;
} }
// for now pipeline requests need to be serialized by opensim // for now pipeline requests need to be serialized by opensim
RequestReceived?.Invoke(this, new RequestEventArgs(m_currentRequest)); if(donow)
RequestReceived?.Invoke(this, new RequestEventArgs(m_currentRequest));
m_currentRequest = new HttpRequest(this); m_currentRequest = new HttpRequest(this);
int nreqsnow;
lock (requestsInServiceIDs)
{
nreqsnow = requestsInServiceIDs.Count;
}
if (nreqs != nreqsnow)
{
// request was not done by us
}
} }
public void StartSendResponse(HttpResponse response) public void StartSendResponse(HttpResponse response)
@ -524,27 +523,17 @@ namespace OSHttpServer
m_currentResponse = null; m_currentResponse = null;
bool doclose = ctype == ConnectionType.Close; bool doclose = ctype == ConnectionType.Close;
lock (requestsInServiceIDs) if (doclose)
{
requestsInServiceIDs.Remove(requestID);
if (requestsInServiceIDs.Count > 1)
{
}
}
if (doclose)
{ {
m_isClosing = true; m_isClosing = true;
lock (requestsInServiceIDs) m_requests.Clear();
requestsInServiceIDs.Clear();
TriggerKeepalive = true; TriggerKeepalive = true;
return; return;
} }
else else
{ {
LastActivityTimeMS = ContextTimeoutManager.EnvironmentTickCount(); LastActivityTimeMS = ContextTimeoutManager.EnvironmentTickCount();
if(Stream!=null && Stream.CanWrite) if (Stream != null && Stream.CanWrite)
{ {
ContextTimeoutManager.ContextEnterActiveSend(); ContextTimeoutManager.ContextEnterActiveSend();
try try
@ -557,10 +546,22 @@ namespace OSHttpServer
ContextTimeoutManager.ContextLeaveActiveSend(); ContextTimeoutManager.ContextLeaveActiveSend();
} }
lock (requestsInServiceIDs) if (Stream == null || !Stream.CanWrite)
return;
TriggerKeepalive = true;
lock (m_requestsLock)
{ {
if (requestsInServiceIDs.Count == 0) m_waitingResponse = false;
TriggerKeepalive = true; if (m_requests != null && m_requests.Count > 0)
{
HttpRequest nextRequest = m_requests.Dequeue();
if (nextRequest != null)
{
m_waitingResponse = true;
RequestReceived?.Invoke(this, new RequestEventArgs(nextRequest));
}
}
} }
} }
} }