- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试创建一个透明的 HTTP 代理。它的目的是停留在浏览器和网络服务器之间并且是不可见的。这是我正在使用的代码。不幸的是,它不是很好用。当我打开网页(由 $base_uri
引用)时,会出现不同的结果,具体取决于我是仅使用浏览器打开它还是使用浏览器和代理打开它。我正在一个网站上尝试它,该网站返回各种响应,包括“transfer-encoding: chunked
”(所以我猜可能是问题所在?!)。我认为 cookie 也可能存在问题,但我不知道如何解决它们(如果有的话......)。
#!/usr/bin/perl
use strict;
use HTTP::Daemon;
use LWP::UserAgent;
use HTTP::Cookies;
my $cookie_jar = HTTP::Cookies->new();
my $ua = LWP::UserAgent->new( max_redirect => 0, env_proxy => 0,keep_alive => 1, timeout => 30, agent => "Mozilla/4.76 [en] (Win98; U)");
my $d = HTTP::Daemon->new(
LocalHost => "localhost", # remove this to listen from other machines
# (i.e. open-relay... be careful of spammers!)
LocalPort => 33331
) || die;
print "[Proxy URL:", $d->url, "]\n";
fork(); fork(); fork(); # 2^3 = 8 processes
$ua->cookie_jar($cookie_jar);
my $base_uri = 'http://example.com/';
while (my $c = $d->accept) {
while (my $request = $c->get_request) {
my $uri = $base_uri . $request->uri->as_string();
my $method = $request->method;
my $req = HTTP::Request->new($method, $uri);
$request->uri($uri);
print "[[ $method >> $uri ]]\n";
my $response = $ua->simple_request($request);
$c->send_response( $response );
}
$c->close;
undef($c);
}
提前致谢!
最佳答案
不清楚,你真正想要的是什么。你应该更好地描述它。如果您描述需要该代理的内容和原因以及它需要的功能,那么任何帮助都会好得多。不过我会试试的。
您目前所做的是获取一个传入连接,提取 URI 和调用方法并将其传递给您的源。好吧,HTTP 要复杂得多——你去掉所有的东西,比如传输的数据(例如 POST 请求)以及所有的标题行(cookies、登录数据、浏览器标识、语言规范……),这些通常包含重要信息.您还可以大量修改计时行为。然后将其发送到代理目标。
现在您获取服务器答案并再次删除所有相关内容。另外,您只能在完成后回复答案。对于流数据,这将不起作用(您已经提到了分块传输模式)。此外,您的方法需要大量内存来存储大文件(例如 DVD 镜像 - 4GB)。
如果没有关于您的应用程序的更多详细信息,则不可能提供真正的建议,但有一些想法:
a) 如评论中所述,有可用的 Perl 模块。您可以测试它们,看看它们是否符合您的需求。
b) 你可以下一层。使用 IO::Socket::INET
或 INET6
并直接在套接字级别上工作。将每个数据包直接发送到输出。这几乎是 100% 透明的(IP 地址和可能的 TCP 数据包大小除外)。认为如果您想更改或检查数据,您直接需要自己处理 HTTP,这在当今可能非常复杂(尤其是由于传输编码)。
c) 也许不要自己编写代码,而是使用现有代理(例如 Apache 网络服务器或特定代理程序)。
关于Perl透明代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13105058/
我是一名优秀的程序员,十分优秀!