前言

上上周nick老师出了道题,让我们用socket实现web server,巩固http协议。后续还会有https和tcp、代理什么的,目前我已经实现了 web server,这里记录一下里面的坑点和有意思的地方吧。



简单说一下实现的大概思路

  1. 请求和响应有多大,要接受多少字节
  • 如何知道自己要接受多少字节

    1、无请求体的以 \r\n\r\n为结束点,当收到\r\n\r\n的时候代表接受请求完毕

    2、有请求体要分为两部分接受(理论上),先接受请求头(还是以\r\n\r\n结束),然后在请求头里面找到Content-Length字段,Content-Length字段的值就是请求体的大小,然后在接受这么大的请求体就算接受完了。其实最好请求里面还要有*Content-Type字段,这样服务器识别请求体是什么类型的好读取

    3、如果不按照上面的来回怎样,就会向下面这样一直等待接收,因为你不知道他的请求有多大,一直等到客户端超时,然后结束会话

    image-20200920152404937

    4、然后网站找的好多,都是下面这样的,直接接收一次就返回响应,那他的请求大于你的缓冲区怎么办,虽然是简单实现。

    image-20200920153703751

    5、最后我是这么实现的

    image-20200920153851089

  • 如何让客户端知道自己要发了多少

    和上面一样,以\r\n\r\n分割,然后Content-Length写响应体的大小


  1. 然后就是路径名,实在是太绕了(在服务器上你得用相对路径 ./, 响应的时候你又要用/ ),提醒千万要注意路径是否正确,尽量用相对路径,这样绝对路径泄漏的几率会变小,然后就是小心目录穿越,以及文件名可能被url编码,最后我是这样写的

    image-20200920162925173

  2. 我看人家的都有这个目录索引,我就也整了一个

image-20200921174252807

image-20200921173058390

4、最后我又用目录扫描测了一下性能,开60线程比python自带的webserver还快一点

https://github.com/not-know/python-socket-webserver



0
最后修改日期:2020年9月21日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。