获取 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 是错误的。
我正在使用这个 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 是错误的。