引用:

https://github.com/adamfisk/LittleProxy

拦截和操纵HTTPS流量,LittleProxy使用中间人(MITM)管理器。 LittleProxy的默认实现(SelfSignedMitmManager)具有相当有限的功能集。 为了更好地控制证书模拟,浏览器信任,TLS握手等,请使用LittleProxy兼容的MITM扩展:

一个LittleProxy MITM扩展,旨在支持包括Android在内的所有Java平台
支持椭圆曲线加密和自定义信任存储的LittleProxy MITM扩展

要过滤HTTP流量,可以使用HttpFiltersSource(适配器)添加请求和响应过滤器,例如:

请参阅org.littleshoot.proxy.HttpFilters的Javadoc来查看您可以使用的方法。

要启用aggregator和inflater,必须在HttpFiltersSource#get(Request / Response)BufferSizeInBytes()方法中返回一个大于0的值。 这为您提供了一个“FullHttp(请求/响应)”,未压缩过滤器中的完整内容。 否则,你必须自己处理大块。

这个大小限制适用于每个连接。 例如,要禁止在* .iso或* dmg文件中通过URL进行聚合,您可以在过滤器源代码中返回如下所示的过滤器:

这可以在应用程序中进行大量的下载,这些应用程序定期处理大小有限的FullHttpResponses来修改其内容,例如HTML。

像LittleProxy这样的代理服务器总是包含一个Web服务器。 如果您在原始请求中获得没有方案,主机和端口的URI,那么这是对您的代理的直接请求。 您可以返回一个HttpFilters实现,它可以回答HTML内容的响应,或者像这样在clientToProxyRequest中重定向:

在回答重定向时,您应该添加一个Connection:close标头,以避免阻止行为:

<dependency>
<groupId>org.littleshoot</groupId>
<artifactId>littleproxy</artifactId>
<version>1.1.2</version>
<exclusions>
<exclusion>
<artifactId>netty-all</artifactId>
<groupId>io.netty</groupId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.19.Final</version>
</dependency> <dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.6-jre</version>
</dependency>

  

package com.pc.proxy;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.codec.http.HttpObject;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpResponse;
import org.littleshoot.proxy.HttpFilters;
import org.littleshoot.proxy.HttpFiltersAdapter;
import org.littleshoot.proxy.HttpFiltersSourceAdapter;
import org.littleshoot.proxy.HttpProxyServerBootstrap;
import org.littleshoot.proxy.impl.DefaultHttpProxyServer; public class ProxyServer { public static void main(String[] args) { HttpProxyServerBootstrap bootstrap = DefaultHttpProxyServer.bootstrap(); bootstrap.withPort(8080)
.withFiltersSource(new HttpFiltersSourceAdapter() { @Override
public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) {
return new HttpFiltersAdapter(originalRequest) { @Override
public HttpResponse clientToProxyRequest(HttpObject httpObject) {
// TODO: implement your filtering here
return new AnswerRequestFilter(originalRequest,"test").clientToProxyRequest(httpObject);
} @Override
public HttpObject serverToProxyResponse(HttpObject httpObject) {
// TODO: implement your filtering here
return httpObject;
} @Override
public void proxyToServerConnectionSucceeded(ChannelHandlerContext serverCtx) {
ChannelPipeline pipeline = serverCtx.pipeline();
if (pipeline.get("inflater") != null) {
pipeline.remove("inflater");
}
if (pipeline.get("aggregator") != null) {
pipeline.remove("aggregator");
}
super.proxyToServerConnectionSucceeded(serverCtx);
} };
} @Override
public int getMaximumResponseBufferSizeInBytes() {
return 10 * 1024 * 1024;
} }); bootstrap.start();
} }

  

package com.pc.proxy;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.*;
import org.littleshoot.proxy.HttpFiltersAdapter; import java.io.UnsupportedEncodingException; public class AnswerRequestFilter extends HttpFiltersAdapter {
private String answer; public AnswerRequestFilter(HttpRequest originalRequest, String answer) {
super(originalRequest, null);
this.answer = answer;
} public AnswerRequestFilter(HttpRequest originalRequest, ChannelHandlerContext ctx) {
super(originalRequest, ctx);
} @Override
public HttpResponse clientToProxyRequest(HttpObject httpObject){
ByteBuf buffer = null;
try {
buffer = Unpooled.wrappedBuffer(answer.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
HttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, buffer);
HttpUtil.setContentLength(response, buffer.readableBytes());
// HttpHeaders.setHeader(response, HttpHeaders.Names.CONTENT_TYPE, "text/html");
response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/html");
return response;
}
}

  

高性能的HTTP代理 LittleProxy的更多相关文章

  1. 高性能的Redis代理TwemProxy

    TwemProxy是一个Redis的中间件代理,具有很多有用的功能,可以暂时替代一部分Redis Cluster的功能: ²  支持和6479.之后相应地,配置好两个Redis实例并启动.现在就可以启 ...

  2. For Freedom —— 代理篇

    人生在世,总是受到各种约束.心脏跳动都感到困难呢!! 公司内网,安全区,fq等等等~~我们需要一个稳定易用高性能高弹性的代理工具!3Proxy,Here it is, CLICK ME!! 简单介绍下 ...

  3. Java Web 高性能开发,第 2 部分: 前端的高性能

    Web 发展的速度让许多人叹为观止,层出不穷的组件.技术,只需要合理的组合.恰当的设置,就可以让 Web 程序性能不断飞跃.Web 的思想是通用的,它们也可以运用到 Java Web.这一系列的文章, ...

  4. Java Web 高性能开发,第 1 部分: 前端的高性能

    Web 发展的速度让许多人叹为观止,层出不穷的组件.技术,只需要合理的组合.恰当的设置,就可以让 Web 程序性能不断飞跃.所有 Web 的思想都是通用的,它们也可以运用到 Java Web.这一系列 ...

  5. 使用 FRP 反向代理实现 Windows 远程连接

    互联网普及率的日渐攀升与 IPv4 资源的持续减少,现在大部分家庭宽带都不会分配公网 IP ,这使一些网络应用的实现多了些困难,像个人的 NAS 和一些智能家居设备.对于分配公网 IP ,各地运营商的 ...

  6. Java Web 高性能开发,前端的高性能

    Java Web 高性能开发,第 2 部分: 前端的高性能 Web 发展的速度让许多人叹为观止,层出不穷的组件.技术,只需要合理的组合.恰当的设置,就可以让 Web 程序性能不断飞跃.Web 的思想是 ...

  7. FRP代理及其在数据库安全上的实践

    1 代理 现如今的互联网世界里,代理服务已经十分常见,它通常作为一个第三方或者说中转站角色替代用户取得信息或者服务. 根据代理对象的不同,代理服务可以分为正向代理和反向代理. 1.1 正向代理 我们通 ...

  8. 浅析web网站反向代理的配置

    一.背景 最近在部署项目到web服务器上时,该项目有一个打开视频监控的功能,视频的服务器是一台内网的服务器,不允许设置外网端口访问,网站服务器和视频服务器在同一个局域网内,可以相互联通.网络拓扑图如下 ...

  9. 【代理】内网穿透工具 frp&frps

    frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发. ### frp 的作 ...

随机推荐

  1. C-编译器的实现

    写这个编译器的目的,是为了完成编译原理课上老师布置的大作业,实际上该大作业并不是真的实现一个编译器,而我选择硬刚,是为了完成我的小愿望--手写内核,编译器和CPU.我花了整个上半学期,写完了WeiOS ...

  2. 【课堂实践】Myod和Mycp

    实验内容 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 实验代码 od.java 截图 遇到的问题及解决办法 一开始想的方向是将得出的功能结果 ...

  3. 实现Django ORM admin view中model字段choices取值自动更新的一种方法

    有两个表,一个是记录网站信息的site表,结构如下: CREATE TABLE `site` ( `id` ) unsigned NOT NULL AUTO_INCREMENT, `name` ) N ...

  4. vcruntime140.dll 丢失64位系统

    1. 下载VC Redistributable for VS2015,网址https://www.microsoft.com/en-us/download/confirmation.aspx?id=4 ...

  5. 我们一起学习WCF 第四篇单通讯和双向通讯

    前言:由于个人原因很久没有更新这个系列了,我会继续的更新这系列的文章.这一章是单向和双向通讯.所谓的单向就是只有发送却没有回复,双向是既有发送还有回复.就是有来无往代表单向,礼尚往来表示双向.下面我用 ...

  6. Spring学习(十二)-----Spring Bean init-method 和 destroy-method实例

    实现 初始化方法和销毁方法3种方式: 实现标识接口 InitializingBean,DisposableBean(不推荐使用,耦合性太高) 设置bean属性 Init-method destroy- ...

  7. ASP.NET获取汉字拼音的首字母

    代码 #region GetChineseSpell获取汉字拼音的第一个字母 //获取汉字拼音的第一个字母 static public string GetChineseSpell(string st ...

  8. 教程:将应用迁移到 DirectX* 12 – 第 1 部分

    原文地址 简介 随着微软* 新版操作系统 Windows 10* 的发布,核心图形技术将升级到最新的 DirectX* 12.要帮助拥有 DirectX* 开发经验的程序员熟悉 DirectX* 12 ...

  9. Zookeeper--java操作zookeeper

    如果是使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper-3.4.5.jar 和 zkclien ...

  10. Java实现网上商城

    // 第一个JavaWeb项目 //练手项目没有使用框架 github下载 https://github.com/dejavudwh/Online-Shopping 项目截图 1.基本实现了购物网站该 ...