mirror of
https://github.com/internetarchive/warcprox.git
synced 2025-01-18 13:22:09 +01:00
working on proof of concept streaming support
This commit is contained in:
parent
6f12a9e3bf
commit
9d176a408b
53
warcprox.py
53
warcprox.py
@ -3,7 +3,6 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
import BaseHTTPServer, SocketServer
|
import BaseHTTPServer, SocketServer
|
||||||
import httplib
|
|
||||||
import socket
|
import socket
|
||||||
import urlparse
|
import urlparse
|
||||||
import OpenSSL
|
import OpenSSL
|
||||||
@ -19,7 +18,7 @@ import threading
|
|||||||
import os
|
import os
|
||||||
import argparse
|
import argparse
|
||||||
import random
|
import random
|
||||||
import tempfile
|
import httplib
|
||||||
|
|
||||||
class CertificateAuthority(object):
|
class CertificateAuthority(object):
|
||||||
|
|
||||||
@ -107,6 +106,38 @@ class UnsupportedSchemeException(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Recorder:
|
||||||
|
|
||||||
|
def __init__(self, fp):
|
||||||
|
self.fp = fp
|
||||||
|
self.recorded = bytearray('')
|
||||||
|
|
||||||
|
def read(self, size=-1):
|
||||||
|
result = self.fp.read(size=size)
|
||||||
|
self.recorded.extend(result)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def readline(self, size=-1):
|
||||||
|
return self.fp.readline(size=size)
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
return self.fp.close()
|
||||||
|
|
||||||
|
|
||||||
|
class RecordingHTTPResponse(httplib.HTTPResponse):
|
||||||
|
|
||||||
|
def __init__(self, sock, debuglevel=0, strict=0, method=None, buffering=False):
|
||||||
|
httplib.HTTPResponse.__init__(self, sock, debuglevel=debuglevel, strict=strict, method=method, buffering=buffering)
|
||||||
|
|
||||||
|
# Keep around extra reference to self.fp because HTTPResponse sets
|
||||||
|
# self.fp=None after it finishes reading, but we still need it
|
||||||
|
self.recorder = Recorder(self.fp)
|
||||||
|
self.fp = self.recorder
|
||||||
|
|
||||||
|
def recorded(self):
|
||||||
|
return self.recorder.recorded
|
||||||
|
|
||||||
|
|
||||||
class ProxyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
class ProxyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||||
|
|
||||||
def __init__(self, request, client_address, server):
|
def __init__(self, request, client_address, server):
|
||||||
@ -202,24 +233,28 @@ class ProxyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
|||||||
self._proxy_sock.sendall(self.mitm_request(req, interceptors))
|
self._proxy_sock.sendall(self.mitm_request(req, interceptors))
|
||||||
|
|
||||||
# Parse response
|
# Parse response
|
||||||
h = httplib.HTTPResponse(self._proxy_sock)
|
h = RecordingHTTPResponse(self._proxy_sock)
|
||||||
h.begin()
|
h.begin()
|
||||||
|
|
||||||
# Get rid of the pesky header
|
# Get rid of the pesky header
|
||||||
del h.msg['Transfer-Encoding']
|
del h.msg['Transfer-Encoding']
|
||||||
|
|
||||||
# Time to relay the message across
|
# Time to relay the message across
|
||||||
res = '%s %s %s\r\n' % (self.request_version, h.status, h.reason)
|
headers = '%s %s %s\r\n' % (self.request_version, h.status, h.reason)
|
||||||
res += '%s\r\n' % h.msg
|
headers += '%s\r\n' % h.msg
|
||||||
res += h.read()
|
self.request.sendall(headers)
|
||||||
|
|
||||||
|
buf = h.read(4096)
|
||||||
|
while buf != '':
|
||||||
|
self.request.sendall(buf)
|
||||||
|
buf = h.read(4096)
|
||||||
|
|
||||||
|
self.mitm_response(h.recorded(), interceptors)
|
||||||
|
|
||||||
# Let's close off the remote end
|
# Let's close off the remote end
|
||||||
h.close()
|
h.close()
|
||||||
self._proxy_sock.close()
|
self._proxy_sock.close()
|
||||||
|
|
||||||
# Relay the message
|
|
||||||
self.request.sendall(self.mitm_response(res, interceptors))
|
|
||||||
|
|
||||||
|
|
||||||
def mitm_request(self, data, interceptors):
|
def mitm_request(self, data, interceptors):
|
||||||
for i in interceptors:
|
for i in interceptors:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user