我正在尝试模拟HTTP api的一些小部分(以针对某些脚本进行测试-这些脚本旨在与实现完整API的某些软件一起运行,但是很难运行并向其提供初始数据以进行测试)。
到目前为止,我有一个使用IO :: Socket :: INET侦听TCP连接的小型perl脚本,该脚本可以很好地模拟GET请求,但是我还必须处理一些POST请求,为此,我有点卡住。我阅读标题很好,并找到例如“内容长度:20”,但随后我必须读取通常不以换行符结尾的那20个字节。
我尝试过
$client_socket->recv($data, $content_length);
和
sysread $client_socket, $data, $content_length;
,但两者都只在收到EOL时返回(我没有检查他们是否需要\n
,\r
或两者都没有,因为这并不重要),但是随后仅返回我要的字节。
我可能没有搜索正确的单词,我发现的是您可以在IO :: Socket :: INET上设置的超时仅用于连接,如果我使用IO :: Socket ::超时或将读取的结果包装到带警报的eval块中,不会读取任何内容。
当评论表明发生了其他事情时,我继续进行研究。如果我以前用$socket->recv
从套接字中读取,似乎$data = <$socket>
会改变行为,这是一个例子(不是一个完整的脚本-我认为这并不有趣,但是如果有人想要我可以提供一个) :
$client_socket->recv($data, 4);
print "1: $data\n";
$data = <$client_socket>;
print "2: $data\n";
$client_socket->recv($data, 4);
print "3: $data\n";
当在套接字上发送多行时,这仅输出带有1:
和2:
的行(我只是使用curl
来生成几行(我认为是7条数据))。 / p>
答案 0 :(得分:0)
使用read $client_socket, $data, 4
,我得到了一些符合我想要的代码。