3月阅读周·HTTP权威指南:Web服务器之最小的Perl Web服务器篇

举报
叶一一 发表于 2025/03/16 19:06:29 2025/03/16
【摘要】 引言HTTP(Hypertext Transfer Protocol,超文本传输协议[插图])是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解...

引言

HTTP(Hypertext Transfer Protocol,超文本传输协议[插图])是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。

《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。

这本书主要包括以下内容:

  • 第一部分描述了Web的基础构件与HTTP的核心技术
  • 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
  • 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
  • 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
  • 第五部分介绍了发布和传播Web内容的技巧。
  • 第六部分是一些很有用的参考附录,以及相关技术的教程。

Web服务器

Web服务器每天会分发出数十亿的Web页面。这些页面可以告诉你天气情况,装载在线商店的购物车,还能帮你找到许久未联系的高中同学。Web服务器是万维网的骨干。

最小的Perl Web服务器

要构建一个特性完备的HTTP服务器,是需要做一些工作的。Apache Web服务器的内核有超过50000行的代码,那些可选处理模块的代码量更是远远超过这个数字。

这个软件所要做的就是支持HTTP/1.1的各种特性:丰富的资源支持、虚拟主机、访问控制、日志记录、配置、监视和性能特性。在这里,可以用少于30行的Perl代码来创建一个最小的可用HTTP服务器。我们来看看这是怎么实现的。

一个名为type-o-serve的小型Perl程序。这个程序是个很有用的诊断工具,可以用来测试与客户端和代理的交互情况。与所有Web服务器一样,type-o-serve会等待HTTP连接。只要type-o-serve收到了请求报文,就会将报文打印在屏幕上,然后等待用户输入(或粘贴)一条响应报文,并将其回送给客户端。通过这种方式,type-o-serve假扮成一台Web服务器,记录下确切的HTTP请求报文,并允许用户回送任意的HTTP响应报文。

这个简单的type-o-serve实用程序并没有实现大部分的HTTP功能,但它是一种很有用的工具,产生服务器响应报文的方式与Telnet产生客户端请求报文的方式相同。

例1-1 type-o-serve——用于HTTP调试的最小型Perl Web服务器

#! /usr/bin/perl

use Socket;
use Carp;
use FileHandle;

# (1) use port 8080 by default, unless overridden on command line
$port = (@ARGV ? $ARGV[0] : 8080);

# (2) create local TCP socket and set it to listen for connections
$proto = getprotobyname('tcp');
socket(S, PF_INET, SOCK_STREAM, $proto) || die;
setsockopt(S, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die;
bind(S, sockaddr_in($port, INADDR_ANY)) || die;
listen(S, SOMAXCONN) || die;

# (3) print a startup message
printf("     <<<Type-O-Serve Accepting on Port %d>>>\n\n", $port);

while (1)
{
    # (4) wait for a connection C
    $cport_caddr = accept(C, S);
    ($cport, $caddr) = sockaddr_in($cport_caddr);
    C->autoflush(1);

    # (5) print who the connection is from
    $cname = gethostbyaddr($caddr, AF_INET);
    printf("     <<<Request From '%s'>>>\n", $cname);
    # (6) read request msg until blank line, and print on screen
    while ($line = <C>)
    {
        print $line;
        if ($line =~ /^\r/) { last; }
    }

    # (7) prompt for response message, and input response lines,
    #      sending response lines to client, until solitary "."
    printf("     <<<Type Response Followed by '.'>>>\n");

    while ($line = <STDIN>)
    {
        $line =~ s/\r//;
        $line =~ s/\n//;
        if ($line =~ /^\./) { last; }
        print C $line . "\r\n";
    }
    close(C);
}

如何用type-o-serve来测试HTTP通信的?

  • 首先,管理员启动了type-o-serve诊断服务器,在一个特定的端口上监听。由于Joe的五金商店已经有一个产品化的Web服务器在监听80端口了,所以管理员用下面这条命令在端口8080(可以选择任意未用端口)上启动了type-o-serve服务:
% type-o-serve.pl 8080
  • 只要type-o-serve开始运行了,就可以将浏览器指向这个Web服务器。
  • type-o-serve程序收到来自浏览器的HTTP请求报文,并将HTTP请求报文的内容打印在屏幕上。然后type-o-serve诊断工具会等待用户输入一条简单的响应报文,后面跟着只有一个句号的空行。
  • type-o-serve将HTTP响应报文回送给浏览器,浏览器会显示响应报文的主体。

总结

type-o-serve,小型Perl程序,它是个很有用的诊断工具,可以用来测试与客户端和代理的交互情况。与所有Web服务器一样,type-o-serve会等待HTTP连接。只要type-o-serve收到了请求报文,就会将报文打印在屏幕上,然后等待用户输入(或粘贴)一条响应报文,并将其回送给客户端。通过这种方式,type-o-serve假扮成一台Web服务器,记录下确切的HTTP请求报文,并允许用户回送任意的HTTP响应报文。


作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏️ | 留言📝

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。