상속: IHttpContext, IDisposable
예제 #1
0
		private void ProcessRequest(HttpListenerContext context)
		{
			if (context == null)
				return;

			Task.Factory.StartNew(() =>
			{
				var ctx = new HttpListenerContextAdpater(context, SystemConfiguration, bufferPool);

				if (concurrentRequestSemaphore.Wait(TimeSpan.FromSeconds(5)) == false)
				{
					try
					{
						HandleTooBusyError(ctx);
					}
					catch (Exception e)
					{
						logger.WarnException("Could not send a too busy error to the client", e);
					}
					return;
				}
				try
				{
					Interlocked.Increment(ref physicalRequestsCount);
#if DEBUG
					recentRequests.Enqueue(ctx.Request.RawUrl);
					while (recentRequests.Count > 50)
					{
						string _;
						recentRequests.TryDequeue(out _);
					}
#endif

					if (ChangesQuery.IsMatch(ctx.GetRequestUrl()))
						HandleChangesRequest(ctx, () => { });
					else
						HandleActualRequest(ctx);
				}
				finally
				{
					concurrentRequestSemaphore.Release();
				}
			});
		}
예제 #2
0
		private void GetContext(IAsyncResult ar)
		{
			HttpListenerContextAdpater ctx;
			try
			{
				HttpListenerContext httpListenerContext = listener.EndGetContext(ar);
				ctx = new HttpListenerContextAdpater(httpListenerContext, SystemConfiguration, bufferPool);
				//setup waiting for the next request
				listener.BeginGetContext(GetContext, null);
			}
			catch (Exception)
			{
				// can't get current request / end new one, probably
				// listener shutdown
				return;
			}

			if (concurrentRequestSemaphore.Wait(TimeSpan.FromSeconds(5)) == false)
			{
				HandleTooBusyError(ctx);
				return;
			}
			try
			{
				Interlocked.Increment(ref physicalRequestsCount);
				if (ChangesQuery.IsMatch(ctx.GetRequestUrl()))
					HandleChangesRequest(ctx, () => { });
				else
					HandleActualRequest(ctx);
			}
			finally
			{
				concurrentRequestSemaphore.Release();
			}
		}
예제 #3
0
        private void GetContext(IAsyncResult ar)
        {
            IHttpContext ctx;
            try
            {
                ctx = new HttpListenerContextAdpater(listener.EndGetContext(ar), Configuration);
                //setup waiting for the next request
                listener.BeginGetContext(GetContext, null);
            }
            catch(InvalidOperationException)
            {
                // can't get current request / end new one, probably
                // listner shutdown
                return;
            }
            catch (HttpListenerException)
            {
                // can't get current request / end new one, probably
                // listner shutdown
                return;
            }

            if (concurretRequestSemaphore.Wait(TimeSpan.FromSeconds(5)) == false)
            {
                HandleTooBusyError(ctx);
                return;
            }
            try
            {
                HandleActualRequest(ctx);
            }
            finally
            {
                concurretRequestSemaphore.Release();
            }
        }
예제 #4
0
		private void ProcessRequest(HttpListenerContext context)
		{
			IHttpContext ctx = new HttpListenerContextAdpater(context, new InMemoryRavenConfiguration
			{
				VirtualDirectory = "/"
			}, bufferPool);

			try
			{
				foreach (var responder in responders.Where(x => x.WillRespond(ctx)))
				{
					responder.Respond(ctx);
					return;
				}

				ctx.SetStatusToBadRequest();
			}
			catch (Exception)
			{
				ctx.SetStatusToBadRequest();
			}
			finally
			{
				ctx.FinalizeResponse();
			}
		}