如何用一个CRLF发送HTTP 101
有一个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)