今年我们组计划写一本nginx模块开发以及原理解析方面的书,整本书是以open book的形式在网上会定时的更新,网址为http://tengine.taobao.org/book/index.html。本书分析的nginx源码版本为1.2.0,环境为linux,事件处理模型为epoll,大部分分析流程都基于以上假设。我会负责其中一些章节的编写,所以打算在这里写一系列我负责章节内容相关的文章(主要包括nginx各phase模块的开发,nginx请求的处理流程等)。本篇文章主要会介绍nginx中请求的接收流程,包括请求头的解析和请求体的读取流程。
首先介绍一下rfc2616中定义的http请求基本格式:
Request = Request-Line
*(( general-header
| request-header
| entity-header ) CRLF)
CRLF
[ message-body ]
第一行是请求行(request line),用来说明请求方法,要访问的资源以及所使用的HTTP版本:
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
请求方法(Method)的定义如下,其中最常用的是GET,POST方法:
Method = "OPTIONS"
| "GET"
| "HEAD"
| "POST"
| "PUT"
| "DELETE"
| "TRACE"
| "CONNECT"
| extension-method
extension-method = token
<scheme>://<authority><path>?<query>
一般来说根据请求方法(Method)的不同,请求URI的格式会有所不同,通常只需写出path和query部分。
http版本(version)定义如下,现在用的一般为1.0和1.1版本:
HTTP/<major>.<minor>