【问题标题】:HTTP protocol version undefined in requests to my socket.io server?对我的 socket.io 服务器的请求中未定义 HTTP 协议版本?
【发布时间】:2021-10-15 21:13:36
【问题描述】:

我在 AWS EC2 实例上设置了 socket.io 服务器。我可以像大多数人一样正常连接,但是我遇到了几个未定义 HTTP 协议版本的用户的问题。我已经向我的套接字 io 服务器提供了两个请求,一个具有预期的 HTTP 版本,另一个是未定义的。似乎其他请求是相同的,这让我相信 HTTP 版本是问题所在。

GET 工作正常的请求(删除了特定的 ip/网站信息)

GET /socket.io/?EIO=3&transport=polling&t=Nit_A4F HTTP/1.1
Host: {{My EC2 Host:Port}}
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: {{My Website}}
Connection: keep-alive
Referer: {{My Website}}

GET 请求失败(注意第 1 行,未定义 HTTP 版本,而不是 HTTP/1.1)

GET /socket.io/?EIO=3&transport=polling&t=Nit_UGj undefined
Host: {{My EC2 Host:Port}}
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: {{My Website}}
Connection: keep-alive
Referer: {{My Website}}
Pragma: no-cache
Cache-Control: no-cache

这个问题有几个问题,真的。首先,未定义的 HTTP 协议版本是常见的还是合理的用例?如果是这样,有没有办法可以在前端(Angular)手动设置 HTTP 协议版本,或者设置 CORS 来处理后端未定义的 HTTP 协议版本?

如果未定义的 HTTP 协议版本不是一个合理的用例,这些用户可以做些什么来修复它?

这是我当前在后端使用 CORS 的 socket.io 设置:

const io = require('socket.io')(server, {
  cors: {
    origin: '*',
    methods: ['GET', 'POST'],
    transports: [ 'websocket', 'polling' ],
    credentials: true,
  }
});

除了连接到正确的 url 之外,我的前端没有太多东西,但这里以防万一:

export class SocketIOService {
  private socket: io.Socket;

  constructor() {
    this.socket = io(
      environment.socketUrl
    );
  }

  sendData(socketEvent: string, data: any) {
    this.socket.emit(socketEvent, data);
  }

  getData(socketEvent: string) {
    return new Observable(observer => {
      this.socket.on(socketEvent, msg => {
        console.log("handling event");
        observer.next(msg);
      });
    });
  }
}

如有任何帮助,我们将不胜感激。

【问题讨论】:

  • 如果未定义 HTTP 版本,则默认版本为 0.9。您的服务器可能不支持该版本。这些用户是否使用相同的客户端?还是旧技术?
  • @AntoninRiche 根本不发送 HTTP 版本的请求(这就是 HTTP 0.9 的工作方式,但 0.9 中不存在请求标头)与发送 HTTP 版本号之间存在很大差异undefined(格式错误的请求)。显示的请求未使用 HTTP 0.9,它们是格式错误的请求,任何理智的处理器应该相应地拒绝它们。

标签: javascript http websocket socket.io http-headers


【解决方案1】:

对于任何寻找此特定问题发生原因的答案的人,我不能说我有答案。

适用于解决我的问题的解决方案是升级我的前端和后端以通过 https 而不是 http 进行通信。

【讨论】:

    猜你喜欢
    • 2015-10-22
    • 1970-01-01
    • 2020-06-11
    • 2014-07-05
    • 1970-01-01
    • 2011-02-12
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多