【问题标题】:Privnote sockets server did not understand requestPrivnote 套接字服务器不理解请求
【发布时间】:2020-08-09 01:10:32
【问题描述】:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(("privnote.com", 80))
#s = ssl.wrap_socket(s, keyfile=None, certfile=None, server_side=False, cert_reqs=ssl.CERT_NONE, ssl_version=ssl.PROTOCOL_SSLv23)

def claim_note(note_url):
    s.sendall(b'DELETE /'+note_url.encode()+b'HTTP/1.1\r\nX-Requested-With: XMLHttpRequest\r\nHost: privnote.com\r\n')
    print(s.recv(4096))

这是我的代码,现在让我首先说除此之外我尝试了很多不同的东西。我试过 https 端口和 http 端口,443、80。我已经注释和取消注释用 ssl 包装套接字的语句。所有的结果都是一样的。要么 api 完全没有返回任何内容,要么 api 告诉我请求服务器无法理解。我正在查看一个 GitHub 存储库,并且只使用了一个标头,这是因为它是用于 x-requested-with 的 Ajax 调用。我尝试添加用户代理内容类型,现在我只使用主机和 x 请求。这是一个 DELETE 请求,url 是链接后的前 8 个字符。我还尝试在末尾添加 \r\n\r\n,甚至尝试了 content-length。我不知道还能做什么。我想知道服务器为什么这么说。

【问题讨论】:

  • 由于您的代码当前状态,它发送一个无效请求,因为没有最后的空行(即\r\n)。请解决此问题,然后重试,如果仍然无效,请提供您得到的确切响应,而不仅仅是您对它的解释。请通过编辑您的问题(以便错误与代码匹配)来修复代码并添加信息,而不仅仅是在评论中提供这些信息。
  • 它已经在我的代码中...我尝试添加 \r\n
  • 这不是我的解释,它的字面意思是“服务器无法理解您的请求”,返回标头和 400 状态码
  • “它已经在我的代码中了……” - 不是。您的请求以 \r\n 结尾作为 Host 标题行的行尾。但是在那之后必须有一个额外的\r\n。如果有疑问,请参考 HTTP 标准 - 标准存在是有原因的。

标签: python-3.x sockets websocket


【解决方案1】:

您的代码存在多个问题。如果您实际打印出您尝试发送的请求,它将如下所示:

b'DELETE /node_urlHTTP/1.1\r\nX-Requested-With: XMLHttpRequest\r\nHost: privnote.com\r\n'

这行有两个问题:/node_urlHTTP/1.1 之间缺少空格,最后缺少最后一个 \r\n als end-of-header 标记。修复这些问题后,您将获得成功的响应 - 302 重定向到 HTTPS 版本:

b'HTTP/1.1 302 Found\r\nDate:...\r\nLocation: https://privnote.com/node_url ...

当使用 HTTPS 和有效的 node_url 重复请求时(使用无效的 node_url,您会收到 DELETE 不是允许的方法的错误):

s.connect(("privnote.com", 443))
s = ssl.wrap_socket(s)

...
b'HTTP/1.1 200 OK\r\n ...

【讨论】:

  • 这很奇怪,因为这是使用的方法。它很容易重现,不过感谢您提供的信息。
  • @Noah:仅当节点 url 未知时才会出现错误。查看更新的答案。
猜你喜欢
  • 2022-01-13
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多