HTTP GET请求返回302,但是位置标头与我最初传递的位置标头相同

时间:2020-09-02 01:46:19

标签: python http ssl https websocket

我收到一个我不知道如何解决的服务器的意外响应。我一直在修改使用安全Websocket连接的Discord网关。但是,当我请求建立到网关的连接时,我得到一个302 Found响应状态。经过一番谷歌搜索,我发现我应该使用Location标头中指定的URI;但是,这几乎与我最初通过的相同。

import socket
import ssl

ctx = ssl.create_default_context()

ssl_sock = ctx.wrap_socket(socket.socket(), server_hostname='discord.com')

ssl_sock.connect(('discord.com', 443))

ssl_sock.sendall(b'''GET /wss://gateway.discord.gg/?v=6&encoding=json HTTP/1.1\r
Host: discord.com\r
Authorization: Bot uhfu734\r
User-Agent: Disc ($https://hi.com, $2)\r
Upgrade: websocket\r
Connection: Upgrade\r
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r
Origin: https://discord.com/\r
Sec-WebSocket-Protocol: chat, superchat\r
Sec-WebSocket-Version: 13\r\n\r
''')
print(ssl_sock.recv(10000))

以下是回复:

b'HTTP/1.1 302 Found\r\nDate: Wed, 02 Sep 2020 01:21:26 GMT\r\nContent-Type: text/plain;charset=UTF-8\r\nContent-Length: 0\r\nConnection: keep-alive\r\nSet-Cookie: __cfduid=d6941593b4b04a8b370e7a4c7799155d81599009686; expires=Fri, 02-Oct-20 01:21:26 GMT; path=/; domain=.discord.com; HttpOnly; SameSite=Lax; Secure\r\nLocation: https://discord.com/wss:/gateway.discord.gg?v=6&encoding=json\r\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: DENY\r\nX-Robots-Tag: noindex, nofollow, noarchive, nocache, noimageindex, noodp\r\nX-XSS-Protection: 1; mode=block\r\ncf-request-id: 04ee009aad0000cf1c8304e200000001\r\nExpect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"\r\nServer: cloudflare\r\nCF-RAY: 5cc36a0aab6dcf1c-IAD\r\n\r\n'

位置标头中的唯一区别是/之前的?,但是如果省略它,则会收到401 OK。如您所见,Location标头与我最初使用的URI几乎相同,所以我不知道从这里开始还有什么其他用途。

有关Discord API的特定信息,您可以在此处阅读:https://discord.com/developers/docs/topics/gateway。我已经看过了,但是可能我误解了一些。

请不要带我去websockets库的方向,我知道这很有用,但是我的目标是了解websocket的一些基本概念,为此,我更喜欢与他们互动,而无需抽象。

谢谢!

1 个答案:

答案 0 :(得分:1)

GET /wss://gateway.discord.gg/?v=6&encoding=json HTTP/1.1

这可能不是有效的请求。看来您正在以一种奇怪的方式混淆协议,方法和路径。可能应该是:

GET /?v=6&encoding=json HTTP/1.1

您的奇怪请求很可能是导致此奇怪响应的原因。