我使用这个类在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之前标题似乎已完成。
答案 0 :(得分:0)
好的,使用Wireshark我发现了这里真正错误的地方:
我忘了做
self.send_response(200)
在发送标题之前,发送一行如:
HTTP/1.1 200 OK
我想缺少该行会导致HTTP客户端认为服务器正在使用HTTP / 0.9,实际上会导致标头错误。