Lighttpd1.4.20源码分析 笔记 状态机之请求处理

本文详细分析了Lighttpd服务器处理请求的过程,从CON_STATE_REQUEST_START开始,经过读取HTTP头、解析请求、处理POST数据到HANDLE_REQUEST状态,解释了HTTP请求的各个阶段以及状态机的工作原理,同时涉及了内存管理、临时文件处理和插件系统的交互机制。
摘要由CSDN通过智能技术生成

lighttpd请求处理的过程:

1.服务器与客户端建立连接后,连接进入CON_STATE_REQUEST_START状态,服务器做一些标记,如连接开始的时间等。

2.连接进入CON_STATE_READ状态,服务器从连接读取HTTP头并存放在con->requeset.request中。若一次调用没能读取全部数据,连接的状态将继续为READ,继续等待剩下的数据可读。
在对joblist进行处理的时候,依然会调用connecion_handle_read_state函数进行处理,函数中通过con->is_readable来判断是否有数据可读,如果没有,则只是处理一下以前已经读取的数据。

3.数据读取完之后,连接进入CON_STATE_REQUEST_END状态。

4.在REQUEST_END阶段,调用http_request_parse函数解析request请求。
函数首先解析Request line,解析出来的结果存放在con->request.http_method, con->request.http_version和con->request.uri中(前两个变量都是枚举类型,后一个是个buffer)。
解析完request line后,开始分析header lines。找到一个header field name后,就和所有已经定义的field name比较,看看是哪个。确定之后,就将field name和value保存到con->request.headers中。request.headers是一个array类型变量,存放的是data_string类型数据。其中,data_string的key是filed name,value就是field的成员。

5.解析完之后判断此次连接是否有POST数据,有则读取POST数据,否则进入HANDLE_REQUEST状态。

6.如果有POST数据要读,连接进入READ_POST状态。
READ_POST状态的处理和READ状态类似。
在connection_state_mechine函数中,这两个switch分支一样。在connection_handle_read_state函数中,前半部分读取数据是一样的,后面处理数据时才分开。
对于POST数据,由于数据可能很大,这时候可能会用到临时文件来存储。在程序中,作者对于小于64k的数据,直接存储在buffer中,大于64k则存储在临时文件中。在向临时文件写数据时,每个临时文件只写1M的数据。数据大于1M就再打开一个临时文件。
POST数据保存在con->requeset_content_que

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值