Method URI Version(/r/n)
request headers(/r/n)
(/r/n)
request body
Version code msg(/r/n)
response headers(/r/n)
(/r/n)
response body
考虑Servlet的 service(ServletRequest req, ServletResponse res)方法,
1 Request implements ServletRequest , RequestFacade implements ServletRequest,响应同理
2 HttpRequest implements HttpServletRequest , HttpRequestFacade implements HttpServletRequest,响应同理
3 Request
读取输入流
解析请求行(uri存在查询字符串需要提出,jsessionid若存在需提出)
解析请求头:特殊处理:content-length, content-type, cookie(需单独解析cookie)
参数解析:查询字符串中提取,post且content-length大于0且content-type为application/x-www-form-urlencoded时需从请求体提取
根据uri判断是访问静态资源还是servlet(调用不同processor),访问servlet需要生成类加载器加载servlet类(类名uri传入),调用service方法。
StringManager:错误码- 错误描述的映射
1 按package区分,每个package一个StringManager,每个package下多个资源文件,StringManager读取哪一个呢?根据服务器语言环境来判别。
2 输入错误码获取错误描述
http 1.1
默认持久连接
分块编码 (响应头Transfer-Encoding: chunked),一般我们用content-length来界定请求或响应边界,但假设我们需要动态生成内容,很难获取内容长度,按照如下格式发送,浏览器就可以在无content-length下识别数据边界了。
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
1C\r\n
and this is the second one\r\n
8\r\n
sequence\r\n
0\r\n
\r\n
状态码100:请求头Expect:100-continue 客户端表明自己要发很长的请求体(Post大量数据),服务端若可以接收返回响应行HTTP/1.1 100 Continue
考虑Connector, (运行在自己的线程,implements Runnable, 不断accept,负责创建且含processor池(stack),取一processor并将socket安全发布给processor所运行线程,继续下一次accept)
processor(运行在自己的线程,循环:1获取socket,2处理socket,3将自己放回processor池),通过wait notifyAll 获取到socket,(可通过Processor对象的成员变量保存一个socket,然后processor run方法内局部变量指向正在处理的socket)
connector 线程阻塞:Processor对象的成员变量已有socket,需等待processor处理完当前socket并从成员变量取走socket才可唤醒
processor 线程阻塞:当前无正在处理的socket,成员变量内也无socket,需connector给成员变量设置一socket才可唤醒
processor 的设置需从connector(暴露给用户设置)获取
processor 解析完毕后交给connector.getContainer().invoke(request,response);
processor 解析:
boolean keepAlive = true;
while (!stopped && ok && keepAlive) { // processor实例未被终止,上次解析未出现错误
// 获取输入流,构建和解析请求和响应
// connector.getContainer().invoke(request,response);
keepAlive = false; // 1 http1.0 且请求头未带来Connection: keep-alive 2 http1.1 但是请求头Connection:close
// 3响应头Connection:close
}
socket.close();
Valve:first,basic(最后一个,一般是StandardXXXValve,多用于调度下一级容器(一般从请求中获取)来处理)
StandardWrapperValve : 获取Wrapper,wrapper.allocate()获取Servlet,调用Servlet的service方法
Lifecycle( 定义各种eventType ,增加,移除LifecycleListener方法,init,start,stop,destroy方法, 获取LifecycleState方法 )
LifecycleListener (唯一方法lifecycleEvent(LifecycleEvent event);)
LifecycleEvent(含Lifecycle, eventType, data)
LifecycleState (enum,含available和eventType ,如STARTED状态available为true,eventType为AFTER_START_EVENT)
LifecycleBase (Lifecycle的实现,含LifecycleSupport(将Listener相关方法委托给它 ),实现生命周期方法如init等,其子类需实现initInternal等方法,如start内STARTING_PREP,子类startInternal内STARTING,start内STARTED )
LifecycleSupport(含Listener数组,负责Listener相关方法最终调用)
Container扩展自Lifecycle,关联了Logger,Loader,Manager,Cluster,Pipeline,Realm
Loader: