我在 Python 中构建的一个简单的 HTTP 服务器适用于 Chrome 但不适用于 Firefox

A simple HTTP server I built in Python works for Chrome but not in Firefox

所以我在 Python 中构建了一个非常简单的 HTTP 服务器。它的目的是在收到请求时发送文件。

这在 chrome 中有效,但在 Firefox 中它一直在下载而没有任何进展。我还注意到在 Chrome 中,下载文件的名称是 download.png,而文件的实际名称是 s.png。有人能告诉我这段代码有什么问题吗?我也尝试在 Firefox 中打印一条消息并发送 html 代码,它只是继续显示消息 "waiting on localhost" 而什么都不做。

import socket
serversocket = socket.socket()
serversocket.bind(("127.0.0.1", 80))
serversocket.listen(800)
msg = open("s.png", "r").read()
msg =  "HTTP/1.0 200 OK\r\nServer: ls\r\nContent-Type: image/png\r\nContent-Disposition: attachement\r\nfilename: s.png\r\n\r\n" + msg + "\r\n\r\n"
while 1:
    (clientsocket, address) = serversocket.accept()
    clientsocket.send(msg)
  • 不要在 Content-Disposition 和文件名之间插入换行符。
  • filename和文件名之间使用:也是错误的。
  • 我认为你不应该在图像数据后添加无用的换行符。
  • 使用二进制模式有利于读取二进制文件。
  • 您应该在发送消息后关闭连接。否则,客户端无法判断文件末尾在哪里,因为您没有发送 Content-Length header.
  • Firefox 在发送响应之前读取请求似乎很好。

试试这个(用 Python 3.4.2 和 Python 2.7.11 测试):

import socket
serversocket = socket.socket()
serversocket.bind(("127.0.0.1", 80))
serversocket.listen(800)
msg = open("s.png", "rb").read()
msg = "HTTP/1.0 200 OK\r\nServer: ls\r\nContent-Type: image/png\r\nContent-Disposition: attachement; filename=s.png\r\n\r\n".encode('UTF-8') + msg
while True:
    (clientsocket, address) = serversocket.accept()
    recvdata = ''.encode('UTF-8')
    while True:
        recvdata += clientsocket.recv(4096)
        if "\r\n\r\n".encode('UTF-8') in recvdata:
            break
    clientsocket.send(msg)
    clientsocket.close()