获取SimpleHTTPServer以发送响应头

时间:2015-06-30 14:17:38

标签: python http simplehttpserver

我使用这个类在Python中运行HTTP服务器:

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)

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

我已经看过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])

但这并没有任何区别。响应标头仍然填充在文件中。这里发生了什么?

修改 我更新了我的第一个例子,以澄清我的意思。我想要的有点像HTTP代理:我的服务器应该从另一台服务器下载文件,然后将数据发送回客户端。由于某些原因(太多无法解释),我无法使用常规代理。

现在第一个代码示例非常有效。我的问题是所有的标题都在这个过程中丢失了。这意味着客户端不知道下载大小(因此显示无限制的进度条)或文件名(内容处置)。

在我的第二个代码示例中,我尝试发送从上游服务器获取的头文件,但是在调用do_GET之前标题似乎已完成。

1 个答案:

答案 0 :(得分:0)

好的,使用Wireshark我发现了这里真正错误的地方:

我忘了做

self.send_response(200)

在发送标题之前,发送一行如:

HTTP/1.1 200 OK

我想缺少该行会导致HTTP客户端认为服务器正在使用HTTP / 0.9,实际上会导致标头错误。