HTTP1.1协议实体接口
好不容易完成了一个相对容易扩展的IO层,终于可以开始进入HTTP部分的编写了。早知道就直接找Netty之类的IO框架了,当然那样就没啥意思,也无法找到自己技术上缺陷并改进了。
我们先把HTTP1协议实体接口,用Java对象把HTTP1协议中需要的实体表示出来。然后再编写HTTP Parser相关功能,将IO中获取到的信息转换为上一步中定义的实体对象。这里先将HTTP1协议接口定下来。
根据HTTP1.1协议标准,HTTP协议实体如下:
generic-message = start-line
*(message-header CRLF)
CRLF
[ message-body ]
分为四个部分:
- 开始行
- 消息头
- 空行
- 消息体
开始行有分为请求开始行和响应开始行两类:SP代表空白字符
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
转换为Java后,结构如下
StartLine用于表示开始行,RequestLine和ResponseLine都实现该接口,同时添加了返回特定各自信息的方法。
HttBody用表示Body内容,使用泛型指定Body内容的格式,StringContentHttBody表示Body的内容是字符串,ByteContentHttBody表示Body内容是二进制,并与InputStream进行返回。
IMessageHeaders用户持有所有的HttpHeader。HttpMessageHeaders内部使用Guava的ArrayListMultimap<String, HttpHeader>保持HttpHeader,以实现对同名多个消息头的支持。
HttpMessage接口则同时使用 StartLine、IMessageHeaders、HttpBody三个接口,用于表示HTTP Message。
完整代码:https://github.com/pkpk1234/BeggarServletContainer/tree/step7
分支step7