reduce httppipeline depth
							parent
							
								
									3989dbac31
								
							
						
					
					
						commit
						29f59fe407
					
				|  | @ -79,8 +79,11 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
|             { | ||||
|                 RequestCookies cookies = _request.Cookies; | ||||
|                 HttpCookieCollection httpCookies = new HttpCookieCollection(); | ||||
|                 foreach (RequestCookie cookie in cookies) | ||||
|                     httpCookies.Add(new HttpCookie(cookie.Name, cookie.Value)); | ||||
|                 if(cookies != null) | ||||
|                 { | ||||
|                     foreach (RequestCookie cookie in cookies) | ||||
|                         httpCookies.Add(new HttpCookie(cookie.Name, cookie.Value)); | ||||
|                 } | ||||
|                 return httpCookies; | ||||
|             } | ||||
|         } | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ namespace OSHttpServer | |||
|     /// </remarks> | ||||
|     public class HttpClientContext : IHttpClientContext, IDisposable | ||||
|     { | ||||
|         const int MAXREQUESTS = 20; | ||||
|         const int MAXPIPEREQUESTS = 5; | ||||
|         const int MAXKEEPALIVE = 60000; | ||||
| 
 | ||||
|         static private int basecontextID; | ||||
|  | @ -47,7 +47,7 @@ namespace OSHttpServer | |||
|         public int m_TimeoutKeepAlive = MAXKEEPALIVE; // 400 seconds before keepalive timeout | ||||
|         // public int TimeoutKeepAlive = 120000; // 400 seconds before keepalive timeout | ||||
| 
 | ||||
|         public int m_maxRequests = MAXREQUESTS; | ||||
|         public int m_maxPipeRequests = MAXPIPEREQUESTS; | ||||
| 
 | ||||
|         public bool FirstRequestLineReceived; | ||||
|         public bool FullRequestReceived; | ||||
|  | @ -68,12 +68,15 @@ namespace OSHttpServer | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public int MAXRequests | ||||
|         public int MaxPipeRequests | ||||
|         { | ||||
|             get { return m_maxRequests; } | ||||
|             get { return m_maxPipeRequests; } | ||||
|             set | ||||
|             { | ||||
|                 m_maxRequests = value > MAXREQUESTS ? MAXREQUESTS : value; | ||||
|                 if(value <= 1) | ||||
|                     m_maxPipeRequests = 1; | ||||
|                 else | ||||
|                    m_maxPipeRequests = value > MAXPIPEREQUESTS ? MAXPIPEREQUESTS : value; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -354,6 +357,9 @@ namespace OSHttpServer | |||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 if(m_maxPipeRequests <= 0) | ||||
|                     return; | ||||
| 
 | ||||
|                 m_ReceiveBytesLeft += bytesRead; | ||||
|                 if (m_ReceiveBytesLeft > m_ReceiveBuffer.Length) | ||||
|                 { | ||||
|  | @ -531,28 +537,29 @@ namespace OSHttpServer | |||
|         { | ||||
|             TriggerKeepalive = false; | ||||
|             MonitorKeepaliveMS = 0; | ||||
|             FullRequestReceived = true; | ||||
| 
 | ||||
|             if (m_maxPipeRequests == 0) | ||||
|                 return; | ||||
| 
 | ||||
|             if(--m_maxPipeRequests == 0) | ||||
|                 m_currentRequest.Connection = ConnectionType.Close; | ||||
| 
 | ||||
|             // load cookies if they exist | ||||
| 
 | ||||
|             RequestCookies cookies = m_currentRequest.Headers["cookie"] != null | ||||
|                 ? new RequestCookies(m_currentRequest.Headers["cookie"]) : new RequestCookies(String.Empty); | ||||
|             m_currentRequest.SetCookies(cookies); | ||||
|             if(m_currentRequest.Headers["cookie"] != null) | ||||
|                 m_currentRequest.SetCookies(new RequestCookies(m_currentRequest.Headers["cookie"])); | ||||
| 
 | ||||
|             m_currentRequest.Body.Seek(0, SeekOrigin.Begin); | ||||
| 
 | ||||
|             FullRequestReceived = true; | ||||
| 
 | ||||
|             int nreqs; | ||||
|             lock (requestsInServiceIDs) | ||||
|             { | ||||
|                 nreqs = requestsInServiceIDs.Count; | ||||
|                 requestsInServiceIDs.Add(m_currentRequest.ID); | ||||
|                 if (m_maxRequests > 0) | ||||
|                     m_maxRequests--; | ||||
|             } | ||||
| 
 | ||||
|             // for now pipeline requests need to be serialized by opensim | ||||
|             RequestReceived(this, new RequestEventArgs(m_currentRequest)); | ||||
|             RequestReceived?.Invoke(this, new RequestEventArgs(m_currentRequest)); | ||||
| 
 | ||||
|             m_currentRequest = new HttpRequest(this); | ||||
| 
 | ||||
|  | @ -610,10 +617,8 @@ namespace OSHttpServer | |||
|             lock (requestsInServiceIDs) | ||||
|             { | ||||
|                 requestsInServiceIDs.Remove(requestID); | ||||
| //                doclose = doclose && requestsInServiceIDs.Count == 0; | ||||
|                 if (requestsInServiceIDs.Count > 1) | ||||
|                 { | ||||
| 
 | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|  | @ -750,11 +755,11 @@ namespace OSHttpServer | |||
|         /// <remarks> | ||||
|         /// Event can be used to clean up a context, or to reuse it. | ||||
|         /// </remarks> | ||||
|         public event EventHandler<DisconnectedEventArgs> Disconnected = delegate { }; | ||||
|         public event EventHandler<DisconnectedEventArgs> Disconnected; | ||||
|         /// <summary> | ||||
|         /// A request have been received in the context. | ||||
|         /// </summary> | ||||
|         public event EventHandler<RequestEventArgs> RequestReceived = delegate { }; | ||||
|         public event EventHandler<RequestEventArgs> RequestReceived; | ||||
| 
 | ||||
|         public HTTPNetworkContext GiveMeTheNetworkStreamIKnowWhatImDoing() | ||||
|         { | ||||
|  |  | |||
|  | @ -245,9 +245,9 @@ namespace OSHttpServer | |||
|                 sb.Append("Server: OSWebServer\r\n"); | ||||
| 
 | ||||
|             int keepaliveS = m_context.TimeoutKeepAlive / 1000; | ||||
|             if (Connection == ConnectionType.KeepAlive && keepaliveS > 0 && m_context.MAXRequests > 0) | ||||
|             if (Connection == ConnectionType.KeepAlive && keepaliveS > 0 && m_context.MaxPipeRequests > 0) | ||||
|             { | ||||
|                 sb.AppendFormat("Keep-Alive:timeout={0}, max={1}\r\n", keepaliveS, m_context.MAXRequests); | ||||
|                 sb.AppendFormat("Keep-Alive:timeout={0}, max={1}\r\n", keepaliveS, m_context.MaxPipeRequests); | ||||
|                 sb.Append("Connection: Keep-Alive\r\n"); | ||||
|             } | ||||
|             else | ||||
|  | @ -282,7 +282,7 @@ namespace OSHttpServer | |||
|             if (Sent) | ||||
|                 throw new InvalidOperationException("Everything have already been sent."); | ||||
| 
 | ||||
|             if (m_context.MAXRequests == 0 || m_keepAlive == 0) | ||||
|             if (m_context.MaxPipeRequests == 0 || m_keepAlive == 0) | ||||
|             { | ||||
|                 Connection = ConnectionType.Close; | ||||
|                 m_context.TimeoutKeepAlive = 0; | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ namespace OSHttpServer | |||
| 
 | ||||
|         int contextID {get;} | ||||
|         int TimeoutKeepAlive {get; set; } | ||||
|         int MAXRequests{get; set; } | ||||
|         int MaxPipeRequests{get; set; } | ||||
| 
 | ||||
|         bool CanSend(); | ||||
|         bool IsSending(); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 UbitUmarov
						UbitUmarov