如何用一个CRLF发送HTTP 101

0 投票
1 回答
31 浏览
提问于 2025-04-14 17:16

有一个SSH客户端应用程序,在向HTTP服务器发送HTTP GET请求后,应该收到HTTP 101切换协议的响应,并且还会有一个用于“协议版本交换”的头部信息。

根据RFC 4253的第4.2节,协议版本交换,这个头部的格式必须是

SSH-protoversion-softwareversion<CR><LF>

示例

SSH-2.0-OpenSSH_9.5\r\n

在Python 3中可以这样做

...
...
class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(101)
        self.send_header("Content-type", "text/plain")
        self.end_headers()
        self.wfile.write(bytes("SSH-2.0-OpenSSH_9.5", "utf-8"))
...
...

响应头部将是(SSH客户端收到的内容

SSH-2.0-OpenSSH_9.5\r\n\r\n

因此,SSH客户端应用程序会关闭连接。

如何正确设置头部只使用一个CRLF,或者去掉第二个呢?

它应该以SSH-开头

SSH-2.0-OpenSSH_9.5\r\n

1 个回答

0

不要自己去调用 end_headers(),也不要手动写入头信息和协议版本,这样你才能完全掌控。

def do_GET(self):
  self.send_response(101)
  self.send_header("Content-type", "text/plain")
  headers = self.headers.items()
  header_str = ''.join(f"{key}: {value}\r\n" for key, value in headers)
  protocol_version_str = "SSH-2.0-OpenSSH_9.5\r\n"
  response = f"{header_str}{protocol_version_str}".encode('utf-8')
  self.wfile.write(response)

撰写回答