HttpConnection衍生出来的:
另外一个我们都知道的是 HttpClientConnection:
我们先把Connection相关的列出来,暂时不考虑Factory|Pool|Context。实际上,Factory|Pool|Context 列在这里是Intellj IDEA 的工具问题,以HttpConnectionFactory为例:
HttpConnectionFactory<T extends HttpConnection>
它只是泛型中继承了HttpConnection,HttpConnectionFactory本身并不是从HttpConnection中派生出来的。
以这两个接口派生出来的接口和类来往下延伸,由于比较多,所以去掉了已经声明为废弃的(每个接口派生出来的都看一遍才能确定)。发现4.3开始,都集中推荐使用DefaultBHttpClientConnection,而它又是继承自BHttpConnectionBase。
对于DefaultBHttpClientConnection,可以看到非常核心的元素,responseParser 以及 requestWriter。 以及上一节中提到的核心的方法:
this.requestWriter = (requestWriterFactory != null ? requestWriterFactory :
DefaultHttpRequestWriterFactory.INSTANCE).create(getSessionOutputBuffer());
this.responseParser = (responseParserFactory != null ? responseParserFactory :
DefaultHttpResponseParserFactory.INSTANCE).create(getSessionInputBuffer(), constraints);
构造方法里给出了 requestWriter 和 responseParser 的构造方式,跟踪到 Factory 中可以看到
实际上两者是基于 SessionOutputBuffer 以及 SessionInputBuffer 的。
看一下核心方法:
AbstractMessageWriter中的:
@Override
public void write(final T message) throws IOException, HttpException {
Args.notNull(message, "HTTP message");
writeHeadLine(message);
for (final HeaderIterator it = message.headerIterator(); it.hasNext(); ) {
final Header header = it.nextHeader();
this.sessionBuffer.writeLine
(lineFormatter.formatHeader(this.lineBuf, header));
}
this.lineBuf.clear();
this.sessionBuffer.writeLine(this.lineBuf);
}
AbstractMessageParser中的:
@Override
public T parse() throws IOException, HttpException {
final int st = this.state;
switch (st) {
case HEAD_LINE:
try {
this.message = parseHead(this.sessionBuffer);
} catch (final ParseException px) {
throw new ProtocolException(px.getMessage(), px);
|