python实现HTTPS代理,HTTP的CONNECT方法响应

只实现了HTTPS代理隧道功能,即HTTP的CONNECT方法,本意想与JSProxy配合使用,所以在此标记一下,使用方法
在这里插入图片描述++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

import json
import re
import request
import time
import _thread


def getAddr(d):
    a = re.search("Host: (.*)\r\n", d)
    if a == None:
        a = re.search("Host: (.*)", d)
    host = a.group(1)
    a = host.split(":")
    if len(a) == 1:
        return (a[0], 80)
    else:
        return (a[0], int(a[1]))


def SendAndRecv(Stream, BuffList, i, j):
    while True:
        BuffList[i] = Stream[i].recv(1024)
        # print(i, "接收到:", BuffList[i])
        if BuffList[i] == b'':
            break
        Stream[j].send(BuffList[i])


def exit(serverIP, serverPort):
    while True:
        _str = input("输入q退出!!!")
        if _str == 'q':
            sock = socket(AF_INET, SOCK_STREAM)
            sock.connect((serverIP, serverPort))
            sock.send('exit'.encode())
            sock.close()
            break
    pass


def interBoth(tmp, client):
            Stream = [tmp, client]
            BufferList = [b'', b'']
            _thread.start_new_thread(
                SendAndRecv, (Stream, BufferList, 0, 1, ))
            _thread.start_new_thread(
                SendAndRecv, (Stream, BufferList, 1, 0, ))
            print("已创建线程!!!!!", BufferList)
            while BufferList[0] == b'' and BufferList[1] == b'':
                pass
            while BufferList[0] != b'' or BufferList[1] != b'':
                pass
            client.close()
            tmp.close()
        # print(BufferList)

    

def process(request_data, tmp):
    Addr = getAddr(request_data)
    try:
        client = socket(AF_INET, SOCK_STREAM)
        try:
            client.connect(Addr)
        except:
            client.close()
        else:
            el = request_data.split("\r\n")
            if el[0].find('HTTP') != -1:
                part = el[0].split(' ')
                if part[0] == 'CONNECT':
                    response_start_line = "HTTP/1.1 200 Connection Established\r\n\r\n"
                    #response = "HTTP/1.1 407 Unauthorized\r\n"
                    tmp.send(response_start_line.encode())
                    interBoth(tmp, client)
                else:
                    #此处为GET、POST请求方式实现
                    # client.send(request_data)
                    # interBoth(tmp, client)
                    
    except Exception as identifier:
        print(identifier)

    pass


def local(serverIP, serverPort):
    tcpSocket = socket(AF_INET, SOCK_STREAM)
    tcpSocket.bind((serverIP, serverPort))
    tcpSocket.listen(5)
    while True:
        tmp, addr = tcpSocket.accept()
        msg = tmp.recv(1024)
        try:
            request_data = msg.decode()
        except Exception as identifier:
            continue
        else:
            if request_data == 'exit':
                break
            _thread.start_new_thread(process, (request_data, tmp, ))
            print("", request_data, request_data == 'exit')
    tcpSocket.close()
    pass


if __name__ == "__main__":
    serverIP = '127.0.0.1'
    serverPort = 8005
    _thread.start_new_thread(exit, (serverIP, serverPort, ))
    local(serverIP, serverPort)

    pass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值