0

问题描述

目前正在尝试研究Web容器原理,遇到一个问题,就是如何判断发送过来的Request是str类型的参数,还是单纯的图片

问题出现的环境背景及自己尝试过哪些方法

目前对于Http请求的处理方法是将request的inputStream转化为str

POST /index.do HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 8
Accept: application/json, text/plain, /
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Referer: http://localhost:8080/post.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: _lxsdk_cuid=1684b9c3325c8-0a9a4e692ccff7-10366654-fa000-1684b9c3326c8; _lxsdk=1684b9c3325c8-0a9a4e692ccff7-10366654-fa000-1684b9c3326c8

p1=a%3Db

这是一个POST请求所解析成str的形式。
从中很容易就看出来表单数据是呈现出一种 key=value的形式
但是对于文件是二进制的形式。这个时候我们怎么去判断这个东西到底是文件,还是普通字符串,或者是一次错误的请求。进一步讲,我们到底应该怎样对这个Request中的inputStream进行一次解析?

目前的思路是将 Header与Body细分,通过ContentType来区别文件或请求类型。
但是不明白的是这个inputStream怎么将Header和Body区分开?因为转成str完全就在一起,不太好标准化区分赶脚。

相关代码

目前对于inputStream是这样处理成str的,参考自网上socket编程的代码

public static String inputStreamToString(InputStream inputStream) throws IOException {

    int count = 0;
    while (count == 0) {
        // 如果发送的请求没有结束, 那么值为0
        count = inputStream.available();
    }

    byte[] bt = new byte[count];
    int readCount = 0;
    while (readCount < count) {
        readCount += inputStream.read(bt, readCount, count - readCount);
    }
    String xx = new String(bt);
    return xx;
}

主要的问题还是请教大家如何对 Http Request InputStream的请求进行标准化解析

补充:没有引用Servlet-API和Tomcat, 想自己研究下底层实现

2019-05-11 提问

1 个回答

0

已采纳

可以参考一下http协议的标准. 请求头和请求体是通过一个空行来分割的

All HTTP/1.1 messages consist of a start-line followed by a sequence of octets in a format similar to the Internet Message Format [RFC5322]: zero or more header fields (collectively referred to as the "headers" or the "header section"), an empty line indicating the end of the header section, and an optional message body.

 HTTP-message   = start-line
                  *( header-field CRLF )
                  CRLF
                  [ message-body ]

参考文档: rfc7230

推广链接