All pastes #113758 Raw Edit

Anonymous

public text v1 · immutable
·published 2006-08-03 19:15 UTC
rendered paste body
	public class MyHttpWebRequest
	{
		Socket socket;
		BufferedStream bufferedStream;
		string server, path;
		int port;
		byte[] buf;

		public MyHttpWebRequest(string url)
		{
			int i;

			if (url.StartsWith("http"))
			{
				for (i = 0; i < url.Length; i++)
					if (url[i] == '/')
					{
						i += 2;
						break;
					}
				url = url.Substring(i);
			}

			i = url.IndexOf(':');
			if (i >= 0)
			{
				server = url.Substring(0, i);
				url = url.Substring(i + 1);
				i = url.IndexOf('/');
				Int32.TryParse(url.Substring(0, i), out port);
			}
			else
			{
				i = url.IndexOf('/');
				server = url.Substring(0, i);
				port = 80;
			}
			path = url.Substring(i);
		}

		public void BeginDownloadFile(string fileName)
		{
			buf = new byte[65536];
			bufferedStream = new BufferedStream(new FileStream(fileName, FileMode.Create, FileAccess.Write));

			socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
			socket.BeginConnect(server, port, ConnectCallback, null);
		}

		private void ConnectCallback(IAsyncResult iAsyncResult)
		{
			socket.EndConnect(iAsyncResult);
			string query = "GET " + path + " / HTTP/1.0\r\nAccept: */*\r\n\r\n";
			socket.BeginSend(System.Text.Encoding.Default.GetBytes(query), 0, query.Length, SocketFlags.None, SendCallback, null);
		}

		private void SendCallback(IAsyncResult iAsyncResult)
		{
			socket.EndSend(iAsyncResult);
			socket.BeginReceive(buf, 0, 65536, SocketFlags.None, ReceiveCallback, null);
		}

		private void ReceiveCallback(IAsyncResult iAsyncResult)
		{
			int len = socket.EndSend(iAsyncResult);

			if (len > 0)
			{
				bufferedStream.Write(buf, 0, len);
				socket.BeginReceive(buf, 0, 65536, SocketFlags.None, ReceiveCallback, null);
			}
			else
			{
				bufferedStream.Close();
				socket.Close();
			}
		}
	}