Python杂记--使用asyncio构建HTTP代理服务器

Python杂记--使用asyncio构建HTTP代理服务器

    • 引言
    • 基础知识
    • 代码实现

引言

        本文将介绍 HTTP 代理的基本原理,并带领读者构建一个自己的 HTTP 代理服务器。代码中不会涉及到任何第三方库,全部由 asyncio 实现,性能优秀,安全可靠。


基础知识

        HTTP 代理(HyperText Transfer Protocol Proxy)是一种网络代理服务器,充当位于客户端和目标服务器之间的中间人。流程为,首先接收来自客户端的 HTTP 请求,然后转发这些请求到目标服务器,并将目标服务器的响应返回给客户端,如下所示:

        在上述流程中,我们需要知道来自客户端的 HTTP 请求的所有内容,包括请求方法,URL等信息,才能实现转发。但众所周知,目前大多数网站都是通过 HTTPS 访问的,而 HTTPS 是加密的,作为代理服务器,拿不到请求方法等敏感信息,那么还能够用 HTTP 代理转发 HTTPS 流量吗?答案是肯定的。此时需要用到 HTTP 中很少见的一种请求方法:CONNECT。客户端首先发送 CONNECT 请求,告诉代理服务器我想连接 A 网站,代理服务器就可以和 A 网站建立连接,实现流量的双向转发,而这不需要对内容进行解密,所以是安全的。具体流程如下所示:


代码实现

        原理其实是很简单的,在 Python 中具体实现如下所示:

import asyncio
from urllib.parse import urlparseasync def pipe(reader: asyncio.StreamReader, writer: asyncio.StreamWriter):while True:data = await reader.read(4096)if len(data) == 0:breakwriter.write(data)async def http_proxy(c_reader: asyncio.StreamReader, c_writer: asyncio.StreamWriter, url: str, header: bytes):result = urlparse(url)host, port = result.hostname, 80 if result.port is None else result.ports_reader, s_writer = await asyncio.open_connection(host, port)s_writer.write(header)async with asyncio.TaskGroup() as tg:tg.create_task(pipe(c_reader, s_writer))tg.create_task(pipe(s_reader, c_writer)).add_done_callback(lambda _: c_reader.feed_eof())s_writer.close()c_writer.close()async def https_proxy(c_reader: asyncio.StreamReader, c_writer: asyncio.StreamWriter, url: str):host, port = url.split(':')s_reader, s_writer = await asyncio.open_connection(host, port)c_writer.write(b'HTTP/1.1 200 Connection Established\r\n\r\n')async with asyncio.TaskGroup() as tg:tg.create_task(pipe(c_reader, s_writer))tg.create_task(pipe(s_reader, c_writer)).add_done_callback(lambda _: c_reader.feed_eof())s_writer.close()c_writer.close()async def handler(reader: asyncio.StreamReader, writer: asyncio.StreamWriter):header = await reader.readuntil(b'\r\n\r\n')method, url, _ = header.decode('utf-8').splitlines()[0].split(' ')if method == 'CONNECT':return await https_proxy(reader, writer, url)await http_proxy(reader, writer, url, header)async def main():server = await asyncio.start_server(handler, '127.0.0.1', 8080)async with server:await server.serve_forever()asyncio.run(main())

        运行后就在本地构建好了代理,我们使用 requests 库进行测试:

import requests
response = requests.get('https://www.baidu.com', proxies={'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/816323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux-文件系统理解(磁盘的物理与逻辑结构、什么是inode、OS如何管理磁盘)

一、磁盘 磁盘的物理结构 磁盘的本质是一个机械设备,可以存储大量的二进制信息,是实现数据存储的基础硬件设施,磁盘的盘片类似于光盘,不过盘片的两面都是可读可写可擦除的,每个盘面都有一个磁头,马达可以使…

攻防世界---Web_php_include

1.题目链接 2.补充知识&#xff1a; 3.构造&#xff1a;执行成功 /?pagedata://text/plain,<?php phpinfo()?> 4.构造下面url&#xff0c;得到目录路径 /?pagedata://text/plain,<?php echo $_SERVER[DOCUMENT_ROOT]?> 5构造下面url&#xff0c;读取该路径的…

【网站项目】面向企事业单位的项目申报小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Node.js、Java、Python、PHP在构建BS系统时的特点比较

在现代软件开发领域&#xff0c;构建一个稳定、高效的B/S&#xff08;浏览器/服务器&#xff09;系统对于企业的信息化发展至关重要。Node.js、Java、Python和PHP是当下流行的几种后端开发技术&#xff0c;它们各自具有独特的特点和优势。本文将对这几种技术在构建B/S系统时的特…

网络编程【InetAddress , TCP 、UDP 、HTTP 案例】

day38上 网络编程 InetAddress 理解&#xff1a;表示主机类 一个域名 对应 多个IP地址 public static void main(String[] args) throws UnknownHostException {//获取本机的IP地址 // InetAddress localHost InetAddress.getLocalHost(); // System.out.println(localHos…

简单认识Git(dirsearch、githack下载),git泄露(ctfhub)

目录 dirsearch下载地址: githack下载&#xff08;一次不成功可多试几次&#xff09; 一、什么是Git 1.git结构 2.git常用命令及示例 3.Git泄露原理 二、Git泄露 1.Log 2.Stash 3.Index 工具准备&#xff1a;dirsearch、githack dirsearch下载地址: GitHub - mauroso…

如何解决微信小程序无法使用css3过度属性transition

由于微信小程序不支持CSS3过度属性transition,所以我们需要利用微信小程序api进行画面过度的展示 首先是官方示例: wxml: <view animation="{{animationData}}" style="background:red;height:100rpx;width:100rpx"></view> js: Page(…

搭建Hive 3.x环境(CentOS 9 + Hadoop3.x)

零、资源准备 虚拟机相关&#xff1a; VMware workstation 16&#xff1a;虚拟机 > vmware_177981.zipCentOS Stream 9&#xff1a;虚拟机 > CentOS-Stream-9-latest-x86_64-dvd1.iso JDK jdk1.8&#xff1a;JDK > jdk-8u261-linux-x64.tar.gz Hadoop Hadoop 3.3.6&a…

【Java】内存可见性问题是什么?

文章目录 内存模型内存可见性解决方案volatile 内存模型 什么是JAVA 内存模型&#xff1f; Java Memory Model (JAVA 内存模型&#xff09;是描述线程之间如何通过内存(memory)来进行交互。 具体说来&#xff0c; JVM中存在一个主存区&#xff08;Main Memory或Java Heap Mem…

架构师系列-搜索引擎ElasticSearch(七)- 集群管理之分片

集群健康检查 Elasticsearch 的集群监控信息中包含了许多的统计数据&#xff0c;其中最为重要的一项就是集群健康&#xff0c;它在 status字段中展示为 green&#xff08;所有主分片和副本分片都正常&#xff09;、yellow&#xff08;所有数据可用&#xff0c;有些副本分片尚未…

Collection与数据结构 二叉树(三):二叉树精选OJ例题(下)

1.二叉树的分层遍历 OJ链接 上面这道题是分层式的层序遍历,每一层有哪些结点都很明确,我们先想一想普通的层序遍历怎么做 /*** 层序遍历* param root*/public void levelOrder1(Node root){Queue<Node> queue new LinkedList<>();queue.offer(root);while (!qu…

Vue 2实现未登录拦截页面功能

在Vue 2中实现未登录拦截页面功能&#xff0c;通常可以通过路由守卫和全局前置守卫来完成。以下是一个基本的实现步骤和示例代码&#xff0c;帮助你创建一个简单的未登录拦截逻辑。 步骤 1: 安装和配置路由 首先&#xff0c;确保你的Vue项目已经安装并配置了vue-router。如果…

Spring Boot(二)— 自定义Spring Boot Starter

在Spring Boot中&#xff0c;自定义Spring Boot Starter是一个常见且强大的功能&#xff0c;它允许开发者为特定的功能或库创建自己的自动配置&#xff0c;从而简化集成过程。 1 前置知识 Spring Boot的事件为应用的启动和关闭提供了详细的上下文信息&#xff0c;使得开发者能…

基于表面势的增强型p-GaN HEMT器件模型

来源&#xff1a;电子学报 22年 摘要 为了满足功率电路及系统设计对p-GaN HEMT&#xff08;High Electron Mobility Transistor&#xff09;器件模型的需求&#xff0c;本文建立了一套基于表面势计算方法的增强型p-GaN HEMT器件SPICE&#xff08;Simulation Program with Int…

Golang | Leetcode Golang题解之第27题移除元素

题目&#xff1a; 题解&#xff1a; func removeElement(nums []int, val int) int {left, right : 0, len(nums)for left < right {if nums[left] val {nums[left] nums[right-1]right--} else {left}}return left }

软件杯 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

Eland上传bge-large-zh-v1.5向量化模型到ElasticSearch中

最近需要做一些向量检索&#xff0c;试试ES 一、准备 系统&#xff1a;MacOS 14.3.1 ElasticSearch&#xff1a;8.13.2 Kibana&#xff1a;8.13.2 本地单机环境&#xff0c;无集群&#xff0c;也不基于Docker BGE是一个常见的文本转向量的模型&#xff0c;在很多大模型RAG应…

数据仓库—维度建模—维度表设计

维度表 维度表(Dimension Table)是数据仓库中描述业务过程中各种维度信息的表,用于提供上下文和描述性信息,以丰富事实数据的分析 维度表是维度建模的灵魂所在,在维度表设计中碰到的问题(比如维度变化、维度层次、维度一致性、维度整合和拆分等)都会直接关系到维度建模…

docker和kubernetes(k8s)

docker是什么 运行程序需要环境&#xff0c;不同的环境&#xff0c;程序运行的结果就不一样。将程序打包给其它客户端使用时&#xff0c;客户端需要自己配置相应的环境。我们将程序和环境一起打包给其它客户端&#xff0c;客户端可直接运行程序。docker容器作为程序和操作系统…

防汛物资仓库管理系统|实现应急物资仓库三维可视化

系统概述 智慧应急物资仓库可视化系统&#xff08;智物资DW-S300&#xff09;采用了 B/S 架构的设计&#xff0c;通过浏览器即可快速登录操作。实现对库房内的应急物资从申购入库、出库、调拨、库内环境监测、维修保养、检测试验、处置报废等全周期、科学、规范的管理。系统以…