Web Proxy Server in VB.NET

Introduction

Web Proxy Server is HTTP proxy server written in VB.NET. It is Multithreaded so many clients can access the web through this WebProxy Server.

Technology Used

System.NET, System.IO ,System.Threading and VB.NET

About the sample

This sample is a console application which acts as a multithreaded WebProxy server.If you want to use any specific port to Listen then use that as a command line parameter other wise default 8089 port is used. It is multithreade Proxy Server that means multiple clients can communicate with Proxy server.   
Good luck and Enjoy VB.NET

Imports System '
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Imports System.Threading
Namespace WebProxy2
Class WebProxy2
Private clientSocket As Socket
Private read() As [Byte] = New Byte(1024) {}
Private Buffer As [Byte]() = Nothing
Private
 ASCII As
 Encoding = Encoding.ASCII
Private HTTP_VERSION As String = "HTTP/1.0"
Private CRLF As String = ControlChars.Cr + ControlChars.Lf
Private RecvBytes(4096) As [Byte]
Public Sub New(ByVal socket As Socket)
Me.clientSocket = socket
End Sub 'New
Public Sub
 run()
Dim clientmessage As [String] = " "
Dim sURL As [String] = " "
Dim bytes As Integer = readmessage(read, clientSocket, clientmessage)
If bytes = 0 Then
Return
End If
Dim
 index1 As Integer
 = clientmessage.IndexOf(" "c)
Dim index2 As Integer = clientmessage.IndexOf(" "c, index1 + 1)
If index1 = -1 Or index2 = -1 Then
Throw
 New
 IOException
End If
Console.WriteLine("Connecting to Site: {0}", clientmessage.Substring(index1 + 1, index2 - index1))
Console.WriteLine("Connection from {0}", clientSocket.RemoteEndPoint)
Dim part1 As String = clientmessage.Substring(index1 + 1, index2 - index1)
Dim index3 As Integer = part1.IndexOf("/"c, index1 + 8)
Dim index4 As Integer = part1.IndexOf(" "c, index1 + 8)
Dim index5 As Integer = index4 - index3
sURL = part1.Substring(index1 + 4, part1.Length - index5 - 8)
Try
Dim IPHost As IPHostEntry = Dns.Resolve(sURL)
Console.WriteLine("Request resolved: ", IPHost.HostName)
Dim aliases As String() = IPHost.Aliases
Dim address As IPAddress() = IPHost.AddressList
Console.WriteLine(address(0))
Dim sEndpoint As New IPEndPoint(address(0), 80)
Dim IPsocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
IPsocket.Connect(sEndpoint)
If IPsocket.Connected Then
Console.WriteLine("Socket connect OK")
End If
Dim
 [GET] As String
 = clientmessage
Dim ByteGet As [Byte]() = ASCII.GetBytes([GET])
IPsocket.Send(ByteGet, ByteGet.Length, 0)
Dim rBytes As Int32 = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0)Console.WriteLine("Recieved {0}", +rBytes)
'Buffer = RecvBytes;
Dim strRetPage As [String] = Nothing
strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes)
While rBytes > 0
rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0)
strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes)
End While
IPsocket.Shutdown(SocketShutdown.Both)
IPsocket.Close()
sendmessage(clientSocket, strRetPage)
Catch exc2 As Exception
Console.WriteLine(exc2.ToString())
End Try
End
 Sub 'run
Private Function readmessage(ByVal ByteArray() As ByteByRef s As Socket, ByRef clientmessageAs [String]) As Integer
Dim
 bytes As Integer
 = s.Receive(ByteArray, 1024, 0)
Dim messagefromclient As String = Encoding.ASCII.GetString(ByteArray)clientmessage =CType(messagefromclient, [String])
Return bytes
End Function 'readmessage
Private Sub sendmessage(ByVal s As Socket, ByVal message As String)
Buffer = 
New [Byte](message.Length + 1) {}
Dim length As Integer = ASCII.GetBytes(message, 0, message.Length, Buffer, 0)s.Send(Buffer, length, 0)
End Sub 'sendmessage
'Entry point which delegates to C-style main Private Function
Public Overloads Shared Sub Main()
Main(System.Environment.GetCommandLineArgs())
End Sub
Overloads Shared Sub Main(ByVal args() As String)
Const port As Integer = 8889
Dim tcplistener As New TcpListener(port)
Console.WriteLine("Listening on port {0}", +port)
tcplistener.Start()
While True
Dim
 socket As
 Socket = tcplistener.AcceptSocket()
Dim webproxy As New WebProxy2(socket)
Dim thread As New Thread(New ThreadStart(webproxy.run))
thread.Start()
End While
End
 Sub 'Main
End Class 'WebProxy2
End Namespace 'WebProxy2