linux 我写的这个HTTP服务器基本上可以工作,但是在移动的Chrome上有一个问题

jhkqcmku  于 2023-04-29  发布在  Linux
关注(0)|答案(1)|浏览(90)

这个Web服务器对于简单的Web服务任务运行良好,但是当向移动的Chrome设备发送大文件时,它会给我一个“断管”错误。与移动的Chrome唯一不同的是,它不会在标头中发送“Keep-alive”。
我什么都没做。我希望能像其他浏览器一样成功连接。
我的准则

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind(('0.0.0.0', 80))
    s.listen()
    while True:
        conn, addr = s.accept()
        with conn:
            req = conn.recv(1024).decode("utf-8")
            print(req)
            req = req.split(" ")
            if(req[0] == "GET"):
                try:
                    fname = req[1]
                    if(fname == "/"):
                        fname = "index.html"
                    else:
                        fname = os.path.relpath(os.path.abspath("." + fname))
                    with open(fname, "rb") as f:
                        mtype = mimetypes.guess_type(fname)[0]
                        conn.sendall(f"HTTP/1.1 200 OK\nContent-Type: {mtype}\n\n".encode('utf-8') + f.read())
                except:
                    conn.sendall(b"HTTP/1.1 404 Not Found")
            else:
                print("LOL No!")
                conn.sendall(b"HTTP/1.1 400 Bad Request\n\n")
g52tjvyc

g52tjvyc1#

我写的这个HTTP服务器基本上可以工作,但是在移动的Chrome上有一个问题
如果只是猜测HTTP协议应该是什么样子,而不是实际遵循标准,通常会发生这种情况。不同的客户端以不同的方式容忍发送格式错误的协议数据。
从你的代码来看:

  • 在HTTP标头中使用\n作为行分隔符,而不是\r\n
  • 有时(在404上)你甚至根本不发送行分隔符和标头结束标记
  • 你没有给予body一个长度--这是一种不好的风格,但是可以接受,因为你在发送body之后立即关闭了连接

不要因为HTTP是基于文本的就认为它很简单。而是遵循实际的和相当复杂的标准。

相关问题