首页 > 解决方案 > 一个 HTTP GET 请求返回 302,但位置标头与我最初传递的相同

问题描述

我从不知道如何修复的服务器收到意外响应。我一直在修改 Discord 网关,它使用安全的 websocket 连接。但是,当我请求建立与网关的连接时,我得到了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图书馆的方向,我知道它非常适合这个目的,但我的目标是理解 websockets 的一些底层概念,为此,我更喜欢用较少抽象的方式与它们进行交互。

提前致谢!

标签: pythonhttpsslhttpswebsocket

解决方案


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

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

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

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


推荐阅读