Python’da basit bir HTTP proxy sunucusu oluşturmak için aşağıdaki kodu kullanabilirsiniz
import socket
import select
import time
import sys
# Changing the buffer_size and delay can improve the speed of the proxy.
buffer_size = 4096
delay = 0.0001
forward_to = ('host', 80)
class Forward:
def init(self):
self.forward = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def start(self, host, port):
try:
self.forward.connect((host, port))
return self.forward
except Exception as e:
print(e)
return False
class TheServer:
input_list = []
channel = {}
def init(self, host, port):
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server.bind((host, port))
self.server.listen(200)
def main_loop(self):
self.input_list.append(self.server)
while 1:
ss = select.select
inputready, outputready, exceptready = ss(self.input_list, [], [])
for self.s in inputready:
if self.s == self.server:
self.on_accept()
break
self.data = self.s.recv(buffer_size)
if len(self.data) == 0:
self.on_close()
break
else:
self.on_recv()
def on_accept(self):
forward = Forward().start(forward_to[0], forward_to[1])
clientsock, clientaddr = self.server.accept()
if forward:
print(clientaddr, "has connected")
self.input_list.append(clientsock)
self.input_list.append(forward)
self.channel[clientsock] = forward
self.channel[forward] = clientsock
else:
print("Can't establish connection with remote server.", end=' ')
print("Closing connection with client side", clientaddr)
clientsock.close()
def on_close(self):
print(self.s.getpeername(), "has disconnected")
# remove objects from input_list
self.input_list.remove(self.s)
self.input_list.remove(self.channel[self.s])
out = self.channel[self.s]
# close the connection with client
self.channel[out].close() # equivalent to do self.s.close()
# close the connection with remote server
self.channel[self.s].close()
# delete both objects from channel dict
del self.channel[out]
del self.channel[self.s]
def on_recv(self):
data = self.data
# here we can parse and/or modify the data before send forward
print(data)
self.channel[self.s].send(data)
if name == 'main':
server = TheServer('localhost', 9000)
try:
server.main_loop()
except KeyboardInterrupt:
print("Ctrl C - Stopping server")
sys.exit(1)
Bu kod, belirli bir host ve porta yönlendirme yapacak bir proxy sunucusu oluşturur. Gelen bağlantıları kabul eder ve verileri ileri ve geri yönlendirir. Bu, basit bir örnektir ve daha karmaşık bir proxy sunucusu oluşturmanız gerekiyorsa, daha fazla özellik eklemeniz gerekebilir. Bu kodu çalıştırmadan önce, forward_to değişkenini proxy’nin yönlendireceği hedef IP ve port ile güncellemeyi unutmayın. Bu örnekte, hedef IP ‘host’ ve port 80 olarak ayarlanmıştır. Bu değerleri ihtiyaçlarınıza göre değiştirmeniz gerekecektir. Bu kodu çalıştırmak için Python 3.x sürümüne ihtiyacınız olacak
import socket
import select
import time
import sys
# Changing the buffer_size and delay can improve the speed of the proxy.
buffer_size = 4096
delay = 0.0001
forward_to = ('host', 80)
class Forward:
def init(self):
self.forward = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def start(self, host, port):
try:
self.forward.connect((host, port))
return self.forward
except Exception as e:
print(e)
return False
class TheServer:
input_list = []
channel = {}
def init(self, host, port):
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server.bind((host, port))
self.server.listen(200)
def main_loop(self):
self.input_list.append(self.server)
while 1:
ss = select.select
inputready, outputready, exceptready = ss(self.input_list, [], [])
for self.s in inputready:
if self.s == self.server:
self.on_accept()
break
self.data = self.s.recv(buffer_size)
if len(self.data) == 0:
self.on_close()
break
else:
self.on_recv()
def on_accept(self):
forward = Forward().start(forward_to[0], forward_to[1])
clientsock, clientaddr = self.server.accept()
if forward:
print(clientaddr, "has connected")
self.input_list.append(clientsock)
self.input_list.append(forward)
self.channel[clientsock] = forward
self.channel[forward] = clientsock
else:
print("Can't establish connection with remote server.", end=' ')
print("Closing connection with client side", clientaddr)
clientsock.close()
def on_close(self):
print(self.s.getpeername(), "has disconnected")
# remove objects from input_list
self.input_list.remove(self.s)
self.input_list.remove(self.channel[self.s])
out = self.channel[self.s]
# close the connection with client
self.channel[out].close() # equivalent to do self.s.close()
# close the connection with remote server
self.channel[self.s].close()
# delete both objects from channel dict
del self.channel[out]
del self.channel[self.s]
def on_recv(self):
data = self.data
# here we can parse and/or modify the data before send forward
print(data)
self.channel[self.s].send(data)
if name == 'main':
server = TheServer('localhost', 9000)
try:
server.main_loop()
except KeyboardInterrupt:
print("Ctrl C - Stopping server")
sys.exit(1)
Bu kod, belirli bir host ve porta yönlendirme yapacak bir proxy sunucusu oluşturur. Gelen bağlantıları kabul eder ve verileri ileri ve geri yönlendirir. Bu, basit bir örnektir ve daha karmaşık bir proxy sunucusu oluşturmanız gerekiyorsa, daha fazla özellik eklemeniz gerekebilir. Bu kodu çalıştırmadan önce, forward_to değişkenini proxy’nin yönlendireceği hedef IP ve port ile güncellemeyi unutmayın. Bu örnekte, hedef IP ‘host’ ve port 80 olarak ayarlanmıştır. Bu değerleri ihtiyaçlarınıza göre değiştirmeniz gerekecektir. Bu kodu çalıştırmak için Python 3.x sürümüne ihtiyacınız olacak

