RemObjects.InternetPack.Http.AsyncHttpWorker.HeaderLinesCallback C# (CSharp) Méthode

HeaderLinesCallback() private méthode

private HeaderLinesCallback ( IAsyncResult ar ) : void
ar IAsyncResult
Résultat void
		private void HeaderLinesCallback(IAsyncResult ar)
		{
			String lHeaderLine;
			try
			{
				lHeaderLine = this.DataConnection.EndReadLine(ar);
			}
			catch (ConnectionClosedException)
			{
				Done();
				return;
			}
			catch (SocketException)
			{
				Done();
				return;
			}
			catch (ObjectDisposedException)
			{
				Done();
				return;
			}

			// HTTP Request Type is already known
			String lHttpMethod = this.fContext.CurrentRequest.Header.RequestType;
			Boolean lRequireBody = (lHttpMethod == "POST") || (lHttpMethod == "PUT") || (lHttpMethod == "MERGE");

			Boolean lHaveData = true;
			while (lHaveData)
			{
				lHaveData = false;
				if (lHeaderLine == "")
				{
					// we've got the last line. Process it
					if (lRequireBody)
					{
						Int64 lContentLength;
#if FULLFRAMEWORK
						if (!Int64.TryParse(fContext.CurrentRequest.Header.GetHeaderValue("Content-Length"), out lContentLength))
#else
						if (!LongHelper.TryParse(fContext.CurrentRequest.Header.GetHeaderValue("Content-Length"), out lContentLength))
#endif
							lContentLength = 0;

						if (lContentLength > ((AsyncHttpServer)this.Owner).MaxPostSize)
						{
							this.SendInvalidRequest(new Exception("Content-Length too large"));
							return;
						}

						try
						{
							((AsyncHttpServer)this.Owner).TriggerBeforeHaveData(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
						}
						catch (Exception ex)
						{
							this.SendInvalidRequest(ex);
							return;
						}

						if (this.fContext.ResponseSent)
							return; // already triggered the required functions.

						try
						{
							Byte[] lData = new Byte[(Int32)lContentLength];
							DataConnection.BeginRead(lData, 0, (Int32)lContentLength, WantBodyCallback, lData);
						}
						catch (SocketException)
						{
							Done();
						}
						catch (ObjectDisposedException)
						{
							Done();
						}

						return;
					}
					else
					{
						try
						{
							this.fOwner.TriggerHttpRequest(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
							return;
						}
						catch (Exception ex)
						{
							this.SendInvalidRequest(ex);
							return;
						}
					}
				}

				if (fContext.CurrentRequest.Header.Count >= fContext.CurrentRequest.Header.MaxHeaderLines && fContext.CurrentRequest.Header.MaxHeaderLinesEnabled)
				{
					SendInvalidRequest();
					return;
				}

				Int32 lPosition = lHeaderLine.IndexOf(":", StringComparison.Ordinal);
				if (lPosition == -1)
				{
					SendInvalidRequest();
					return;
				}

				String lName = lHeaderLine.Substring(0, lPosition);
				String lValue = null;
				if (lHeaderLine.Length > lPosition + 1)
					lValue = lHeaderLine.Substring(lPosition + 2);

				fContext.CurrentRequest.Header.SetHeaderValue(lName, lValue);
				lHeaderLine = DataConnection.BufferReadLine();
				if (lHeaderLine != null)
				{
					lHaveData = true;
					continue;
				}

				try
				{
					DataConnection.BeginReadLine(HeaderLinesCallback, null);
				}
				catch (SocketException)
				{
					Done();
				}
				catch (ObjectDisposedException)
				{
					Done();
				}
			}
		}