1
0
mirror of https://github.com/apachecn/lmpythw-zh.git synced 2025-05-28 12:02:19 +00:00
lmpythw-zh/ex52.md
wizardforcel f4546f266f ex52
2017-08-16 21:18:38 +08:00

34 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 练习 52`moreweb`
> 原文:[Exercise 52: moreweb](https://learncodethehardway.org/more-python-book/ex52.html)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
现在,你已经使用 Python `http.server`库创建了一个 Web 服务器。你已经进行到最后一个项目了。你将使用你至今为止所学到的所有东西,从无到有创建你自己的 Web 服务器。在练习 51 中,你创建了大部分操作,它在`http.server`模块“上面”。你没有进行任何网络连接处理或 HTTP 协议解析。在最后的练习中,你将为你的`lessweb`服务器复制`http.server`(所做的一切),并实现所有必要的零件。
## 挑战练习
为了完成此练习,你将需要阅读 [Python 3 `asyncio`模块](https://docs.python.org/3/library/asyncio.html)的文档。这个库为你提供了工具,用于处理套接字请求,创建服务器,等待信号,以及大部分所需的其它东西。如果你想要一个额外的挑战,那么你可以使用 [Python 3 `select`](https://docs.python.org/3/library/select.html)模块,它提供了更低的级别的 API 来处理套接字。你应该使用此文档,来创建一系列小型套接字服务器和客户端。
一旦你了解如何创建通过 TCP/IP 套接字通话的服务器和客户端,则需要转而处理 HTTP 请求。该项目的这一部分将十分艰巨,因为 HTTP 标准丧心病狂,并且比其需要更复杂。我将从你可以设计的,最简单的 HTTP 解析库开始,然后用越来越多的样本进行扩展。第一个起始位置是 [RFC 7230](https://tools.ietf.org/html/rfc7230),但准备好体验一些人类搞出来的,最糟糕的写作。
研究 RFC 7230 的最佳方式是,首先提取[“ABNF 汇总”附录](https://tools.ietf.org/html/rfc7230#appendix-B)中列出的所有语法。一眼看去,这似乎是疯狂的,因为这只是一个巨大的语法规范。你实际上在这本书的第五部分中,学到了如何阅读它,但是规模较小。你知道正则表达式,扫描器和解析器的工作原理,以及如何阅读这样的语法。所有你需要做的是研究这种语法,并一次实现一点。在实现它的时候,我将完全忽略任何“块”语法。
一旦你研究了这个语法,你应该开始为 HTTP 编写解析器,使用你已经创建的东西。使用你的数据结构,解析工具以及任何东西,来为 HTTP 的小型子集创建解析器。覆盖尽可能多的这种语法。为了帮助你,有一组测试文件,其中具有有效的 HTTP 请求,请访问 <https://learncodethehardway.org/more-python-book/http_tests.zip>。你可以下载这组测试用例,并通过你的解析器运行它们,来确保它有用。我从杰出的 [And-HTTP](http://www.and.org/and-httpd/) 服务器中提取了许多这些测试用例,然后用更基本的例子来扩展它们。你的目标是使它们尽可能多地通过。
最后,一旦你有了一种方式,来编写一个良好的`asyncio`或者`select`套接字服务器,和一种解析 HTTP 的方式,你可以把它们放在一起,制作你的第一个带有功能的 Web 服务器。
## 破坏它
你一定要试图破坏这个 Web 服务器,但你也应该在这里尝试不同的东西。你已经编写了一个 HTTP 解析器,尝试使用 RDP 风格的解析器,以最合理的方式处理有效的 HTTP。你的解析器有很好的机会来阻止许多不好的 HTTP 请求,所以找到一些以前的攻击,并在你的 Web 服务器上尝试它们。有几个网站上有自动化黑客工具,所以获取一个并将其对准你的服务器。但是要小心,并确保你只运行著名的测试工具,并且只在你自己的服务器上。
## 深入学习
如果你想完全了解 Web 服务器和技术,请使用你的`moreweb `服务器来创建 Web 框架。我建议先创建一个网站,然后从 Web 框架中提取出所需的模式。这种框架的目标是,封装你使用的模式,以便你可以简化后续的 Web 应用程序。与`lessweb ``moreweb`的练习一样,你的目标也应该是研究,实现和利用 Web 框架的常见攻击。
如果你想深入 TCP/IP我推荐 Jon C. Snader 的[《Effective TCP/IP Programming》](http://amzn.to/1o50HYC)一书。这本书是用 C 语言写的,但它实际上是“笨办法学 TCP/IP》涵盖 44 个主题,为你准备了简单的代码来了解基本的 TCP/IP 的工作原理。C 语言是 TCP/IP 的出生地,其他语言处理套接字连接的方式似乎很奇怪,直到你知道 C 语言是如何实现它的。通过研究它,你将会深入了解套接字服务器的工作原理。唯一的警告是这本书有点过时,所以代码应该工作,但它可能不是最新的代码。