专栏首页七夜安全博客tinyhttpd源码分析

tinyhttpd源码分析

前言

最近主要是做了一些开源项目的源码分析工作,有c项目也有python项目,想提升一下内功,今天分享一下tinyhttpd源码分析的成果。tinyhttpd是一个非常轻量型的http服务器,c代码500行左右,可以帮助我们了解http服务器运行的实质。在分析之前,我们先说一下http报文。

HTTP请求

http请求由三部分组成,分别是:起始行、消息报头、请求正文

Request Line<CRLF>

Header-Name: header-value<CRLF>

Header-Name: header-value<CRLF>

//一个或多个,均以<CRLF>结尾

<CRLF>

body//请求正文

1、起始行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:

Method Request-URI HTTP-Version CRLF

2、请求方法(所有方法全为大写)有多种,各个方法的解释如下:其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

  1. GET 请求获取Request-URI所标识的资源
  2. POST 在Request-URI所标识的资源后附加新的数据
  3. HEAD 请求获取由Request-URI所标识的资源的响应消息报头
  4. PUT 请求服务器存储一个资源,并用Request-URI作为其标识
  5. DELETE 请求服务器删除Request-URI所标识的资源
  6. TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
  7. CONNECT 保留将来使用
  8. OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

应用举例: GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,eg:

GET /form.html HTTP/1.1 (CRLF)

POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。eg:

POST /reg.jsp HTTP/ (CRLF)

Accept:image/gif,image/x-xbit,... (CRLF)

...

HOST:www.guet.edu.cn (CRLF)

Content-Length:22 (CRLF)

Connection:Keep-Alive (CRLF)

Cache-Control:no-cache (CRLF)

(CRLF) //该CRLF表示消息报头已经结束,在此之前为消息报头

user=jeffrey&pwd=1234 //此行以下为提交的数据

TinyHttpd源码分析

tinyhttpd总共包含以下函数:

按照以上顺序,看一下浏览器和tinyhttpd交互的整个流程。建议源码阅读顺序: main -> startup -> accept_request -> execute_cgi 

注释版源码

注释版源码已经放到github上了,以后所有的源码分析都会上传github上。

不过这个项目并不能直接在Linux上编译运行。它本来是在solaris上实现的,貌似在socket和pthread的实现上和一般的Linux还是不一样的,需要修改一部分内容。至于如何修改大家参考这篇文章,我也将修改版上传到github上了,名称为tinyhttpd-0.1.0_for_linux,大家可以clone下来,直接make编译即可。下面演示一下如何运行tinyhttpd,编译完成的效果如下:

下面运行./httpd,并在浏览器中访问。

tinyhttpd默认cgi脚本是perl脚本,比如color.cgi,位于htdocs目录下。

下面我想用python来实现cgi脚本,添加一些页面,为了更加了解cgi程序的运行实质,不用python封装好的cgi模块,完全手工打造。首先在htdocs目录下添加一个register.html页面,html文档内容如下:

这是一个表单,action指向register.cgi,method为post。下面看一下register.cgi,其实是个python脚本。

代码的意思是从标准输入中读取post中的数据,并将显示数据输出到标准输出中,对比一下流程图,更好理解。下面看一下运行效果。

公众号的阅读代码的体验不是很好,
大家还是阅读原文,去我的博客看吧

注释后的代码位于github:https://github.com/qiyeboy/SourceAnalysis

本文分享自微信公众号 - 七夜安全博客(qiye_safe),作者:七夜

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-01-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小玩意:golang加载执行shellcode

    今天看到一个比较好玩的东西,虽然原理很简单,但是使用golang来做还是挺新鲜,所以还是分享给大家。

    七夜安全博客
  • 元旦快乐--“跳一跳”辅助编写

    七夜安全博客
  • 不聊技术,只聊思考

    舒适区难道必定存在于工作很轻松,活的很爽那部分人吗?也不见得,他们的舒适区只是温水煮青蛙。。。

    七夜安全博客
  • 通过一个demo了解Redux

    TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象;使用数据流能帮我们明确了行为对应的响应,这和react的状态可预...

    牧云云
  • 一种二叉堆的泛化实现

    所谓二叉堆,其实就是一种完全二叉树或者近似完全二叉树,树中父节点的键值总是保持某种固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树也都是二叉堆.

    用户2615200
  • 不是生活所迫,是万万不会在北京写代码的

    以秦岭淮河为界,把中国的互联网版图画分为南北二派,目前,北派压倒性的优势领先南派,这优势主要在码农的数量。北派,主要是北京,可能是世界上码农密度最高的城市 ,没...

    Java高级架构
  • postman请求数据库方法(Omysql)

    windows https://jingyan.baidu.com/article/1876c8529c79e2890b1376dd.html mac http...

    软件测试君
  • VR机甲射击游戏《Code51:Mecha Arena》|末日废土下的机甲竞技场

    《Code51:Mecha Arena》(以下均简称《Code51》)是一款末日废土风格的VR机甲射击游戏。

    VRPinea
  • 《Code 51》再次迭代,新增教学PVE

    VRPinea
  • MRO工业品平台应用管理系统解决方案

    MRO工业品平台的基本概念简单可以分为两种:一是特指企业对生产及其设备的保养、维修;二是指代于航空维修领域的产品维修服务活动,现今企业将MRO系统借鉴于产品的运...

    数商云

扫码关注云+社区

领取腾讯云代金券