Lighttpd1.4.20源码分析之状态机(4) 错误处理和连接关闭

Lighttpd所要处理的错误分为两种。一种是http协议规定的错误,如404错误。另一种就是服务器运行过程中的错误,如write错误。

对于http协议规定的错误,lighttpd返回相应的错误提示文件。其实对于lighttpd而言,这不算错误。在返回错误提示文件后,相当于顺利的完成了一次请求,只是结果和客户端想要的不一样而已。

对于服务器运行中的错误,状态机会直接进入CON_STATE_ERROR状态。大部分的情况下,这种错误都是由客户端提前断开连接所造成的。比如你不停的刷新页面,在你刷新的时候,前一次的连接没有完成,但被浏览器强行断开,这时,服务器就会出现连接错误。对于服务器而言,刷新前后的两个连接是不相干的。因此,服务器在接收后一个连接的时候仍然会继续处理前一次的连接。而这时前一次的连接已经断开,这就产生了连接错误。

进入CON_STATE_ERROR状态后,如果前面的处理已经得到了结果。也就是http_status不为空。那么调用plugins_call_handle_request_done告诉插件请求处理结束。

/*
* even if the connection was drop we still have to write it to the
* access log
*/
if (con->http_status)
{
plugins_call_handle_request_done(srv, con);
}

接着,如果使用了ssl,关闭ssl连接。关闭ssl连接的代码很长,但大部分都是错误处理。再朝后,如果连接模式不是DIRECT,调用plugins_call_handle_connection_close告诉插件连接已经关闭。到此,如果连接没有设置keep_alive,那么关闭连接并做一些清理工作之后就直接结束状态机的运行了。

如果设置了keep_alive,此时可能是服务器首先关闭连接的。调用shutdown关闭连接的读和写。如果关闭没有出错,状态机进入CON_STATE_CLOSE状态。

 1     /* 2             * close the connection 3             */ 4            if ((con->keep_alive == 1) && (0 == shutdown(con->fd, SHUT_WR))) 5            { 6                con->close_timeout_ts = srv->cur_ts; 7                connection_set_state(srv, con, CON_STATE_CLOSE);、 8                if (srv->srvconf.log_state_handling) 9                {10                    log_error_write(srv, __FILE__, __LINE__, "sd",11                                    "shutdown for fd", con->fd);12                }13            }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索服务器
, 错误
, 关闭连接
, 状态
, 处理
, shutdown
CON
lighttpd源码分析、lighttpd源码、lighttpd源码分析 pdf、lighttpd源码下载、lighttpd 1.4.35,以便于您获取更多的相关知识。

时间: 2024-12-10 01:28:22

Lighttpd1.4.20源码分析之状态机(4) 错误处理和连接关闭的相关文章

Lighttpd1.4.20源码分析之状态机(3)返回response

好久没顾这个了,最近比较清闲,重新拾掇一下,有始有终. 回到正题,前一篇介绍完了请求的处理,先面lighttpd将会把处理的结果返回给客户端.状态机进入CON_STATE_RESPONST_START.在这个状态中,服务器主要的工作在函数connection_handle_write_prepare.这个函数不算复杂,主要是根据客户端请求的method来设置response的headers,其实就是设置"Content-Length"的值.下面是函数代码,做了一些删减: 1 stati

Lighttpd1.4.20源码分析之状态机(2)---通过状态机看连接处理1

前面大概的介绍了一下lighttpd的状态机.在这篇中,将通过状态机,看看lighttpd到底是怎样处理 连接请求的. 在本篇中,我们只介绍lighttpd的最基本功能──处理静态页面.lighttpd处理静态页面要使用 mod_staticfile.c插件.从名字中也可以看出是用来处理静态文件的.另外这个插件在配置文件中没有配 置,是lighttpd默认会加载的. 首先还是把状态机放这,以便查阅.

Lighttpd1.4.20源码分析之状态机(1)---状态机总览

前面讲了lighttpd的fdevent系统,从这一篇开始,我们将进入lighttpd的状态机.状态机可以说是lighttpd最核心的部分.lighttpd将一个连接在不同的时刻分成不同的状态,状态机则根据连接当前的状态,决定要对连接进行的处理以及下一步要进入的状态.下面这幅图描述了lighttpd的状态机:

lighttpd1.4.20源码分析 -工作模型

lighttpd的工作模型很简单──一个主进程加多个工作进程的多进程模型,也就是所谓的watcher-worker模型. 整个程序的入口(main函数)在server.c文件中.在main函数的开始部分必然是处理参数和各种繁杂的初始化工作.其中有两个地方要重点看一起.第一个是下面的语句: 1 if (test_config) //没有进行任何测试... 2 { 3 printf("Syntax OK\n"); 4 } 这个If语句是为了判断配置文件的语法是否合法.但是,明显,没有进行任

php源码分析之DZX1.5随机数函数random用法

  本文实例讲述了php源码分析之DZX1.5随机数函数random用法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?php /** * @param int $length: 随机数长度 * @param int $numeric: 0或非0,其中0表示随机数由全数字组成,非0表示随机数由全字母组成 * @return string: 返回生成的随机数 */ function random($l

php源码分析之DZX1.5加密解密函数authcode用法

  本文实例讲述了php源码分析之DZX1.5加密解密函数authcode用法.分享给大家供大家参考.具体分析如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 <?php $authkey

php源码分析之DZX1.5字符串截断函数cutstr用法

  本文实例讲述了php源码分析之DZX1.5字符串截断函数cutstr用法.分享给大家供大家参考.具体分析如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 <?php /** * 函数来源DZX1.5,文件所在 /source/function/func

Spring AOP源码分析(八)SpringAOP要注意的地方

SpringAOP要注意的地方有很多,下面就举一个,之后想到了再列出来:  (1)SpringAOP对于最外层的函数只拦截public方法,不拦截protected和private方法,另外不会对最外层的public方法内部调用的其他方法也进行拦截,即只停留于代理对象所调用的方法.如下案例:  B类有两个public方法,foo1()和foo2(),foo1内部调用了foo2,简单如下:  ? 1 2 3 4 5 6 7 8 public void foo2() {          Syste

《深入理解SPARK:核心思想与源码分析》(第1章)

       自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售,欢迎感兴趣的同学购买.我开始研究源码时的Spark版本是1.2.0,经过7个多月的研究和出版社近4个月的流程,Spark自身的版本迭代也很快,如今最新已经是1.6.0.目前市面上另外2本源码研究的Spark书籍的版本分别是0.9.0版本和1.2.0版本,看来这些书的作者都与我一样,遇到了这种问