向具有查询和片段的代理发送具有请求目标的http请求是有效的http请求吗?

cnjp1d6j  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(276)

我的目标是验证“请求行”的http请求,例如 GET http://www.ics.uci.edu/pub/ietf/uri/#Related HTTP/1.1 . 目前,我正在验证“请求目标”
我的参考号是rfc7230。遗憾的是,rfc7230没有指定 absolute-form ,文档中的一个新术语,原因令人困惑,因为文档中还说明 absolute-form = absolute-uri . 因此,我不确定这是否有效 request-line .
我正在使用正则表达式验证请求目标。

static void parse(String requestTarget) throws HttpParsingException {
    Pattern pattern = Pattern.compile("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?", Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(requestTarget);
    if (!matcher.matches()) {
      throw new HttpParsingException(HttpStatusCode.CLIENT_ERROR_400_BAD_REQUEST);
    }
  }

请求目标值为(预期成功)

GET http://www.ics.uci.edu/pub/ietf/uri/#Related HTTP/1.1
GET / HTTP/1.1
GET /where
GET /where?q=now

请求目标值为(预计将失败)

GET // HTTP/1.1
GET  HTTP/1.1

正则表达式来自[rfc3896]的附录b

kx7yvsdv

kx7yvsdv1#

请求目标为带有查询和片段的代理的http请求是有效的http请求吗?
这是无效的。
http消息语法和消息路由rfc要求 request-target http请求消息中的url是 absolute-uri . (我看你已经明白了……)
如果你跟踪 absolute-uri 返回到uri rfc中定义的术语,您将看到它意味着不允许使用片段。uri rfc说:

4.3. 绝对uri

一些协议元素只允许uri的绝对形式,而不允许片段标识符。例如,定义一个基本uri以供以后由相对引用使用,需要一个不允许片段的绝对uri语法规则。

absolute-URI  = scheme ":" hier-part [ "?" query ]

注意:该语法不允许 fragment .
我不打算讨论编写正则表达式来进行uri解析的问题。。。除了建议另一种选择是使用标准JavaSE之外 URI 班级。

相关问题