You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
3.3 KiB
105 lines
3.3 KiB
9 years ago
|
import console
|
||
|
import context
|
||
|
import proxy
|
||
|
import string
|
||
|
import subprocess
|
||
|
import tempfile
|
||
|
import http
|
||
|
|
||
|
from twisted.internet import defer
|
||
|
|
||
|
active_requests = {}
|
||
|
|
||
|
intercept_requests = False
|
||
|
intercept_responses = False
|
||
|
|
||
|
def set_intercept_requests(val):
|
||
|
global intercept_requests
|
||
|
intercept_requests = val
|
||
|
|
||
|
def set_intercept_responses(val):
|
||
|
global intercept_responses
|
||
|
intercept_responses = val
|
||
|
|
||
|
@defer.inlineCallbacks
|
||
|
def mangle_request(request, connection_id):
|
||
|
# This function gets called to mangle/edit requests passed through the proxy
|
||
|
global intercept_requests
|
||
|
|
||
|
orig_req = http.Request(request.full_request)
|
||
|
retreq = orig_req
|
||
|
|
||
|
if context.in_scope(orig_req):
|
||
|
if intercept_requests: # if we want to mangle...
|
||
|
# Write original request to the temp file
|
||
|
with tempfile.NamedTemporaryFile(delete=False) as tf:
|
||
|
tfName = tf.name
|
||
|
tf.write(orig_req.full_request)
|
||
|
|
||
|
# Have the console edit the file
|
||
|
yield console.edit_file(tfName)
|
||
|
|
||
|
# Create new mangled request from edited file
|
||
|
with open(tfName, 'r') as f:
|
||
|
mangled_req = http.Request(f.read(), update_content_length=True)
|
||
|
|
||
|
# Check if it changed
|
||
|
if mangled_req.full_request != orig_req.full_request:
|
||
|
# Set the object's metadata
|
||
|
mangled_req.unmangled = orig_req
|
||
|
retreq = mangled_req
|
||
|
|
||
|
# Add our request to the context
|
||
|
context.add_request(retreq)
|
||
|
else:
|
||
|
proxy.log('Out of scope! Request passed along unharmed', id=connection_id)
|
||
|
|
||
|
active_requests[connection_id] = retreq
|
||
|
retreq.submitted = True
|
||
|
defer.returnValue(retreq)
|
||
|
|
||
|
@defer.inlineCallbacks
|
||
|
def mangle_response(response, connection_id):
|
||
|
# This function gets called to mangle/edit respones passed through the proxy
|
||
|
global intercept_responses
|
||
|
#response = string.replace(response, 'cloud', 'butt')
|
||
|
#response = string.replace(response, 'Cloud', 'Butt')
|
||
|
|
||
|
myreq = active_requests[connection_id]
|
||
|
|
||
|
orig_rsp = http.Response(response.full_response)
|
||
|
retrsp = orig_rsp
|
||
|
|
||
|
if context.in_scope(myreq):
|
||
|
if intercept_responses: # If we want to mangle...
|
||
|
# Write original request to the temp file
|
||
|
with tempfile.NamedTemporaryFile(delete=False) as tf:
|
||
|
tfName = tf.name
|
||
|
tf.write(orig_rsp.full_response)
|
||
|
|
||
|
# Have the console edit the file
|
||
|
yield console.edit_file(tfName)
|
||
|
|
||
|
# Create new mangled request from edited file
|
||
|
with open(tfName, 'r') as f:
|
||
|
mangled_rsp = http.Response(f.read(), update_content_length=True)
|
||
|
|
||
|
if mangled_rsp.full_response != orig_rsp.full_response:
|
||
|
mangled_rsp.unmangled = orig_rsp
|
||
|
retrsp = mangled_rsp
|
||
|
|
||
|
if not myreq.reqid:
|
||
|
myreq.save()
|
||
|
if myreq.unmangled:
|
||
|
myreq.unmangled.save()
|
||
|
myreq.response = retrsp
|
||
|
else:
|
||
|
proxy.log('Out of scope! Response passed along unharmed', id=connection_id)
|
||
|
del active_requests[connection_id]
|
||
|
myreq.response = retrsp
|
||
|
context.filter_recheck()
|
||
|
defer.returnValue(myreq)
|
||
|
|
||
|
def connection_lost(connection_id):
|
||
|
del active_requests[connection_id]
|