引用:

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. 读耗子叔的《从Equifax信息泄露看数据安全》

    本文永久地址:https://www.cnblogs.com/erbiao/p/9214219.html 最近正好看到耗子叔<从Equifax信息泄露看数据安全>这篇文章,就来说一下这篇文 ...

  2. 20155230 2016-2017-2 《Java程序设计》第三周学习总结

    ---恢复内容开始--- 20155230 张瑞琦 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 1.使用浮点数时用equals()进行比较,否则会出错. ...

  3. 2017-2018-1 20155308《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155308<信息安全技术>实验二--Windows口令破解 实验原理 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理员的了解,猜测 ...

  4. 20155332 2016-2017-2 《Java程序设计》实验一 Java开发环境的熟悉

    实验内容 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调试Java程序. 实验知识点 JVM.JRE.JDK的安装位置与区别: 命令行运行javac:java:javac ...

  5. 20155336 2016-2017-2《JAVA程序设计》第一周学习总结

    # 20155336  2016-2017-2<JAVA程序设计>第1周学习总结 ## 教材学习内容总结 开学的第一周,带着些许的欣喜和好奇,听完了老师的第一堂课.说心里话学习JAVA仿佛 ...

  6. 【SQLSERVER】递归查询算法实例

    一.递归查询 1.结构: 递归CTE最少包含两个查询(也被称为成员). 第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点. 第二个查询被称为递归成员,使该查询称为递归成员 ...

  7. 【LG4067】[SDOI2016]储能表

    [LG4067][SDOI2016]储能表 题面 洛谷 题解 这种$n$.$m$出奇的大的题目一看就是数位$dp$啦 其实就是用一下数位$dp$的套路 设$f[o][n][m][k]$表示当前做到第$ ...

  8. Java读取Propertity文件

    读取propertity 文件其实很简单,就是每次容易搞错文件路径,今天刚好项目又用到了,顺便记下来,以便以后参考: 目录如下: 代码如下: package com.infs.exam.process ...

  9. 试用一下markdown

    1 2 3 4 5 6 Blog

  10. 使用SCSS扩展Bootstrap4

    摘要 因为打算写一个小网站,而个人时间又不是那么充裕,所以没有选择前后端分离的架构. 对于非前后端分离应用来说,Bootstrap应该是目前的最佳前端框架之一了. 而Bootstrap4,是Boots ...