이 클래스를 사용하여 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 ()을 호출하기 전에 헤더를 종료했다고 생각합니다.
이 답변을 보았고 그에 따라 코드를 편집했습니다.
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 프록시와 비슷합니다. 내 서버는 다른 서버에서 파일을 다운로드하고 데이터를 클라이언트로 다시 보내야합니다. 어떤 이유로 (설명하기에는 너무 많을 것입니다) 일반 프록시를 사용할 수 없습니다.
이제 첫 번째 코드 예제는이를 매우 효율적으로 수행합니다. 내 문제는 모든 헤더가 프로세스에서 손실된다는 것입니다. 즉, 클라이언트가 다운로드 크기 (무한 진행률 표시 줄 표시) 또는 파일 이름 (Content-disposition)을 인식하지 못합니다.
두 번째 코드 예제에서는 업스트림 서버에서받은 헤더를 보내려고했지만 do_GET이 호출되기 전에 헤더가 완료된 것 같습니다.
좋아, Wireshark를 사용하여 실제로 무엇이 잘못되었는지 발견했습니다.
나는하는 것을 잊었다
self.send_response(200)
헤더를 보내기 전에 다음과 같은 줄을 보냅니다.
HTTP/1.1 200 OK
이 줄이 없으면 HTTP 클라이언트가 서버가 HTTP / 0.9를 사용하고 있다고 믿고 실제로 헤더가 잘못되었다고 생각합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다