154 lines
6.2 KiB
Swift
154 lines
6.2 KiB
Swift
//
|
|
// InterceptFetchRequestsJS.swift
|
|
// flutter_inappwebview
|
|
//
|
|
// Created by Lorenzo Pichilli on 16/02/21.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
let INTERCEPT_FETCH_REQUEST_JS_PLUGIN_SCRIPT_GROUP_NAME = "IN_APP_WEBVIEW_INTERCEPT_FETCH_REQUEST_JS_PLUGIN_SCRIPT"
|
|
let FLAG_VARIABLE_FOR_SHOULD_INTERCEPT_FETCH_REQUEST_JS_SOURCE = "window.\(JAVASCRIPT_BRIDGE_NAME)._useShouldInterceptFetchRequest"
|
|
|
|
let INTERCEPT_FETCH_REQUEST_JS_PLUGIN_SCRIPT = PluginScript(
|
|
groupName: INTERCEPT_FETCH_REQUEST_JS_PLUGIN_SCRIPT_GROUP_NAME,
|
|
source: INTERCEPT_FETCH_REQUEST_JS_SOURCE,
|
|
injectionTime: .atDocumentStart,
|
|
forMainFrameOnly: false,
|
|
requiredInAllContentWorlds: true,
|
|
messageHandlerNames: [])
|
|
|
|
let INTERCEPT_FETCH_REQUEST_JS_SOURCE = """
|
|
\(FLAG_VARIABLE_FOR_SHOULD_INTERCEPT_FETCH_REQUEST_JS_SOURCE) = true;
|
|
(function(fetch) {
|
|
if (fetch == null) {
|
|
return;
|
|
}
|
|
window.fetch = async function(resource, init) {
|
|
if (\(FLAG_VARIABLE_FOR_SHOULD_INTERCEPT_FETCH_REQUEST_JS_SOURCE) == null || \(FLAG_VARIABLE_FOR_SHOULD_INTERCEPT_FETCH_REQUEST_JS_SOURCE) == true) {
|
|
var fetchRequest = {
|
|
url: null,
|
|
method: null,
|
|
headers: null,
|
|
body: null,
|
|
mode: null,
|
|
credentials: null,
|
|
cache: null,
|
|
redirect: null,
|
|
referrer: null,
|
|
referrerPolicy: null,
|
|
integrity: null,
|
|
keepalive: null
|
|
};
|
|
if (resource instanceof Request) {
|
|
fetchRequest.url = resource.url;
|
|
fetchRequest.method = resource.method;
|
|
fetchRequest.headers = resource.headers;
|
|
fetchRequest.body = resource.body;
|
|
fetchRequest.mode = resource.mode;
|
|
fetchRequest.credentials = resource.credentials;
|
|
fetchRequest.cache = resource.cache;
|
|
fetchRequest.redirect = resource.redirect;
|
|
fetchRequest.referrer = resource.referrer;
|
|
fetchRequest.referrerPolicy = resource.referrerPolicy;
|
|
fetchRequest.integrity = resource.integrity;
|
|
fetchRequest.keepalive = resource.keepalive;
|
|
} else {
|
|
fetchRequest.url = resource != null ? resource.toString() : null;
|
|
if (init != null) {
|
|
fetchRequest.method = init.method;
|
|
fetchRequest.headers = init.headers;
|
|
fetchRequest.body = init.body;
|
|
fetchRequest.mode = init.mode;
|
|
fetchRequest.credentials = init.credentials;
|
|
fetchRequest.cache = init.cache;
|
|
fetchRequest.redirect = init.redirect;
|
|
fetchRequest.referrer = init.referrer;
|
|
fetchRequest.referrerPolicy = init.referrerPolicy;
|
|
fetchRequest.integrity = init.integrity;
|
|
fetchRequest.keepalive = init.keepalive;
|
|
}
|
|
}
|
|
if (fetchRequest.headers instanceof Headers) {
|
|
fetchRequest.headers = \(JAVASCRIPT_UTIL_VAR_NAME).convertHeadersToJson(fetchRequest.headers);
|
|
}
|
|
fetchRequest.credentials = \(JAVASCRIPT_UTIL_VAR_NAME).convertCredentialsToJson(fetchRequest.credentials);
|
|
return \(JAVASCRIPT_UTIL_VAR_NAME).convertBodyRequest(fetchRequest.body).then(function(body) {
|
|
fetchRequest.body = body;
|
|
return window.\(JAVASCRIPT_BRIDGE_NAME).callHandler('shouldInterceptFetchRequest', fetchRequest).then(function(result) {
|
|
if (result != null) {
|
|
switch (result.action) {
|
|
case 0:
|
|
var controller = new AbortController();
|
|
if (init != null) {
|
|
init.signal = controller.signal;
|
|
} else {
|
|
init = {
|
|
signal: controller.signal
|
|
};
|
|
}
|
|
controller.abort();
|
|
break;
|
|
}
|
|
if (result.body != null && !\(JAVASCRIPT_UTIL_VAR_NAME).isString(result.body) && result.body.length > 0) {
|
|
var bodyString = \(JAVASCRIPT_UTIL_VAR_NAME).arrayBufferToString(result.body);
|
|
if (\(JAVASCRIPT_UTIL_VAR_NAME).isBodyFormData(bodyString)) {
|
|
var formDataContentType = \(JAVASCRIPT_UTIL_VAR_NAME).getFormDataContentType(bodyString);
|
|
if (result.headers != null) {
|
|
result.headers['Content-Type'] = result.headers['Content-Type'] == null ? formDataContentType : result.headers['Content-Type'];
|
|
} else {
|
|
result.headers = { 'Content-Type': formDataContentType };
|
|
}
|
|
}
|
|
}
|
|
resource = result.url;
|
|
if (init == null) {
|
|
init = {};
|
|
}
|
|
if (result.method != null && result.method.length > 0) {
|
|
init.method = result.method;
|
|
}
|
|
if (result.headers != null && Object.keys(result.headers).length > 0) {
|
|
init.headers = \(JAVASCRIPT_UTIL_VAR_NAME).convertJsonToHeaders(result.headers);
|
|
}
|
|
if (\(JAVASCRIPT_UTIL_VAR_NAME).isString(result.body) || result.body == null) {
|
|
init.body = result.body;
|
|
} else if (result.body.length > 0) {
|
|
init.body = new Uint8Array(result.body);
|
|
}
|
|
if (result.mode != null && result.mode.length > 0) {
|
|
init.mode = result.mode;
|
|
}
|
|
if (result.credentials != null) {
|
|
init.credentials = \(JAVASCRIPT_UTIL_VAR_NAME).convertJsonToCredential(result.credentials);
|
|
}
|
|
if (result.cache != null && result.cache.length > 0) {
|
|
init.cache = result.cache;
|
|
}
|
|
if (result.redirect != null && result.redirect.length > 0) {
|
|
init.redirect = result.redirect;
|
|
}
|
|
if (result.referrer != null && result.referrer.length > 0) {
|
|
init.referrer = result.referrer;
|
|
}
|
|
if (result.referrerPolicy != null && result.referrerPolicy.length > 0) {
|
|
init.referrerPolicy = result.referrerPolicy;
|
|
}
|
|
if (result.integrity != null && result.integrity.length > 0) {
|
|
init.integrity = result.integrity;
|
|
}
|
|
if (result.keepalive != null) {
|
|
init.keepalive = result.keepalive;
|
|
}
|
|
return fetch(resource, init);
|
|
}
|
|
return fetch(resource, init);
|
|
});
|
|
});
|
|
} else {
|
|
return fetch(resource, init);
|
|
}
|
|
};
|
|
})(window.fetch);
|
|
"""
|