【仿写tomcat】通过socket读取http请求信息
在上一节中,我们已经建立了socket连接并接收到了客户端发送的http请求信息。接下来,我们需要解析这些信息,以便我们能够处理http请求。
解析http请求,我们需要做的是:
- 读取一行字符串。
- 如果这行是空行(长度为0),表示http头部结束,后面跟的是http体(body)。
- 如果这行不是空行,那么它应该是一个键值对,键和值之间用“: ”(冒号和空格)隔开,我们可以将其分割,然后存储在Map中。
以下是具体的代码实现:
public class HttpRequest {
private String[] headers; // 存储所有的头信息
private String body; // 存储请求体
public HttpRequest(InputStream inputStream) throws IOException {
// 读取请求行和头信息
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
String request = bos.toString();
// 将请求行和头信息按行分割
String[] temp = request.split("\n");
headers = new String[temp.length];
for (int i = 0; i < temp.length; i++) {
headers[i] = temp[i];
}
// 判断是否有请求体
if (temp.length > 1) {
String lastHeader = temp[temp.length - 2];
if (lastHeader.length() == 0) {
// 存在请求体
body = temp[temp.length - 1];
}
}
}
public String getBody() {
return body;
}
public String getHeader(String key) {
for (String header : headers) {
if (header.startsWith(key)) {
return header.split(": ")[1];
}
}
return null;
}
public String getMethod() {
return headers[0].split(" ")[0];
}
public String getUrl() {
return headers[0].split(" ")[1];
}
}
在这个类中,我们首先创建了一个ByteArrayOutputStream
对象,用于存储从socket中读取的所有数据。然后,我们使用一个循环读取数据,并将其写入到ByteArrayOutputStream
中。读取完成后,我们将其转换为字符串,并使用换行符\n
对其进行分割,得到一个字符串数组。
在这个数组中,第一个元素是HTTP请求行(例如:GET /index.html HTTP/1.1
),其余的元素是HTTP头部信息。我们将这些信息存储在headers
数组中。
最后,我们检查数组的最后一个元素是否为空字符串。如果不为空,则表示存在HTTP请求体,我们将其存储在body
字段中。
这样,我们就成功解析了HTTP请求信息,并且可以通过我们定义的方法来获取请求行、头部信息和请求体。
评论已关闭