HTTP消息结构

MyHttpRequestParser完整代码
package com.SakuraCat.connector;
import com.SakuraCat.request.MyHttpRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
public class MyHttpRequestParser {
public static void parse(InputStream inputStream, MyHttpRequest httpRequest) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String method = "";
String uri = "";
String version = "";
Map<String, String> headers = new HashMap<>();
Map<String, String> parameters = new HashMap<>();
String body = "";
String requestLine = bufferedReader.readLine();
if (requestLine != null) {
String[] requestParts = requestLine.split(" ");
if (requestParts.length == 3) {
method = requestParts[0];
uri = requestParts[1];
version = requestParts[2];
}
}
parameters = parseUriParameters(uri);
while (true) {
String header = bufferedReader.readLine();
if (header == null || header.isEmpty()) {
break;
}
String[] keyAndValue = header.split(":");
if (keyAndValue.length >= 2) {
String key = keyAndValue[0].trim();
String value = header.substring(keyAndValue[0].length() + 1).trim();
headers.put(key, value);
}
}
body = parseRequestBody(bufferedReader, headers);
httpRequest.setMethod(method);
httpRequest.setUri(uri);
httpRequest.setVersion(version);
httpRequest.setHeaders(headers);
httpRequest.setParameters(parameters);
httpRequest.setBody(body);
}
private static Map<String, String> parseUriParameters(String uri) {
if (uri == null || uri.isEmpty()) {
return null;
}
Map<String, String> map = new HashMap<>();
int queryStart = uri.indexOf("?");
if (queryStart != -1) {
String queryString = uri.substring(queryStart + 1);
String[] parameters = queryString.split("&");
for (String parameter : parameters) {
String[] keyValue = parameter.split("=");
if (keyValue.length == 2) {
String key = keyValue[0];
String value = keyValue[1];
try {
key = java.net.URLDecoder.decode(key, "UTF-8");
value = java.net.URLDecoder.decode(value, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
map.put(key, value);
}
}
}
return map;
}
private static String parseRequestBody(BufferedReader bufferedReader, Map<String, String> headers) throws IOException {
StringBuilder bodyBuilder = new StringBuilder();
String contentLengthHeader = headers.get("Content-Length");
int contentLength = 0;
if (contentLengthHeader != null) {
try {
contentLength = Integer.parseInt(contentLengthHeader);
} catch (NumberFormatException e) {
e.printStackTrace();
return "";
}
}
if (contentLength > 0) {
char[] buffer = new char[contentLength];
int bytesRead = 0;
while (bytesRead < contentLength) {
int read = bufferedReader.read(buffer, bytesRead, contentLength - bytesRead);
if (read == -1) {
break;
}
bytesRead += read;
}
bodyBuilder.append(buffer, 0, bytesRead);
}
return bodyBuilder.toString();
}
}
解析请求行
String requestLine = bufferedReader.readLine();
if (requestLine != null) {
String[] requestParts = requestLine.split(" ");
if (requestParts.length == 3) {
method = requestParts[0];
uri = requestParts[1];
version = requestParts[2];
}
}
解析URI中的参数
private static Map<String, String> parseUriParameters(String uri) {
if (uri == null || uri.isEmpty()) {
return null;
}
Map<String, String> map = new HashMap<>();
int queryStart = uri.indexOf("?");
if (queryStart != -1) {
String queryString = uri.substring(queryStart + 1);
String[] parameters = queryString.split("&");
for (String parameter : parameters) {
String[] keyValue = parameter.split("=");
if (keyValue.length == 2) {
String key = keyValue[0];
String value = keyValue[1];
try {
key = java.net.URLDecoder.decode(key, "UTF-8");
value = java.net.URLDecoder.decode(value, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
map.put(key, value);
}
}
}
return map;
}
解析请求头部
while (true) {
String header = bufferedReader.readLine();
if (header == null || header.isEmpty()) {
break;
}
String[] keyAndValue = header.split(":");
if (keyAndValue.length >= 2) {
String key = keyAndValue[0].trim();
String value = header.substring(keyAndValue[0].length() + 1).trim();
headers.put(key, value);
}
}
解析请求体
private static String parseRequestBody(BufferedReader bufferedReader, Map<String, String> headers) throws IOException {
StringBuilder bodyBuilder = new StringBuilder();
String contentLengthHeader = headers.get("Content-Length");
int contentLength = 0;
if (contentLengthHeader != null) {
try {
contentLength = Integer.parseInt(contentLengthHeader);
} catch (NumberFormatException e) {
e.printStackTrace();
return "";
}
}
if (contentLength > 0) {
char[] buffer = new char[contentLength];
int bytesRead = 0;
while (bytesRead < contentLength) {
int read = bufferedReader.read(buffer, bytesRead, contentLength - bytesRead);
if (read == -1) {
break;
}
bytesRead += read;
}
bodyBuilder.append(buffer, 0, bytesRead);
}
return bodyBuilder.toString();
}