# 練習 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 語言是如何實現它的。通過研究它,你將會深入了解套接字服務器的工作原理。唯一的警告是這本書有點過時,所以代碼應該工作,但它可能不是最新的代碼。
- 笨辦法學 Python · 續 中文版
- 引言
- 第一部分:預備知識
- 練習 0:起步
- 練習 1:流程
- 練習 2:創造力
- 練習 3:質量
- 第二部分:簡單的黑魔法
- 練習 4:處理命令行參數
- 練習 5:cat
- 練習 6:find
- 練習 7:grep
- 練習 8:cut
- 練習 9:sed
- 練習 10:sort
- 練習 11:uniq
- 練習 12:復習
- 第三部分:數據結構
- 練習 13:單鏈表
- 練習 14:雙鏈表
- 練習 15:棧和隊列
- 練習 16:冒泡、快速和歸并排序
- 練習 17:字典
- 練習 18:性能測量
- 練習 19:改善性能
- 練習 20:二叉搜索樹
- 練習 21:二分搜索
- 練習 22:后綴數組
- 練習 23:三叉搜索樹
- 練習 24:URL 快速路由
- 第四部分:進階項目
- 練習 25:xargs
- 練習 26:hexdump
- 練習 27:tr
- 練習 28:sh
- 練習 29:diff和patch
- 第五部分:文本解析
- 練習 30:有限狀態機
- 練習 31:正則表達式
- 練習 32:掃描器
- 練習 33:解析器
- 練習 34:分析器
- 練習 35:解釋器
- 練習 36:簡單的計算器
- 練習 37:小型 BASIC
- 第六部分:SQL 和對象關系映射
- 練習 38:SQL 簡介
- 練習 39:SQL 創建
- 練習 40:SQL 讀取
- 練習 41:SQL 更新
- 練習 42:SQL 刪除
- 練習 43:SQL 管理
- 練習 44:使用 Python 的數據庫 API
- 練習 45:創建 ORM
- 第七部分:大作業
- 練習 46:blog
- 練習 47:bc
- 練習 48:ed
- 練習 49:sed
- 練習 50:vi
- 練習 51:lessweb
- 練習 52:moreweb