browsermob-proxy-2.1.4问题

在使用Browsermob-Proxy 2.1.4时遇到异常,创建代理失败,异常信息提示可能有另一个服务器正在同一端口运行。异常详细堆栈涉及到DefaultHttpProxyServer的启动失败,以及java.net.BindException,表明地址已被占用。代理的创建过程涉及向服务器发送POST请求获取包含代理端口的json响应。失败时,观察到服务器进程产生了pipe和anon_inode:[eventpoll]等文件描述符。初始化时有一次成功操作,随后连续三次尝试创建失败。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在创建代理时可能会发生失败

proxy = server.create_proxy()

异常信息:Exception(u'Could not read Browsermob-Proxy json\nAnother server running on this port?\njava.lang.RuntimeException: java.net.BindException: \u5730\u5740\u5df2\u5728\u4f7f\u7528\n\tat org.littleshoot.proxy.impl.DefaultHttpProxyServer.doStart(DefaultHttpProxyServer.java:545)\n\tat org.littleshoot.proxy.impl.DefaultHttpProxyServer.start(DefaultHttpProxyServer.java:489)\n\tat org.littleshoot.proxy.impl.DefaultHttpProxyServer.access$700(DefaultHttpProxyServer.java:69)\n\tat org.littleshoot.proxy.impl.DefaultHttpProxyServer$DefaultHttpProxyServerBootstrap.start(DefaultHttpProxyServer.java:858)\n\tat net.lightbody.bmp.BrowserMobProxyServer...',)

这个代理是一个Client对象,

class Client(object):
    def __init__(self, url, params=None, options=None):
        """
        Initialises a new Client object


        :param url: This is where the BrowserMob Proxy lives
        :param params: URL query (for example httpProxy and httpsProxy vars)
        :param options: Dictionary that can contain the port of an existing
                        proxy to use (for example 'existing_proxy_port_to_use')
        """
        params = params if params is not None else {}
        options = options if options is not None else {}
        self.host = "http://" + url
        if params:
            urlparams = "?" + unquote(urlencode(params))
        else:
            urlparams = ""
        if 'existing_proxy_port_to_use' in options:
            self.port = options['existing_proxy_port_to_use']
        else:
            resp = requests.post('%s/proxy' % self.host + urlparams)
            content = resp.content.decode('utf-8')
            try:
                jcontent = json.loads(content)
            except Exception as e:
                raise Exception("Could not read Browsermob-Proxy json\n"
                                "Another server running on this port?\n%s..." % content[:512])
            self.port = jcontent['port']
        url_parts = self.host.split(":")
        self.proxy = url_parts[1][2:] + ":" + str(self.port)

创建代理时, 向server发送post请求, 正常情况下返回一个json字符串, 其中包含代理端口。 失败的情况下,返回异常信息。

 

但是, 在失败的时候, 查看server进程的文件描述符, 发现会产生一些pipe、anon_inode:[eventpoll]等文件。

刚启动时:

 

成功执行1次:

 

发生3次创建失败:

 

 

 

你可以使用以下步骤来使用LittleProxy拦截指定端口的流量: 1. 首先,你需要在你的Java项目中添加LittleProxy的依赖,你可以在Maven中添加以下依赖: ``` <dependency> <groupId>org.littleshoot</groupId> <artifactId>littleproxy</artifactId> <version>1.1.2</version> </dependency> ``` 2. 接下来,你需要创建一个类来实现LittleProxy的HttpFiltersSource接口,这个接口用于拦截HTTP请求和响应,并在它们到达代理服务器时执行一些操作。以下是一个示例实现: ``` import org.littleshoot.proxy.HttpFilters; import org.littleshoot.proxy.HttpFiltersSource; import org.littleshoot.proxy.impl.DefaultHttpFiltersSource; public class MyFiltersSource implements HttpFiltersSource { @Override public HttpFilters filterRequest(HttpRequest originalRequest) { return new MyFilters(originalRequest); } @Override public int getMaximumRequestBufferSizeInBytes() { return DefaultHttpFiltersSource.DEFAULT_REQUEST_BUFFER_SIZE_BYTES; } @Override public int getMaximumResponseBufferSizeInBytes() { return DefaultHttpFiltersSource.DEFAULT_RESPONSE_BUFFER_SIZE_BYTES; } } ``` 3. 然后,你需要创建一个类来实现LittleProxy的HttpFilters接口,这个接口用于处理HTTP请求和响应,并在它们到达代理服务器时执行一些操作。以下是一个示例实现: ``` import org.littleshoot.proxy.HttpFilters; import org.littleshoot.proxy.HttpFiltersSource; import org.littleshoot.proxy.HttpRequest; import org.littleshoot.proxy.HttpResponse; public class MyFilters implements HttpFilters { private final HttpRequest originalRequest; public MyFilters(HttpRequest originalRequest) { this.originalRequest = originalRequest; } @Override public HttpResponse clientToProxyRequest(HttpObject httpObject) { // 在这里处理客户端到代理服务器的HTTP请求 return null; } @Override public HttpResponse proxyToServerRequest(HttpObject httpObject) { // 在这里处理代理服务器到目标服务器的HTTP请求 return null; } @Override public HttpObject serverToProxyResponse(HttpObject httpObject) { // 在这里处理目标服务器到代理服务器的HTTP响应 return null; } @Override public HttpObject proxyToClientResponse(HttpObject httpObject) { // 在这里处理代理服务器到客户端的HTTP响应 return null; } @Override public void proxyToServerConnectionQueued() { // 在这里处理代理服务器连接到目标服务器之前的操作 } @Override public void proxyToServerConnectionStarted() { // 在这里处理代理服务器连接到目标服务器之后的操作 } @Override public void proxyToServerConnectionSSLHandshakeStarted() { // 在这里处理代理服务器与目标服务器之间的SSL握手操作 } @Override public void proxyToServerConnectionSucceeded(ChannelHandlerContext serverCtx) { // 在这里处理代理服务器与目标服务器之间的连接成功操作 } @Override public void proxyToServerConnectionFailed() { // 在这里处理代理服务器与目标服务器之间的连接失败操作 } } ``` 4. 最后,你需要创建一个Main类,来启动LittleProxy服务器,并将HttpFiltersSource传递给它。以下是一个示例实现: ``` import org.littleshoot.proxy.HttpProxyServer; import org.littleshoot.proxy.extras.SelfSignedMitmManager; import org.littleshoot.proxy.impl.DefaultHttpProxyServer; public class Main { public static void main(String[] args) { HttpFiltersSource filtersSource = new MyFiltersSource(); HttpProxyServer server = DefaultHttpProxyServer.bootstrap() .withPort(8080) .withFiltersSource(filtersSource) .withManInTheMiddle(new SelfSignedMitmManager()) .start(); // 停止代理服务器 server.stop(); } } ``` 在这个示例中,代理服务器监听8080端口,并使用MyFiltersSource拦截所有HTTP请求和响应。你可以根据你的需求修改这个示例,以拦截指定端口的流量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值