Beispiel #1
0
		public void ProcessIncomingRequest(Connection c)
		{
			if (c.HttpReader.HasUpgarde(Upgrades.Websocket))
			{
				// c.HttpReader.SecWebSocketProtocol

				var key = c.HttpReader.SecWebSocketKey.ToString();
				byte[] accept;
				lock (sha1)
					accept = sha1.ComputeHash(Encoding.ASCII.GetBytes(key + guid));

				using (var writer = new HttpMessageWriter())
				{
					writer.WriteStatusLine(StatusCodes.SwitchingProtocols);
					writer.WriteConnectionUpgrade();
					writer.WriteUpgradeWebsocket();
					writer.WriteSecWebSocketAccept(accept);
					writer.WriteSecWebSocketProtocol(sip);
					writer.WriteContentLength(0);
					writer.WriteCRLF();

					SendResponse(c, writer, InvalidAgentIndex);
				}

				c.UpgradeToWebsocket();
			}
			else
			{
				base.ProcessIncomingRequest(c);
			}
		}
Beispiel #2
0
		void IHttpServer.SendResponse(BaseConnection c, HttpMessageWriter writer)
		{
			var r = EventArgsManager.Get();
			r.CopyAddressesFrom(c);
			r.Count = writer.Count;
			r.OffsetOffset = writer.OffsetOffset;
			r.AttachBuffer(writer.Detach());

			SendAsync(r);
		}
Beispiel #3
0
			void IHttpServer.SendResponse(BaseConnection connection, HttpMessageWriter writer)
			{
				server.SendResponse(connection, writer, index);
			}
Beispiel #4
0
		protected void SendResponse(BaseConnection c, HttpMessageWriter writer, int agentIndex)
		{
			var r = EventArgsManager.Get();
			r.CopyAddressesFrom(c);
			r.Count = writer.Count;
			r.OffsetOffset = writer.OffsetOffset;
			r.AttachBuffer(writer.Detach());

			SendAsync(r, agentIndex);
		}
Beispiel #5
0
		public void ProcessIncomingRequest(BaseHttpConnection c)
		{
			bool handled = false;

			for (int i = 0; i < agents.Length; i++)
			{
				var result = agents[i].Value.IsHandled(c.HttpReader);
				if (result.IsHandled)
				{
					bool isAuthorized = true;

					if (agents[i].IsAuthorizationEnabled && result.IsAuthorizationRequred)
					{
						var writer = IsAuthorized(c, result.Realm, i);
						if (writer != null)
						{
							isAuthorized = false;
							SendResponse(c, writer, InvalidAgentIndex);
						}
					}

					if (isAuthorized)
						agents[i].Value.HandleRequest(c, c.HttpReader, c.Content);

					handled = true;

					break;
				}
			}

			if (handled == false)
			{
				var writer = new HttpMessageWriter();

				writer.WriteStatusLine(StatusCodes.TemporaryRedirect);
				writer.WriteLocation(c.LocalEndPoint.Protocol == ServerProtocol.Tcp, c.HttpReader.Host.Host, c.HttpReader.Host.Port, defaultUri);
				writer.WriteContentLength(0);
				writer.WriteCRLF();

				SendResponse(c, writer, InvalidAgentIndex);
			}
		}
Beispiel #6
0
		void IHttpServerAgent.HandleRequest(BaseConnection c, HttpMessageReader httpReader, ArraySegment<byte> httpContent)
		{
			if (httpReader.Method != Methods.Get)
			{
				var writer = new HttpMessageWriter();
				writer.WriteResponse(StatusCodes.NotAcceptable);

				httpServer.SendResponse(c, writer);
			}
			else
			{
				if (httpReader.RequestUri.Equals(uri1))
				{
					var writer = new HttpMessageWriter();

					writer.WriteStatusLine(StatusCodes.MovedPermanently);
					writer.WriteContentLength(0);
					writer.WriteLocation(c.LocalEndPoint.Protocol == ServerProtocol.Tcp, httpReader.Host.Host, httpReader.Host.Port, uri2);
					writer.WriteCRLF();

					httpServer.SendResponse(c, writer);
				}
				else
				{
					var rawFile = GetFile(httpReader);

					if (rawFile.HasValue == false)
					{
						var writer = new HttpMessageWriter();
						writer.WriteResponse(StatusCodes.NotFound);

						httpServer.SendResponse(c, writer);
					}
					else
					{
						var file = rawFile.Value;

						var writer = new HttpMessageWriter();
						writer.WriteStatusLine(StatusCodes.OK);
						writer.WriteContentType(file.ContentType);
						writer.WriteContentLength(file.Content.Length);
						writer.WriteCRLF();

						httpServer.SendResponse(c, writer);

						httpServer.SendResponse(c, new ArraySegment<byte>(file.Content));
					}
				}
			}
		}
Beispiel #7
0
		private void SendWriter(ServerAsyncEventArgs r, HttpMessageWriter writer)
		{
			r.Count = writer.Count;
			r.OffsetOffset = writer.OffsetOffset;
			r.AttachBuffer(writer.Detach());

			SendAsync(r, false);
		}
Beispiel #8
0
		private void SendWriter(Session session, HttpMessageWriter writer)
		{
			var r = EventArgsManager.Get();
			session.RestoreAddresses(r);

			SendWriter(r, writer);
		}
Beispiel #9
0
		private void SendWriter(Connection connection, HttpMessageWriter writer)
		{
			var r = EventArgsManager.Get();
			r.CopyAddressesFrom(connection);

			SendWriter(r, writer);
		}
Beispiel #10
0
		private void SendResponse(Connection connection, StatusCodes statusCode)
		{
			using (var writer = new HttpMessageWriter())
			{
				writer.WriteEmptyResponse(statusCode);

				SendWriter(connection, writer);
			}
		}
Beispiel #11
0
		private void SendEmptyMessage(Session session)
		{
			using (var writer = new HttpMessageWriter())
			{
				writer.WriteEmptyResponse(StatusCodes.OK);

				SendWriter(session, writer);
			}
		}
Beispiel #12
0
		private void SendJsonMessage(Session session)
		{
			using (var writer = new HttpMessageWriter())
			{
				//byte[] json = Encoding.UTF8.GetBytes(string.Format(@"{{id:{0}}}", session.Id));
				byte[] json = Encoding.UTF8.GetBytes(string.Format(@"{0}", session.Id));

				writer.WriteStatusLine(StatusCodes.OK);
				//writer.Write(Encoding.UTF8.GetBytes("Content-Type: application/json\r\n"));
				writer.WriteContentLength(json.Length);
				writer.WriteAccessControlHeaders();
				writer.WriteCRLF();
				writer.Write(json);

				SendWriter(session, writer);
			}
		}
Beispiel #13
0
		private static void WriteHttpHeader(ServerAsyncEventArgs e)
		{
			using (var writer = new HttpMessageWriter())
			{
				writer.WriteStatusLine(StatusCodes.OK);
				writer.WriteContentLength(e.Count);
				writer.WriteAccessControlHeaders();
				writer.WriteCRLF();

				e.OffsetOffset -= writer.Count;
				e.Count += writer.Count;
				Buffer.BlockCopy(writer.Buffer, writer.Offset, e.Buffer, e.Offset, writer.Count);
			}
		}
Beispiel #14
0
		//public int CopyTo(Func<int, ArraySegment<byte>> getBuffer)
		//{
		//    lock (tuples)
		//    {
		//        int length = CountLength();

		//        var segment = getBuffer(length);

		//        if (segment.Count >= length)
		//        {
		//            int offset = 0;
		//            BlockCopy(openPresence, segment, ref offset, openPresence.Length);

		//            for (int i = 0; i < tuples.Count; i++)
		//            {
		//                Buffer.BlockCopy(tuples[i].Data.Array, tuples[i].Data.Offset,
		//                    segment.Array, segment.Offset + offset, tuples[i].Data.Count);
		//                offset += tuples[i].Data.Count;
		//            }

		//            BlockCopy(closePresence, segment, ref offset, closePresence.Length);

		//            return length;
		//        }

		//        return 0;
		//    }
		//}

		public void WriteLenghtAndContent(HttpMessageWriter writer)
		{
			lock (tuples)
			{
				int length = CountLength();

				writer.WriteContentLength(length);
				writer.WriteCRLF();

				WriteContent(writer, length);
			}
		}