获取 SimpleHTTPServer 以发送响应 headers

Get SimpleHTTPServer to send response headers

我正在使用这个 class 到 运行 HTTP-server in Python:

class Server:

    def __init__(self):
        port = 81
        httpd = SocketServer.ThreadingTCPServer(('', port), self.Proxy)
        httpd.serve_forever()

    class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):

        def do_GET(self):
            # just for demonstration:
            url = "http://ovh.net/files/10Mio.dat"
            opener = urllib2.build_opener()
            handle = opener.open(url)
            if hasattr(handle.info(), "headers"):
                headers = handle.info().headers
                for h in headers:
                    self.send_header(h[0], h[1])
            self.end_headers()
            self.copyfile(handle, self.wfile)

但不幸的是,这并没有像预期的那样工作。如果我向服务器发送请求,我得到的文件比我预期的要大一些。当我查看它时,我看到响应 headers 存储在该文件的开头。响应本身不包含 headers,所以我认为 SimpleHTTPServer 在调用 do_GET() 之前结束了 headers。

我已经看到 this answer 并相应地编辑了我的代码:

class Server:

    def __init__(self):
        port = 81
        httpd = SocketServer.ThreadingTCPServer(('', port), self.Proxy)
        httpd.serve_forever()



    class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):

        def do_GET(self):
            # get handle again
            self.copyfile(handle, self.wfile)

        def end_headers(self):
            self.send_my_headers()
            SimpleHTTPServer.SimpleHTTPRequestHandler.end_headers(self)

        def send_my_headers(self):
            # Do something smart to get a file-like variable named handle
            self.send_header("Access-Control-Allow-Origin", "*")
            if hasattr(handle.info(), "headers"):
                headers = handle.info().headers
                for h in headers:
                    self.send_header(h[0], h[1])

但这没有任何区别。响应 headers 仍然填充在文件中。这是怎么回事?

编辑: 我更新了第一个示例以阐明我的意思。我想要的有点像 HTTP-proxy:我的服务器应该从另一台服务器下载一个文件,然后将数据发送回客户端。由于某些原因(解释太多)我不能使用常规代理。

现在第一个代码示例非常有效地完成了这项工作。我的问题是所有 headers 都在这个过程中丢失了。这意味着客户端不知道下载大小(因此显示不确定的进度条)或文件名 (Content-disposition)。

在我的第二个代码示例中,我尝试发送从上游服务器获得的 headers,但 headers 似乎在调用 do_GET 之前就已完成。

好的,使用 Wireshark 我发现了这里的实际问题:

我忘了做一个

self.send_response(200)

在发送 headers 之前,它会发送如下一行:

HTTP/1.1 200 OK

我猜想缺少该行会导致 HTTP-clients 认为服务器正在使用 HTTP/0.9,实际上 headers 是错误的。