Scripting
Paid FeatureScripting rules execute JavaScript scripts written by the user.
Once saved, the scripting rule runs the code and check if global functions onRequest and onResponse exist, both of which are optional. Ongoing flows that match the rule's filter will be wrapped into a JS Object and passed into onRequest and onResponse if any.
If a flow has been passed into either of the two functions, so long as the function didn't return "discard", the flow is considered affected by the rule, even if the function didn’t actually do any changes.
Example
function onRequest(flow) {
let request = flow.request;
let url = request.url;
if (url.host === 'proxie.app' && request.method === 'POST') {
url.pathname = '/test.html';
let form = request.body.form;
if (form != null) {
form.set('username', 'awesome');
flow.log('Changed username to "awesome"');
}
}
}
let count = 1;
function onResponse(flow) {
let url = flow.request.url;
let response = flow.response;
if (url.href === 'https://proxie.app/test.html') {
response.headers.delete('etag');
response.headers.delete('cache-control');
let $ = response.body.html;
$('head > title').text('MitM-ed: ' + count.toString());
count++;
}
}
API Reference
onRequest, onResponse
Parameters
- flow:
Flow
Return Values
undefined: Let the rule apply the changes to the flow.'abort': Abort the connection.'discard': Discard whatever changes were made to the flow in the function.
Flow
Methods
log(String, ...)
Attach to the flow a log, which can later be viewed at the “Log” section in the inspector.
Properties
- request:
HTTPRequest - response optional:
HTTPResponse
request and response are not assignable.
The response property does not exist when onRequest is called. The request property always exists, but mutating it in onResponse does not have any effect.
HTTPRequest
- method:
String - url:
URL - headers:
NameValueCollection - body:
HTTPBody
url, headers and body are not assignable, but you can mutate them by assigning their properties or calling their methods.
Names in headers are case-insensitive.
HTTPResponse
- statusCode:
Number - headers:
NameValueCollection - body:
HTTPBody
headers and body are not assignable, but you can mutate them by assigning their properties or calling their methods.
Names in headers are case-insensitive.
HTTPBody
- text optional:
String - form optional:
NameValueCollection - json optional:
Object - html optional:
Cheerio
These 4 properties might be undefined if not applicable.
html is a cheerio object constructed by Proxie in a manner of cheerio.load(body.text). You can mutate it using jQuery-like APIs.
form and html are not assignable.
NameValueCollection
set(name: String, value: String)
Sets a new value for an existing name, or adds the entry if it does not already exist.
append(name: String, value: String)
Appends a new value onto an existing name, or adds the entry if it does not already exist.
delete(name: String)
Deletes a name and its value(s).
get(name: String): String
Returns the first value associated with a given name.
has(name: String): Boolean
Returns a boolean stating whether a certain name exists.
entries(): [[String, String]]
Returns name/value pairs.
values(): [String]
Returns all the values.
keys(): [String]
Return all the names.