SakuraCat(3)解析HTTP请求

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];
            }
        }

        // 解析URI中的参数
        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();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值