Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 了解LWP请求是如何发送的;“在电线上”;_Perl_Lwp_Lwp Useragent - Fatal编程技术网

Perl 了解LWP请求是如何发送的;“在电线上”;

Perl 了解LWP请求是如何发送的;“在电线上”;,perl,lwp,lwp-useragent,Perl,Lwp,Lwp Useragent,如果我使用LWP发送请求,则有一个方便的函数as_string,它告诉我刚才发送了什么请求。非常方便,事实上我对它没有任何问题。只是我注意到它肯定在骗我。例如,此代码: use v5.14.2; use LWP; my $response = LWP::UserAgent->new->get('http://user:pswd@example.com/'); say $response->request->as_string; 给出这个输出 GET http://use

如果我使用LWP发送请求,则有一个方便的函数
as_string
,它告诉我刚才发送了什么请求。非常方便,事实上我对它没有任何问题。只是我注意到它肯定在骗我。例如,此代码:

use v5.14.2;
use LWP;
my $response = LWP::UserAgent->new->get('http://user:pswd@example.com/');
say $response->request->as_string;
给出这个输出

GET http://user:pswd@example.com/
User-Agent: libwww-perl/6.13
但是网址肯定不是那样发送的!库必须解析出用户名和密码,添加适当的头,并添加主机头,等等。有没有一种简单的方法可以找出实际发送的内容?

有1个,您可以加载它来获取请求和响应的所有详细信息。该请求将在通过网络发送之前立即接收,并在返回时接收响应

您只需
在代码中的任意位置使用LWP::ConsoleLogger::Everywhere
。如果您想要更多的控制,该发行版中的主模块将允许您轻松调整设置

然而,这并不是通过网络传输的真实数据。如果您想知道它接收到什么,您需要使用类似于
tcpdump
的东西监视连接,然后查看它(这是非常高级的网络功能),或者可能将端点更改为您自己的IP地址,或者简单地
127.0.0.1
,然后使用netcat侦听特定端口

$ nc -l 8080
如果您将请求发送到该端口,您将在netcat中看到它



1) 免责声明:我是该模块的参与者

Neato!所以,仅仅使用LWP附带的东西并不容易吗?@MarkVY有。请看一下LWP::ConsoleLogger的代码。其实很简单。但我想它也会给你同样的东西。您将拥有一个可以转换为字符串的请求对象。我有一个关于TPCiA工作原理的演讲,但视频还没有发布。好吧,我想我看到你在这里做了什么。确保每个用户代理都使用一些处理程序创建,然后从LWP的角度来看,这些处理程序不是ops,除非它们非常仔细地检查请求和响应,并记录它们想要记录的内容。干净利落@差不多,是的。但我的只是无处不在的部分。其余的都是奥拉夫。无论如何,这个模块对你的工具箱来说是一个很好的补充。@MarkVY是的,我在火车上很无聊。需要使用LWP进行插入式调试,在我构建它之后,我去IRC询问它是否已经存在。是的,所以我在那里加了我的东西。Olaf的工作真的很棒。Re“
作为_string
告诉我刚才发送了什么请求”,不,它没有。LWP::UserAgent意思是LWP::Protocol意思是LWP::Protocol::http意思是Net::http不使用
->作为字符串。我无法解析您编写的内容。你是说请求最终会在Net::HTTP处结束,而Net::HTTP是真正写入套接字的人,但它会写入它想要的任何内容,而不会实际告诉调用方它写了什么?Net::HTTP是在使用LWP::UserAgent时执行实际提升的模块。//是的。那么Net::HTTP是否在任何地方“保存其工作”?当然,如果下面的答案是正确的,那么它一定是正确的吗?不。可能会在::Request对象中进行一些更改,但肯定不是全部,这就是为什么下面的答案说使用了有线嗅探器或虚拟服务器。