连接器

本章主要构建一个tomcat4中默认连接器的简化版。
主要演示了一下如何去解析http的内容。

StringManager类

一个基于properties文件、支持国际化的单例模式的字符串信息管理器。

应用程序

HttpConnector类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class HttpConnector implements Runnable {
public void run() {
ServerSocket serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
while (!stopped) {
Socket socket = serverSocket.accept();
HttpProcessor processor = new HttpProcessor(this);
processor.process(socket);
}
}

public void start() {
Thread thread = new Thread(this);
thread.start();
}
}

HttpProcessor类主要完成以下操作:

  1. 创建HttpRequest对象
  2. 创建HttpResponse对象
  3. 解析http请求第1行内容和请求头,填充HttpRequest对象
  4. 将request/response传递给ServletProcessor#process()方法,向客户端发送响应

HttpRequest类

HttpRequest类实现了javax.servlet.HttpServletRequest接口,并使用一个外观类HttpRequestFacade。

解析http请求主要分为如下步骤:

  1. 读取socket输入流

    1
    SocketInputStream input = new SocketInputStream(socket.getInputStream(), 2048);
  2. 解析请求行

    解析http请求第一行内容,用char[]数组而不是字符串对象以减少字符串操作开销,主要考虑了相对路径、键值对形式的查询字符串、jsessionid等问题。

  3. 解析请求头

    逐行循环读取http请求内容直到出现空行间隔,将每行按照字符规则定义成键值对类型的header[]保存,并将如content-length,content-type等一些特殊字段记录到对应的属性。

  4. 解析cookie

  5. 获取参数

    利用一个继承HashMap并扩展了锁机制的map保存参数列表,根据content-type,encoding解析请求体

HttpResponse类

提供了一个finishResponse()方法flush输出流,以解决最后一行输出内容不能输出的bug。