//功能: 丢弃http包体的首次回调函数,如果一次性不能全部接收完成并丢弃,则设置
// 读事件的回调为ngx_http_discarded_request_body_handler
ngx_int_t ngx_http_discard_request_body(ngx_http_request_t *r)
{
//需要丢弃的包体不用考虑超时问题
if (rev->timer_set)
{
ngx_del_timer(rev);
}
//包体长度小于等于0,则直接返回。表示丢弃包体
//如果已经接收过包体了,这时也不需要在接收。通常情况下get请求没有包体,因此包体长度为0
if (r->headers_in.content_length_n <= 0 || r->request_body)
{
return NGX_OK;
}
size = r->header_in->last - r->header_in->pos;
//已经预先接收了部分包体
if (size)
{
//包体未全部接收完成
if (r->headers_in.content_length_n > size)
{
r->header_in->pos += size;
r->headers_in.content_length_n -= size;
}
else
{
//包体已经全部接收
r->header_in->pos += (size_t) r->headers_in.content_length_n;
r->headers_in.content_length_n = 0;
return NGX_OK;
}
}
//设置后续读事件的回调
r->read_event_handler = ngx_http_discarded_request_body_handler;
//注册读事件回调,插入到epoll
ngx_handle_read_event(rev, 0));
//接收包体内容
if (ngx_http_read_discarded_request_body(r) == NGX_OK)
{
//表示已经接收到完整的包体了,将延迟关闭清0
r->lingering_close = 0;
}
else
{
//表示需要多次调度才能完成丢弃包体这个操作,于是把引用计数加1,防止这边在丢弃包体,而其他
//事件却已经让请求意外销毁
r->count++;
//标识为正在丢弃包体
r->discard_body = 1;
}
return NGX_OK;
}
//功能: 从内核中读取数据到nginx中,nginx不对收到的数据进行处理。相当于丢弃包体
static ngx_int_t ngx_http_read_discarded_request_body(ngx_http_request_t *r)
{
//用于接收包体的临时缓冲区
u_char buffer[NGX_HTTP_DISCARD_BUFFER_SIZE];
for ( ;; )
{
//已经全部丢弃成功
if (r->headers_in.content_length_n == 0)
{
//设置丢弃后的读事件回调,再有读事件时,不做任何处理
r->read_event_handler = ngx_http_block_reading;
return NGX_OK;
}
//从内核中接收包体到临时缓冲区
n = r->connection->recv(r->connection, buffer, size);
//更新剩余需要接收的包体大小
r->headers_in.content_length_n -= n;
}
}
//功能: 第1次未能全部丢弃包体时,该函数被调用。之后有读事件时,该函数被调用
void ngx_http_discarded_request_body_handler(ngx_http_request_t *r)
{
//检测延迟关闭时间,如果总时长超过了lingering_time,则不再接收任何包体,这是一个总时间。
//总超时后,将直接光比连接
if (r->lingering_time)
{
timer = (ngx_msec_t) (r->lingering_time - ngx_time());
//已经到达了延迟关闭时间
if (timer <= 0)
{
//清空丢弃包体标识,表示包体已经丢弃
r->discard_body = 0;
//延迟关闭开关清0
r->lingering_close = 0;
ngx_http_finalize_request(r, NGX_ERROR);
return;
}
}
//接收包体后丢弃
rc = ngx_http_read_discarded_request_body(r);
//表示包体已经全部丢弃
if (rc == NGX_OK)
{
r->discard_body = 0; //包体已经全部接收完
r->lingering_close = 0; //清空延迟关闭标志
ngx_http_finalize_request(r, NGX_DONE);
return;
}
}
static void ngx_http_request_handler(ngx_event_t *ev)
{
//如果同时发生读写事件,则只有写事件才会触发。写事件优先级更高
if (ev->write)
{
r->write_event_handler(r); //在函数ngx_http_handler设置为ngx_http_core_run_phases
}
else
{
r->read_event_handler(r); //在函数ngx_http_process_request设置为ngx_http_block_reading
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有