最近读代码的节奏很慢,。。在HttpPrcoessor部分已经停滞了挺久的时间了。。
可能它设计到的东西还是挺多的吧。。。
今天写的是InternalNioInputBuffer类型的分析,它算是Tomcat对IO封装部分的一个十分重要的环节了,可以将其理解为用于沟通底层socket与上层servletInputStream的中间层。。。而且InternalNioInputBuffer中还实现了HTTP协议的requestLine与header部分的解析。。。
嗯,这里先来看看简单的继承结构吧:
这个够简单的了吧,这里先来看看最上层的接口InputBuffer的定义吧:
public interface InputBuffer {
/** Return from the input stream.
IMPORTANT: the current model assumes that the protocol will 'own' the
buffer and return a pointer to it in ByteChunk ( i.e. the param will
have chunk.getBytes()==null before call, and the result after the call ).
*/
//从与这个request关联的socket读取数据保存到chunk里面
public int doRead(ByteChunk chunk, Request request)
throws IOException;
}
嗯,也非常的简单,就只有一个方法,doRead方法,用于读取数据,并将数据保存到chunk里面。。。
好啦,接下来就是AbstractInputBuffer的定义了,这里先来看看的一些重要的属性的申明吧:
protected Request request; //与当前buffer关联的tomcat的request
protected MimeHeaders headers; //用于保存所有的处理出来的header数据
protected boolean parsingHeader; //是否正在处理header
protected boolean swallowInput; //是否要接收当前关联的连接的数据
protected byte[] buf; //用于存数据的字节数组
protected int lastValid; //表示最后一个可用数据的下标
protected int pos; //当前读取到的下标
protected int end; //用于指向header在buffer的尾部的下标
protected InputBuffer inputStreamInputBuffer; //这里内部有一个InputBuffer,用于代理当前对象的一些方法,主要是暴露给外部的读取数据的api
protected InputFilter[] filterLibrary; //所有的filter
protected InputFilter[] activeFilters; //活动的filter,当外部代码调用buffer来读取数据的时候,如果有filter,那么将会用filter来处理一下
protected int lastActiveFilter; //最后一个活动的filter的下标
嗯,这里属性的定义还不算太多吧,不过都挺重要的,具体的每个属性是什么意思,后面的注释应该也说的比较清楚了。。。而且可以看到,具体的数据的保存其实也是保存到一个字节数组里面的。。。