'Simple https proxy [duplicate]
I am trying to proxy requests with python, I can proxy http requests easily, http payload comes and and turns back. But I couldn't get it working with https, it doesn't work the same way. I guess it has something to do with CONNECT method. Here is the current state of my code and my shot with https in commented lines.
import socket, ssl
from threading import Thread
class Proxy:
def __init__(self, port=3000):
self.port = port
self.proxy_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.proxy_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.buffer_size = 4096
def run(self):
self.proxy_sock.bind(("0.0.0.0", self.port))
self.proxy_sock.listen(100)
print(" * Proxy server is running on port {}".format(self.port))
while True:
client, addr = self.proxy_sock.accept()
print(" => {}:{}".format(addr[0], addr[1]))
Thread(target=self.process_request, args=(client,), daemon=True).start()
def process_request(self, client):
payload = client.recv(self.buffer_size)
host = payload.decode().split("\r\n")[1].split(" ")[1]
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.connect((host, 80))
server.sendall(payload)
server_data = server.recv(4096)
print(server_data)
server.close()
client.sendall(server_data)
client.close()
# def process_request(self, client):
# payload = client.recv(self.buffer_size)
# print(payload)
# host, port = payload.decode().split(" ")[1].split(":")
# port = int(port)
# print(host, port)
# context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
# server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# s_sock = context.wrap_socket(server, server_hostname=host)
# s_sock.connect((host, port))
# s_sock.send(f"GET / HTTP/1.1\r\nHost: {host}\r\n\r\n ".encode())
# server_data = s_sock.recv(4096)
# print(server_data)
# s_sock.close()
# client.sendall(server_data)
# client.close()
if __name__ == "__main__":
proxy = Proxy(8383)
proxy.run()
Here how I test it:
# Https
import requests
requests.get("https://google.com", proxies={"http": "http://127.0.0.1:8383", "https": "http://127.0.0.1:8383"})
# Http
import requests
requests.get("http://google.com", proxies={"http": "http://127.0.0.1:8383", "https": "http://127.0.0.1:8383"})
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
