【发布时间】: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