【问题标题】:Identify whether I've received an HttpRequest or HttpResponse?确定我是否收到了 HttpRequest 或 HttpResponse?
【发布时间】:2018-05-08 18:10:19
【问题描述】:

我有一个监听端口的 netty 服务器。它可以在此端口上接收 HttpResponses 或 HttpRequests。如何设置管道来处理两者并区分两者?这可能吗?与此服务器而不是从它启动连接。

谢谢!

【问题讨论】:

  • 我不明白。 http 服务器接收请求并发送响应。它将如何接收 HTTP 响应?
  • 它充当代理服务器。它还可以向另一台机器发出 HTTP 请求并获得 HTTP 响应。在这种特殊情况下,其他机器也可以发送 HTTP 请求。
  • 但是您通过与连接关联的状态知道它在做什么。如果您接受它,它将收到请求。如果您提交了它,您将收到回复。
  • 不完全是,在此特定设置中,始终会启动与此服务器的连接。对于第一种情况,从其他机器向该服务器发起 TCP 隧道,之后该服务器向该机器发送 HTTP 请求。在第二种情况下,另一台机器通过 curl 之类的方式发送 HTTP 请求。

标签: sockets http netty


【解决方案1】:

您可以使用 PortUnification 示例中的 isHttp 方法。它检查接收到的消息的前两个无符号字节以确定它是否可能是 HTTP 动词,从而将消息识别为 HTTP 请求。您可能需要稍微修改它,具体取决于任何响应的可能内容。

private static boolean isHttp(int magic1, int magic2) {
  return
     magic1 == 'G' && magic2 == 'E' || // GET
     magic1 == 'P' && magic2 == 'O' || // POST
     magic1 == 'P' && magic2 == 'U' || // PUT
     magic1 == 'H' && magic2 == 'E' || // HEAD
     magic1 == 'O' && magic2 == 'P' || // OPTIONS
     magic1 == 'P' && magic2 == 'A' || // PATCH
     magic1 == 'D' && magic2 == 'E' || // DELETE
     magic1 == 'T' && magic2 == 'R' || // TRACE
     magic1 == 'C' && magic2 == 'O';   // CONNECT
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    相关资源
    最近更新 更多